【问题标题】:2D fft - Null imaginary part2D fft - 空虚部
【发布时间】:2014-08-18 08:50:58
【问题描述】:

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

有一些实矩阵的fft 2D的计算,在Python中使用

F_BLK=np.fft.fft2(blk)

F_BLK 是一个复数 512*24 矩阵,系数与实部和虚部复数,数量级为 10e5。

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

  • 如果 fft2 的虚部为空,这意味着什么
  • 这些错误结果的可能来源是什么?
  • 您会推荐一个用于计算 fft2 的 C++ 库吗?

【问题讨论】:

  • 我添加了答案,但没有关于您的 FFT 数据和实现的更多信息,这一切都只是有根据的猜测......

标签: python c++ image algorithm fft


【解决方案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,DCT by 1D FFT,DCT
    • 它包含慢速一维 DFT、C++ 中的 iDFT 实现 (R->C,C->R)
    • 以及如何使用它计算 2D 变换的算法
    • 结果正确,以便您检查自己的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2012-07-05
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多