快速傅里叶变换

快速傅里叶变换(FFT)是一种计算离散傅里叶变换的算法,其独有的计算方式能够大幅度减小离散傅里叶变换的计算量,使得离散傅里叶变换在计算机上具有可实现性。

离散傅里叶变换的计算量

回顾离散傅里叶变换:

可以发现,计算一个离散傅里叶变换需要计算:

  1. N个$x[n]W$,即N次复数乘法
  2. N-1次$x[i]W + x[i+1]W$,即(N-1)次复数加法

根据复数乘法原则$(a+jb)(c+jd)=(ac-bd)+j(ad+bc)$,和复数加法原则$(a+jb)+(c+jd)=(a+c)+j(b+d)$,可以发现:1次复数乘法与4个实数乘法和2个实数加法等价;1次复数加法和2次实数加法等价。

因此计算一次离散傅里叶变换需要计算:

  1. $4N^2$次实数乘法
  2. $4N^2 - 2N$次实数加法
    其中实数乘法对计算资源的消耗非常的大,因此考虑使用别的算法以简化实数乘法的次数。
    时域抽取的快速傅里叶变换
    将离散傅里叶变换分为奇数和偶数两个段落:根据复数的共轭对称性质:$W_N^{k(N-n)} = W_N^{kN}W_N^{-kn} = W_N^{-kn}$,前半段($0 - N/2$)的表达式可以写作:令$G[k] = \sum{r=0}^{\frac{N}{2}-1} x[2r]W{N/2}^{rk}$,$H[k] = \sum{r=0}^{\frac{N}{2}-1} x[2r+1]W{N/2}^{rk}$:将前半段式子的下标加上$N/2$考虑后半段式子的和,由于$W_N^{k+N/2} = -1$,因此:综合两段,得到时域抽取的快速傅里叶变换:

可以将整个序列继续折中细分成多个小部分,每个部分计算蝶形结构。在
为2的次方数时,使用折中法正好可以使得最终细分到相邻的奇偶两项做蝶形结构运算:
code
比如N=8时就可以通过折中法多次两两分组,每组内部进行蝶形运算后的结果再进行蝶形运算:
code
其中最低一级的分组通过如下方式进行:
code

蝶形结构运算

观察整个快速傅里叶变换的结构:
code
可以得出如下结论:

1.对于$N=2^m$,需要$m$级次蝶形结构的运算。
2.对于第$m$级运算,组数为$2^N-m-1$。每一组的$q$总是被赋予-1和权重,权重表示为:

code

快速傅里叶变换的计算量
由于一点蝶形运算中不包含乘法,快速傅里叶变换通过应用这样的蝶形结构来削减乘法计算的次数。当长度 $N=2^m$ 时,简单分析可得快速傅里叶变换的计算量:

频域抽取的快速傅里叶变换
在频域内对离散傅里叶变换进行拆分,可以得到:

同理对于频域内的奇数序列有:

令 $g[n] = x[n] + x[n+N/2], h[n] = x[n] - x[n+N/2]$,得到频域抽取的快速傅里叶变换:

同样符合蝶形结构:
code