我正在使用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.但是即使在使用数组的总大小进行标准化之后,我在输出数组中获得所有不同的值。可能是什么原因?
答案 0 :(得分:1)
当涉及到多维DFT和复杂到真实的变换时,FFTW并不是那么简单。
当对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变换上。
由于精度有限,由于DFT的数值实现,由于非随机醉酒位,即使它们非常小,也可以获得非0的值。这是FFT算法的正常行为。
除了仔细阅读用户手册(http://www.fftw.org/doc/)之外,即使它真的很痛苦(我为了让3D变换工作而在这个库周围丢失了几天,只是为了理解数据的缩放方式)< / p>
不要犹豫,为你的问题增加精确度,祝你好运FFTW
答案 1 :(得分:0)
有了这些小信息,很难说清楚。我可以想象的是,由于窗口选择会导致频谱泄漏(有关泄漏的详细信息,请参阅This Wikipedia article。)
您可以尝试使用其他窗口功能来减少泄漏或重新定义窗口大小。