傅里叶逆变换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的主要内容,如果未能解决你的问题,请参考以下文章

2021-05-21 Matlab实现快速傅里叶逆变换

制作一个函数来进行傅里叶逆变换

音频算法入门-傅里叶变换

仅具有幅度的傅里叶逆变换 - 我也需要相位吗?

[Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

傅里叶变换的结论汇总