参考:快速傅里叶变换(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就相当于求
显然并没有那么简单,再来试着计算下一个组合索引为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 是计算机计算傅里叶变换的一种非常高效的方法,之所以用蝴蝶操作就是便于计算机做重复简单的操作。到这里,傅里叶的相关文章就全部结束。