逆傅立叶变换FFT3W

时间:2013-04-24 18:36:34

标签: c++ fft fftw ifft

我正在使用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);

我输入的是具有复数的二维数组临时值。所有元素都有实数值1和虚数0。

所以我期待InverseFFT这样的数组应该是具有实数值的2D数组。输出数组应该具有0,0的SPIKE并且保持所有值0.但是即使在使用数组的总大小进行标准化之后,我在输出数组中获得所有不同的值。可能是什么原因?

2 个答案:

答案 0 :(得分:1)

当涉及到多维DFT和复杂到真实的变换时,FFTW并不是那么简单。

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

    " Good Guy Advice" :只使用C2C"更容易"如果你不知道如何处理结果,那就采取输出模数,但不要把时间花在n-D Complex to Real变换上。

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

  3. 除了仔细阅读用户手册(http://www.fftw.org/doc/)之外,即使它真的很痛苦(我为了让3D变换工作而在这个库周围丢失了几天,只是为了理解数据的缩放方式)< / p>

    • 在进入C2C 2D和C2R 2D之前,你应该尝试使用C2C 1D变换,以确保你能够以某种方式了解你正在做什么。
    • 什么是平面常数的逆FFT,其中&#34;频率平面&#34;充满了一个?您在寻找定义+ inf或-inf的新方法吗?在那种情况下,我宁愿从0 ^^开始更容易的划分。直接FFT应该如你所描述的那样,SPIKE正确缩放为1,非常确定反之亦然。

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

答案 1 :(得分:0)

有了这些小信息,很难说清楚。我可以想象的是,由于窗口选择会导致频谱泄漏(有关泄漏的详细信息,请参阅This Wikipedia article。)

您可以尝试使用其他窗口功能来减少泄漏或重新定义窗口大小。