C++实现二维快速傅里叶变换(FFT)

本文介绍了如何使用C++通过快速傅里叶变换(FFT)技术大幅加速二维离散傅里叶变换,从512x512图片处理的0.1秒缩短到传统方法的几分钟。讲解了FFT原理、递归和常规算法的实现,以及二维FFT的具体步骤,适用于图像处理和信号分析应用。

       上一篇文章里,我根据DFT公式用C++实现了二维离散傅里叶变换。但跑一张300*300的图片都要好几分钟,速度实在太慢了。我研究了下快速傅里叶变换,在网上找了一些资料,然后用C++实现了二维快速傅里叶变换,速度超级快,512*512的图片在0.1秒内就能处理完。

FFT原理

我们知道一维离散傅里叶变换公式如下

 其中

用矩阵表示即为:

这样就有N*N次乘法计算,很耗时。可以通过一些方式减小计算量。

由于是个周期函数,有如下两个性质

这样

 

从上面两个式子可以看出,

我们只要分别计算奇数项的DFT值

 

和偶数项的DFT值,

 

然后再通过一些加减,得到整体DFT的值X(k),乘法计算量大致就是(N/2)*(N/2)+N/2)*(N/2)=N*N/2。是之前的一半。

依次类推,奇数项和偶数项计算DFT值,也可以通过上面的方法,这样乘法计算量就每次除以2的降低。只要N满足是2的n次方,减到最后,计算量就减少2的n次方倍。

例如以下8个点计算FFT

 FFT方法一:

分析可知,可以通过递归实现这种算法。

C++代码如下

void fft(vector<Cpx>& a, int lim, int opt)
{
	if (lim == 1) return;
	vector<Cpx>
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值