傅里叶逆变换FFT3W
Posted
技术标签:
【中文标题】傅里叶逆变换FFT3W【英文标题】:inverse fourier transform FFT3W 【发布时间】:2013-04-24 18:36:33 【问题描述】:我正在使用 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);
我的输入是带有复数的二维数组 temp。所有元素的实数为 1,虚数为 0。
所以我期待这样一个数组的InverseFFT
应该是具有实际值的二维数组。输出数组的 SPIKE 应该在 0,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 上真正的变换。
由于精度有限,由于DFT的数值实现,由于不从属的醉酒位,即使很小,也可以获得不为0的值。这是 FFT 算法的正常行为。
除了仔细阅读用户手册 (http://www.fftw.org/doc/),即使它真的很痛苦(我在这个库中浪费了几天时间,只是为了让 3D 转换工作,只是为了了解数据是如何缩放的)
在进行 C2C 2D 和 C2R 2D 之前,您应该尝试使用 C2C 1D 转换,以确保您对自己在做什么有所了解。 什么是平面常数的逆 FFT,其中“频率平面”的每个 bin 都填充了一个?您是否正在寻找定义 +inf 或 -inf 的新方法?在那种情况下,我宁愿从更容易除以 0 ^^ 开始。直接 FFT 应该是如您所描述的那样,正确缩放的 SPIKE 为 1,很确定相反不是。不要犹豫,为您的问题添加精确度,祝您好运 FFTW
【讨论】:
很有价值的 cmets,但是我不同意您的 +/-inf 的说法:如果它是 DTFT 而不是 DFT,我们有连续的频率和离散的时间,我们就会得到 INF。但是由于 DFT 在两个轴上都是离散的,我们最多会得到数组的总大小而不是 +inf。无论如何,它更多的是 DSP,我基本上是在寻求与 C++ 相关的帮助,你的前两点会对我有所帮助。谢谢 无意冒犯:)。您可能还想检查您使用的数据类型是否可以处理输出,即使 10^+38 看起来没问题,双打可能会产生不同的行为 (?) 如果您认为我的回答对您有所帮助,接受它会非常好:)【参考方案2】:有了这么少的信息,很难说清楚。我可以想象的是,由于窗口选择,您会出现频谱泄漏(有关泄漏的详细信息,请参阅This Wikipedia article)。
您可以尝试使用另一个窗口函数来减少泄漏或重新定义窗口大小。
【讨论】:
以上是关于傅里叶逆变换FFT3W的主要内容,如果未能解决你的问题,请参考以下文章