快速傅里叶变换C++完整实现(包括FFT、IFFT & FFTShift)
图像处理中经常用到快速傅里叶变换(FFT),使用Matlab命令fft
或fft2
很容易实现快速傅里叶变换,由于Matlab/C++混合编程接口性能太差,实际项目中使用C++实现具有更高的性能。
网上有不少关于快速傅里叶变换的C++实现方式,要么实验结果和Matlab运算结果不一样(我们通常使用Matlab做实验,验证算法可行性),要么算法不完整,却少逆变换或者频率对齐函数(fftshift
)。本文程序实现了所有程序,包括正变换、逆变换,以及频率对齐函数。
1、正变换(FFT
)void ImgFFT2D(unsigned char* imgBuf, int width, int height,unsigned char *imgBufOut,ComplexNumber *m_pFFTBuf)
形参解释
(1)unsigned char* imgBuf
:图像输入矩阵,二维转成一维后显示;
(2)int width
:图像宽度;
(3)int height
:图像高度;
(4)unsigned char *imgBufOut
:傅里叶变换后频谱图像输出;
(5)ComplexNumber *m_pFFTBuf
:傅里叶变换后系数;ComplexNumber
:复数类型
struct ComplexNumber
{
float imag; //虚部
float real; //实部
};
通常图像在傅里叶域处理就是对傅里叶变换系数进行处理,再进行逆变换得到处理后的结果。