傅里叶逆变换FFT3W 我用C++函数求逆傅立叶变换。< /P> 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数组临时值。所有元素的实值为1,虚值为0傅里叶逆变换FFT3W 我用C++函数求逆傅立叶变换。< /P> 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);,c++,fft,fftw,ifft,C++,Fft,Fftw,Ifft,我的输入是带有复数的2D数组临时值。所有元素的实值为1,虚值为0 所以我期望这样一个数组的InverseFFT应该是具有实值的2D数组。输出数组的峰值应为0,0,其余所有值均为0。但我在输出数组中得到了所有不同的值,即使在使用数组的总大小进行规范化之后也是如此。原因可能是什么?有了这些小信息,很难说。我所能想象的是,由于窗口选择,会出现光谱泄漏(有关泄漏的详细信息,请参阅) 您可以尝试使用另一个窗口函数来减少泄漏或重新定义窗口大小。FFTW在涉及多维DFT和复到实变换时不是那么容易处理的 int
所以我期望这样一个数组的
InverseFFT
应该是具有实值的2D数组。输出数组的峰值应为0,0,其余所有值均为0。但我在输出数组中得到了所有不同的值,即使在使用数组的总大小进行规范化之后也是如此。原因可能是什么?有了这些小信息,很难说。我所能想象的是,由于窗口选择,会出现光谱泄漏(有关泄漏的详细信息,请参阅)
您可以尝试使用另一个窗口函数来减少泄漏或重新定义窗口大小。FFTW在涉及多维DFT和复到实变换时不是那么容易处理的
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);
outData
比需要的大两倍,但这并不是问题的原因(也不是你在做C2R而不是R2C)。
有关这一棘手问题的更多信息:
“好人建议”:只使用C2C“更简单”的方式做事,如果你不知道如何处理结果,则取输出的模数,但不要在n-D复杂到真实的转换上浪费时间- 在使用C2C 2D和C2R 2D之前,您应该尝试使用C2C 1D转换,以确保您对自己正在做的事情有一定的了解
- 平面常数的逆FFT是什么?在“频率平面”的每一个单元中都填充一个?您正在寻找定义+inf或-inf的新方法吗?在这种情况下,我宁愿从更简单的0^除法开始。正如您所描述的,直接FFT应该是a,尖峰正确缩放为1,非常确定反向不是
请毫不犹豫地为您的问题添加精确性,祝您好运FFTW有价值的评论,但我不同意您的+/-inf观点:如果是DTFT而不是DFT,我们有连续频率和离散时间,我们会得到inf。但由于DFT在两个轴上都是离散的,我们将最大限度地得到数组的大小,而不是+FN。无论如何,它更多地是DSP,我基本上是问C++相关的帮助,你的前两点将帮助我。谢谢你:)。您可能还想检查您使用的数据类型是否能够处理输出,即使10^+38看起来还可以,Double可能会给出不同的行为(?)如果您认为我的答案对您有所帮助,接受它会非常好:)