【问题标题】:FFTW - computing real 2D FFT, special requirementsFFTW - 计算真正的 2D FFT,特殊要求
【发布时间】:2013-01-12 10:37:45
【问题描述】:

我正在使用 FFTW3 在 c++ 中计算 2D 实际 FFT。我已经阅读了手册,但有一些问题。来自手册:http://www.fftw.org/fftw3_doc/One_002dDimensional-DFTs-of-Real-Data.html#One_002dDimensional-DFTs-of-Real-Data

为了换取这些速度和空间优势,用户牺牲 FFTW 复杂变换的一些简单性。首先, 输入和输出数组的大小和类型不同:输入是 n 个实数,而输出是 n/2+1 个复数( 非冗余输出);这也需要轻微的“填充” 就地转换的输入数组。二、逆变换 (复数到实数)具有覆盖其输入数组的副作用, 默认。这些不便都不应该造成严重的 用户的问题,但重要的是要意识到他们。

  1. 我知道我需要将输入的 2D 矩阵转换为行顺序的 1D 向量。但是输出是什么样子的? n/2 + 1 个数字是什么意思?换句话说,如何重新排序输出以获得二维矩阵?

  2. 我需要做些什么来创建这个“填充”?

【问题讨论】:

  • 嗯。在我使用的其他一些 FFT 库中,奈奎斯特值只是打包到 X_0 的虚部(直流偏移)中,因为这两个值都是实数。然后填充是不必要的。显然 FFTW 不这样做。
  • 仅供参考,such packing [..] does not generalize well to multi-dimensional transforms。详情见this FFTW doc倒数第二段。

标签: c++ fft fftw


【解决方案1】:
  1. 如果您的输入已经在一个普通的 C++ 2D 数组中,您需要做的就是对它进行类型转换:

    double twoDarray[10][10];
    double *oneDarrayPointer = (double *)twoDarray;
    

    如果您的输入是 100(如上例所示),您的输出数组将是 51 个复数。这些数字的格式应由您的库描述,但可能是 102 个 doubles 的数组 - 51 个条目乘以 2(实部/虚部)。

    编辑:已确认 - fftw_complex 定义为:

    typedef double fftw_complex[2];
    

    所以它们只是连续的doubles 对,代表复数的实部和虚部。

  2. 如果您不想就地执行此操作,则无需填充任何内容 - 只需分配适当大小的输出数组即可。如果您确实需要在适当的位置进行操作,那么您的输入缓冲区必须有空间容纳 2 个额外的双精度值与输入大小。假设上面的声明,你会想要这样的:

    double *inPlaceFFTPointer = malloc(sizeof twoDarray + 2*sizeof(double));
    memcpy(inPlaceFFTPointer, oneDarrayPointer, sizeof twoDarray);
    

    我不确定您是否需要确保在最后两个条目中包含 0.0,但这很容易添加。

【讨论】:

  • 您可以使用 C++ std::complex 以及 C 风格或上述 typedef 与 FFTW
  • @pyCthon,是的。我认为它们在内存中几乎都是一样的。
  • “所以它们只是连续的双精度对,代表复数的实部和虚部。”对,但为什么只有 51 个?为什么不是100? 2D FFT 不是输出与输入相同大小的矩阵吗?
  • 来自您帖子中的链接:“在许多实际应用中,[i] 中的输入数据是纯实数,在这种情况下,DFT 输出满足“Hermitian”冗余:out[i]out[n-i] 的共轭。”因此,如果您愿意,您只需要获得一半的输出即可生成所有输出。
  • 我有点理解。这有助于我理解视觉对称性:“您可能会开始注意到存在很多对称性。对于所有真实(与想象或复杂)图像相比,FT 关于原点对称,因此第一和第三象限相同并且第 2 和第 4 象限是相同的。如果图像关于 x 轴对称(如余弦图像),则结果为 4 倍对称。 cs.unm.edu/~brayer/vision/fourier.html
【解决方案2】:

您可以看看 FFTW3 中的真实到真实的转换,它完全符合您的要求。这些不需要填充,并考虑到波数 0 和代表奈奎斯特频率的波数都只有一个实分量。看看这里:

FFTW3 Real-to-Real Transforms

对于内存中的布局:

FFTW3 Real-to-Real Transform Kinds

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多