fftw 来自幅度和相位阵列的 C++ 逆二维 FFT

Posted

技术标签:

【中文标题】fftw 来自幅度和相位阵列的 C++ 逆二维 FFT【英文标题】:fftw C++ inverse 2D FFT from magnitude and phase arrays 【发布时间】:2013-04-17 20:28:22 【问题描述】:

使用 FFTW 实现 2D FFT/IFFT。

目前我使用 SFML 加载了一个图像,并使用 fftw_plan_dft_2d 将其分解为幅度和相位分量。

一切正常,我已经对照已知的工作软件检查了我的震级图像,结果是正确的。 (Forward FFT)

我已经通过使用第一个 FFT 的实部和虚部输出直接从正向 FFT (Inverse FFT) 直接执行反向 2D FFT 来检查 ifft 是否正常工作(在某处也存在问题,但那是另一天)

我更感兴趣的是我应该重新组合幅度和相位以形成实数和复数部分以执行 IFFT。

谷歌返回了很多 MATLAB 的东西,我完全不明白,因此并没有真正的帮助。

旁注:数学不是我的强项。这就是为什么我觉得我有点挣扎。请尽可能解释为我是 10 岁!

【问题讨论】:

您所说的“我应该重新组合幅度和相位以形成实数和复数部分以执行 IFFT 的方式是什么意思?”你是说你想手动而不是使用 FFTW 的实现吗? (为什么?)你是说你不知道使用哪个功能?你是说你想先操纵它们,然后使用 FFTW 的 IFFT? (请注意,FFT 只是 DFT 的一种快速算法。您可以搜索 I/DFT 的公式,它比 FFT 更易于描述,例如,here。) 我的意思是我认为逆 FFT 需要实数和复数,但我所拥有的只是幅度和相位值。 Paul 的答案是我一直在寻找的,如何从幅度和相位中获取实部和虚部。 【参考方案1】:

首先将幅度和相位值转换回复数(实数 + 虚数):

re = mag * cos(phi);
im = mag * sin(phi);

然后对这些复数值进行逆 FFT。

【讨论】:

我已经通过循环使用来完成这项工作:input[i][0] = fftMag[i] * cos(fftPhase[i])input[i][1] = fftMag[i] * sin(fftPhase[i]) 感谢您的回复!

以上是关于fftw 来自幅度和相位阵列的 C++ 逆二维 FFT的主要内容,如果未能解决你的问题,请参考以下文章

matlab绘制图像的幅度谱 相位谱

用 C++ 绘制图像的光谱(fftw,OpenCV)

对图像进行二维离散Fourier变换

傅里叶变换 傅里叶逆变换 python

求matlab周期三角波信号频谱分析的代码,能画出三角波信号、幅度谱和相位谱。

FFTW 从 numpy.fft 产生不同的结果