傅里叶反变换FFT3W



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

我的输入是2D数组temp与复数。所有元素的实数为1,虚数为0。

所以我期望这样一个数组的InverseFFT应该是具有实数的二维数组。输出数组应该在0,0处有SPIKE,其余所有值都为0。但是我在输出数组中得到了所有不同的值,即使在对数组的总大小进行规范化之后。原因是什么呢?

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

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

    "好人建议":只使用C2C"更容易"的方式做事,如果你不知道如何处理结果,取输出的模数,但不要浪费你的时间在n-D Complex到Real变换上。

  2. 因为有限的精度,因为DFT的数值实现,因为非从属醉位,你可以得到不为0的值,即使它们非常小。

除了仔细阅读用户手册(http://www.fftw.org/doc/),即使它是一个真正的痛苦(我失去了几天围绕这个库只是为了得到一个3D变换工作,只是为了了解数据是如何缩放的)

  • 你应该在去C2C 2D和C2R 2D之前尝试C2C 1D变换,只是为了确保你对你在做什么有某种想法。
  • 平面常数的逆FFT是什么?"频率平面"的每个bin都充满了1 ?您正在寻找一种定义+inf或-inf的新方法吗?在这种情况下,我宁愿从简单的除以0 ^^开始。直接FFT应该是a,正如你所描述的,SPIKE正确缩放为1,很确定逆不是。

不要犹豫,给你的问题加上精确度,祝你在FFTW上好运

仅凭这一点信息很难判断。我能想象的是,由于窗口选择,你会得到光谱泄漏(参见这篇维基百科文章,了解有关泄漏的详细信息)。

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

相关内容

  • 没有找到相关文章

最新更新