上一篇文章里,我根据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>

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

被折叠的 条评论
为什么被折叠?



