快速傅里叶变换C++完整实现(包括FFT、IFFT & FFTShift)

发布时间:2019-06-12 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了快速傅里叶变换C++完整实现(包括FFT、IFFT & FFTShift)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

图像处理中经常用到快速傅里叶变换(FFT),使用Matlab命令fftfft2很容易实现快速傅里叶变换,由于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;  //实部
};

通常图像在傅里叶域处理就是对傅里叶变换系数进行处理,再进行逆变换得到处理后的结果。

2、逆变换(IFFT
void ImgIFFT2D(unsigned char* imgBufOut, int width, int height,ComplexNumber *m_pFFTBuf)
形参解释
(1)unsigned char* imgBufOut:图像输出矩阵,逆变换结果;
(2)int width:图像宽度;
(3)int height:图像高度;
(4)ComplexNumber *m_pFFTBuf:傅里叶变换系数;

3、频率对齐函数(fftshift
fftshift的作用正是让正轴部分和负半轴部分的图像分别关于各自的中心对称,因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来。具体实现,每一行后半部分移到前半部分,每一列后半部分移到前半部分。
void FFTShift(int width,int height,ComplexNumber *m_pFFTBuf)
形参解释
(1)int width:图像宽度;
(2)int height:图像高度;
(3)ComplexNumber *m_pFFTBuf:傅里叶变换系数,同时输出结果;

4、频域内卷积操作
void FourierTrans(unsigned char **imginput,double **mtfInput ,unsigned char **imgBufout,int pWidth,int pHeight)
形参解释
(1)unsigned char **imgInput:输入图像;
(2)double **mtfInput:卷积模版;
(3)unsigned char **imgBufout:输出后结果;
(4)int pWidth:图像高度
(5)int pHeight:图像宽度

附件
1、FFT.h
2、dll & lib.zip
C++项目中加入FFT.dll FFT.lib及FFT.h,直接调用封装函数
参考资料:《Visual C++数字图像处理.谢凤英 等》

脚本宝典总结

以上是脚本宝典为你收集整理的快速傅里叶变换C++完整实现(包括FFT、IFFT & FFTShift)全部内容,希望文章能够帮你解决快速傅里叶变换C++完整实现(包括FFT、IFFT & FFTShift)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。