【算法】快速傅里叶变换(FFT)——有史以来最巧妙的算法?

参考:快速傅里叶变换(FFT)——有史以来最巧妙的算法?
参考:快速傅里叶变换(FFT)超详解
快速傅里叶变换 (Fast Fourier Transform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT,于1965年由J.W.库利和T.W.图基提出。
在这里插入图片描述
总结:FFT极大的加快了算法的计算速度,时间复杂度降低一个数量级别。

FFT的思想

将多项式表示为多项式乘积形式,然后拆分为奇数项和偶数项的乘积。再将奇数项拆出X表示为
在这里插入图片描述
用上半单位元的单位根 w n k w^{k}_{n} wnk来表示 x 2 x^{2} x2
在这里插入图片描述
在这里插入图片描述

1、多项式的系数与点值表示

在这里插入图片描述
在这里插入图片描述

2、单位根

在这里插入图片描述

2、IDFT

在这里插入图片描述

跑完FFT后我们就得到了多项式乘积的点值表示,现在我们需要将点值表示转回系数表示,这个转换的过程被称为离散傅里叶逆变换(IDFT)。

如果我们用矩阵将DFT的过程封装,那么DFT就相当于求

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考:彻底搞懂快速傅里叶变换FFT核心思想–分而治之
在这里插入图片描述

显然并没有那么简单,再来试着计算下一个组合索引为4和12的点对,一眼看出,根据DFT的公式这里频率为1的分量结果为0,与上述蝴蝶操作是不一致的a2= x4+x12,所以不能简单的完成这项重复操作。

要解决这个问题,将信号进行平移,即让它刚好是在4和12处是1或-1,这样只是改变原始信号的相位,同时能够用蝴蝶操作实现这种简单重复计算,另一个问题是原始信号被改变了,怎样才能让最后的计算保持不变,下一个文章来介绍“旋转因子”来解决信号平移的问题。
上一篇文章,引入蝴蝶操作来计算样本对的DFT,实现了“分而治之”中对简单重复小块的处理,同时又引入信号相位改变的新问题,为保持整体的结果不变,利用“旋转因子”将平移后的信号再次平移回去,作为下一阶段的输入。
根据分而治之的思想,目前我们已经完成了DIVIDE和CONQUER阶段,接下来需要COMBINE,即将样本对的计算结果组合为新的样本对,依据样本对的计算顺序,将2个点的样本对集合为4个点的样本对,对于4样本点的信号,依据我们讲过DFT的原理,4个点就是就要测试4个频率,先前我们计算了0和1hz的频率分量,组合起来就需要额外计算2和3hz的频率分量了,依据我们在第一篇文章“核心思想–分而治之”中提到,正余弦函数的周期性,这里每隔2hz所测试的余弦波的值是相等的,也就是 0hz和2hz计算结果一样,1和3Hz的结果一样

对于要计算0和8, 4和12这四个点在频率为0的DFT结果,那直接a0+a2就完了,但是我们之前a2平移过信号的相位,现在就要乘以W40的旋转因子将他转换回去,再相加就得到b0, 就是4个点样本信号在频率为0时DFT的结果,同理我们计算b1,b2,b3
在这里插入图片描述
在这里插入图片描述

每个 4 点蝶形包含两个旋转因子,那么每个 8 点蝶形包含四个旋转因子。在 FFT 算法中,旋转因子的数量一定都是碟形中点数的一半。在 FFT 算法的 2 点蝶形阶段时,例如样本4和12信号,就平移位置就产生了a2和a3 。在 4 点蝶形阶段,通过旋转因子再将它们移回正确的位置b2到b3。在这一阶段,前 4 个点都在原始位置,即b0到b3就不需要相位因子了。
在这里插入图片描述
然而,对于样本点2,10和6,14,对应2点蝶形结果a4,a5,a6,a7 ,当它们到达 4 点蝴蝶的输出时仍然没有回到原来的位置。这是因为由于它们在信号中的位置,被 2 点蝶形操作平移了过多的距离。因此,在 8 点蝴蝶中,它们需要额外的旋转因子才能进一步将它们移回原位。

最后再将8个点组合为16个点,就大功告成了,这就是原始信号16个点16个频率进行蝴蝶操作汇总图,到此为止,FFT的计算就结束了,但是我们究竟得到了一个什么样的结果,要怎么分析

在这里插入图片描述
到此为止,我们完整的解释了整个FFT算法的过程,现在之前的计算结果汇总成一张表格,总共用16行,对应着16个频率的傅里叶级数,其中x是原始信号点,a是2点蝶形操作的结果,b是4点蝶形,c是8点蝶形 ,d是16点蝴蝶操作的结果,也正是我们所需要的FFT结果,它是一组复数类似如下:
在这里插入图片描述
按我们之前的例子就总共测试了16个频率,那么就得到16组复数,最后通过这个复数计算出正弦波的特性:频率、幅度和相位,就可以做出相应的频谱图,相位图等

傅里叶变换是一个非常强大的工具,这是因为它将复杂的(周期)信号分解正弦波。FFT 是计算机计算傅里叶变换的一种非常高效的方法,之所以用蝴蝶操作就是便于计算机做重复简单的操作。到这里,傅里叶的相关文章就全部结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值