1

我正在使用 C++ 函数来查找傅里叶逆变换。

int inYSize = 170; int inXSize = 2280;

float* outData = new float[inYSize*inXSize];
fftwf_plan mReverse = fftwf_plan_dft_c2r_2d(inYSize, inXSize,(fftwf_complex*)temp, outdata,  
FFTW_ESTIMATE);
fftwf_execute(mReverse);

我的输入是带有复数的二维数组 temp。所有元素的实数为 1,虚数为 0。

所以我期望InverseFFT这样的数组应该是具有实际值的二维数组。输出数组的 SPIKE 应该为 0,0 并且所有值都为 0。但是即使在使用数组的总大小进行归一化之后,我也会在输出数组中获得所有不同的值。可能是什么原因?

4

2 回答 2

2

当涉及到多维 DFT 和复数到实数变换时,FFTW 并不是那么容易处理的。

  1. 在对 MxN 行主要数组进行 C2R 变换时,由于结果的对称性,第二维被减半:outData比需要的大两倍,但这不是您的问题的原因(而不是您的情况你在做 C2R 而不是 R2C)。关于这个曲折问题的更多信息:http ://www.fftw.org/doc/One_002dDimensional-DFTs-of-Real-Data.html

    “好人建议”:仅使用 C2C“更简单”的做事方式,如果您不知道如何处理结果,请取输出的模数,但不要将时间浪费在 nD Complex to Real 转换上。

  2. 由于精度有限,由于 DFT 的数值实现,由于无从属的醉酒位,即使非常小,也可以获得不为 0 的值。这是 FFT 算法的正常行为。

除了仔细阅读用户手册(http://www.fftw.org/doc/),即使它真的很痛苦(我在这个库中浪费了几天时间,只是为了让 3D 转换工作,只是为了了解数据是如何缩放的)

  • 在进行 C2C 2D 和 C2R 2D 之前,您应该尝试使用 C2C 1D 转换,以确保您以某种方式了解自己在做什么。
  • 什么是平面常数的逆 FFT,其中“频率平面”的每个 bin 都填充了一个?您是否正在寻找定义 +inf 或 -inf 的新方法?在这种情况下,我宁愿从更容易除以 0 ^^ 开始。如您所描述的,直接 FFT 应该是 a,正确缩放的 SPIKE 为 1,很确定相反不是。

不要犹豫,为您的问题增加精确度,祝您好运 FFTW

于 2013-04-24T22:24:55.023 回答
0

有了这么少的信息,很难说清楚。我可以想象的是,由于窗口选择,您会出现频谱泄漏(有关泄漏的详细信息,请参阅此 Wikipedia 文章)。

您可以做的是尝试使用另一个窗口函数来减少泄漏或重新定义窗口大小。

于 2013-04-24T20:01:21.630 回答