python - 2D fft - 空虚部

标签 python c++ image algorithm fft

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

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

F_BLK=np.fft.fft2(blk)

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

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

  • 如果 fft2 的虚部为零意味着什么
  • 此类错误结果的可能来源是什么?
  • 您会推荐一个 C++ 库来计算 fft2 吗?

最佳答案

  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
    • 它包含 C++ 中的慢速 1D DFT、iDFT 实现(R->CC->R)
    • 以及如何用它计算二维变换的算法
    • 有正确的结果,所以你可以检查你的

关于python - 2D fft - 空虚部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359433/

相关文章:

python - Docker 内 python 货架中的错误魔数(Magic Number)

python - 如何从新闻摘要中提取股票代码NUMBER?

c++ - const int function(); 之间的区别和 int func() 常量;

css - 在响应式设计中,文本不会环绕在图像下方

C++ Opengl 渲染图像的一部分

javascript - Quill编辑器+VueJS2图片上传: Base64 image to URL

python - 获取函数的 'namespace path'

python - 如何制作非方形等高线图

c++ - OpenGL glutInit() : XOpenDisplay() causing segmentation fault

c++ - RegQueryValueEx 给出奇怪的数据