我正在将 Python 例程集成到 C++ 代码中。
有一些实矩阵的 fft 2D 的计算,在 Python 中使用
F_BLK=np.fft.fft2(blk)
F_BLK
是一个复数 512*24 矩阵,实部和虚部的系数为 10e5 数量级的复数。
当我在 C++ 中计算矩阵的 fft2 时,我得到一个具有复数系数的复数矩阵实部的数量级为 10e6,虚部为零。
- 如果 fft2 的虚部为零意味着什么?
- 此类错误结果的可能来源是什么?
- 您会推荐一个 C++ 库来计算 fft2 吗?
最佳答案
如果您对 FFT 使用实数输入
- 那么你就不需要那么多的计算了(C += R * C比C += C * C简单)
- 因此,如果您对此类输入数据进行 FFT C = f(R) 编码,那么它通常会更快
- 然后是标准 FFT C= f(C)
- 而且你不需要为输入虚部分配内存
- 同样,只有当输入数据是真实的时,FFT 输出才是对称的
- 所以你可以只计算输出数据的前半部分并镜像其余部分
幅度差异
- 要么你有错误的 FFT 实现(在 python 或 C++ 中)
- 或者你只是有不同的归一化系数
- 绘制数据并比较差异是否只是常数比例因子
- 如果不是,那么你在某处的 FFT 实现中有错误,或者 python FFT 不是 FFT
- 也不要忘记任何 FFT 的数据大小必须是 2 的幂
- 如果您的实现期望如此,那么这也可能是错误的原因
- 因此尝试在 FFT 之前通过零填充将矩阵 512x24 调整为 512x32
- 可能导致这种情况的另一件事是溢出错误
- 如果你把大数和小数混合在一起,你的准确性就会降低
- 特别是通过 FFT 递归,输出幅度可以是 10e5,但子结果可以大得多!!!
二维傅里叶变换
- 看这里2D FFT,DCT by 1D FFT,DCT
- 它包含 C++ 中的慢速 1D DFT、iDFT 实现(
R->C
、C->R
) - 以及如何用它计算二维变换的算法
- 有正确的结果,所以你可以检查你的
关于python - 2D fft - 空虚部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359433/