2D fft - 空虚部分

时间:2014-08-18 08:50:58

标签: python c++ image algorithm fft

我正在将Python例程集成到C ++代码中。

使用Python

计算一些真实矩阵的fft 2D
F_BLK=np.fft.fft2(blk)

F_BLK是一个复杂的512 * 24矩阵,系数与real和imag部分复杂,数量级为10e5。

当我用C ++计算矩阵的fft2时,我得到一个复系数,其复系数,实数部分的数量级为10e6,虚部为

  • 如果fft2有虚部 ,这是什么意思?
  • 这种错误结果的可能来源是什么?
  • 您是否会推荐使用C ++中的一个库来计算fft2?

1 个答案:

答案 0 :(得分:1)

  1. 如果您使用FFT的实数输入

    • 那么你不需要那么多的计算(C + = R * C比C + = C * C更简单)
    • 所以,如果你为这样的输入数据编码FFT C = f(R),那么它通常会更快
    • 然后标准FFT C = f(C)
    • 并且您也不需要为输入虚部分配内存
    • 当输入数据仅为实数时,则FFT输出是对称的
    • 因此,您只能计算输出数据的前半部分并镜像其余部分
  2. 幅度差异

    • 你有错误的FFT实现(在python或C ++中)
    • 或者你只是有不同的归一化系数
    • 绘制数据并比较差异是否只是恒定比例因子
    • 如果没有,那么你在某处的FFT实现中存在错误,或者python FFT不是FFT
    • 也不要忘记任何FFT的数据大小必须是2
    • 的幂
    • 如果您的实现期望那么那也可能是错误的原因
    • 因此尝试在FFT
    • 之前通过零填充将矩阵512x24的大小调整为512x32
    • 可能导致此问题的另一件事可能是溢出错误
    • 如果你将大小数字混合在一起,你的准确性就会丢失
    • 特别是通过FFT递归,输出幅度可以是10e5,但子结果可以大得多!!!
  3. 2D FFT

    • 看这里2D FFT,DCT by 1D FFT,DCT
    • 它包含慢速1D DFT,C ++中的iDFT实现(R->CC->R
    • 和算法如何用它计算2D变换
    • 正确的结果,以便您可以查看你的