2013-04-24 167 views
1

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

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应该是具有实数值的二维数组。输出数组应该具有SPIKE为0,0并且保留所有值为0.但是,即使在使用数组的总大小规范化之后,我仍然会在输出数组中获得所有不同的值。可能是什么原因?

回答

0

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

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

1

当涉及到多维DFT和复数到实数变换时,FFTW并不是微不足道的。

  1. 在做一个C2R一个M×N的行主阵列的变换,第二维是减少了一半,因为结果的对称性:outData比需要的大两倍,但它不是你的问题的原因(而不是你正在做C2R而不是R2C)。 http://www.fftw.org/doc/One_002dDimensional-DFTs-of-Real-Data.html

    “好人忠告”: 这个曲折的事情更多信息只能使用C2C“易”的做事方式,采取输出的模数,如果你不知道如何处理的结果,但不要浪费你的时间在nD Complex上进行Real转换。

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

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

  • 在进行C2C 2D和C2R 2D之前,您应该尝试进行C2C 1D变换,以确保您知道自己在做什么。
  • 什么是平面常数的逆FFT,其中“频率平面”的每个bin填充了一个?你在寻找一种定义+ inf或-inf的新方法吗?在那种情况下,我宁愿从0 ^^开始分割。正如你所描述的那样,直接FFT应该是正确的,SPIKE正确缩放为1,非常确定倒数不是。

不要犹豫,精确添加到您的问题,祝你好运与FFTW

+1

好宝贵的意见,但我却不会和你+/- INF件事同意:如果它本来不是DFT DTFT我们有持续的频率和离散时间,我们会得到INF。但由于DFT在两个轴上都是离散的,所以我们最大将获得数组的总大小而不是+ inf。无论如何,它是更多的DSP,我基本上要求C + +相关的帮助,你的前两个点将帮助我。谢谢 – MShah 2013-04-25 00:48:25

+0

没有任何意图:)。您可能还想检查您使用的数据类型是否可以处理输出,即使10^+ 38似乎没问题,双打可能会给出不同的行为(?) – Pascail 2013-04-25 08:10:07

+0

如果您认为我的答案以某种方式帮助了您,接受它会真的很好:) – Pascail 2013-05-03 12:03:41