分而治之是快速傅里叶变换(FFT)的构成基础。FFT 算法首次发表于 1965 年题为 An Algorithm for the Machine Calculation of Complex Fourier Series 的学术论文,由 IBM 研究员 James Cooley 与普林斯顿大学教授 John Tukey 共同提出。
DFT 无法直接采用数值比较类问题的划分方式。对于周期为 T T T 的余弦波与正弦波,在 DFT 计算中,相隔一个周期 T T T 的离散点对应的复指数取值相等,仅信号取值 x ( n ) x(n) x(n) 存在差异。因此仅需存储一个周期内的 cos \cos cos 与 sin \sin sin 取值。
离散傅里叶变换定义为:
X ( k ) = ∑ n = 0 N − 1 x ( n ) cos ( 2 π k n N ) − i ∑ n = 0 N − 1 x ( n ) sin ( 2 π k n N ) X(k) = \sum_{n=0}^{N-1} x(n)\cos\left(\frac{2\pi kn}{N}\right)- i\sum_{n=0}^{N-1} x(n)\sin\left(\frac{2\pi kn}{N}\right) X(k)=n=0∑N−1x(n)cos(N2πkn)−in=0∑N−1x(n)sin(N2πkn)
蝴蝶操作属于联合计算结构,运算形式如图所示。输入值 x 0 x_0 x0 与 x 8 x_8 x8 被重复调用参与运算,其中下方支路乘以因子 − 1 -1 −1,得到两个输出结果,记为 a 0 a_0 a0、 a 1 a_1 a1。 x 0 x_0 x0、 x 8 x_8 x8 分别为索引 0 与 8 对应的信号取值。
2 个样本 DFT 计算
在执行两个样本点的 DFT 之前,给出相关定义:周期信号 x ( n ) x(n) x(n) 可表示为若干正弦波的叠加,每一正弦波具有频率、幅度与相位三个属性。
当信号仅包含 2 个采样点时,其频域表示最多包含 2 个正弦分量,因此仅需考察 2 个频率分量。
为简化计算,设采样率 R R R 与样本个数 N N N 相等,即 N = 2 Hz/s N = 2\ \text{Hz/s} N=2 Hz/s。此时考察的两个频率为 0 Hz 与 1 Hz。
下面计算仅包含样本点 0 与 8 的离散傅里叶变换。
0 Hz 余弦分量:蓝线为频率 0 Hz 的余弦波,绿线为待分析信号。
R ( a 0 ) = ∑ n = 0 N − 1 x ( n ) × cos ( 2 π k n N ) = x 0 × 1 + x 8 × 1 \begin{align*} \mathcal{R}(a_0) & = \sum_{n=0}^{N-1} x(n) \times \cos\left(2\pi k \frac{n}{N}\right) \\ & = x_0 \times 1 + x_8 \times 1 \end{align*} R(a0)=n=0∑N−1x(n)×cos(2πkNn)=x0×1+x8×1
依据傅里叶变换公式,频率为 0 时的余弦分量结果为 x 0 + x 8 x_0 + x_8 x0+x8,即两点取值相乘后求和。同理可得 1 Hz 余弦分量结果为 x 0 − x 8 x_0 - x_8 x0−x8。
1 Hz 余弦分量:蓝线为频率 0 Hz 的余弦波,绿线为待分析信号。
R ( a 1 ) = x 0 × 1 + x 8 × − 1 \mathcal{R}(a_1) = x_0 \times 1 + x_8 \times -1 R(a1)=x0×1+x8×−1
同理计算正弦分量,结果均为 0。该结果可直接由 DFT 公式推导得到。
回顾前述蝴蝶操作,可见两点 DFT 计算结果与蝴蝶操作输出完全一致。
蝴蝶操作的推广限制
由此可得到推论:在第一阶段中,可求解所有点对在 0 Hz 与 1 Hz 处的频率分量,即
实际运算过程并不满足该简单推论。考察索引 4 与 12 构成的点对,由 DFT 公式可知,其频率为 1 的分量结果为 0,与前述蝴蝶操作结果不一致。其中 a 2 = x 4 + x 12 a_2 = x_4 + x_{12} a2=x4+x12,因此无法直接执行简单的重复运算。
在 2 点蝶形阶段,样本 4 与 12 经过相位平移得到结果 a 2 a_2 a2、 a 3 a_3 a3;
在 4 点蝶形阶段,通过旋转因子补偿得到 b 2 b_2 b2、 b 3 b_3 b3;
该阶段前 4 个点 b 0 ∼ b 3 b_0 \sim b_3 b0∼b3 位于原始位置,不再需要旋转因子。
样本点 2、10 与 6、14 对应的 2 点蝶形输出 a 4 a_4 a4、 a 5 a_5 a5、 a 6 a_6 a6、 a 7 a_7 a7,在 4 点蝶形输出后仍存在相位偏移。
因此在 8 点蝶形阶段,需要引入额外旋转因子完成补偿。
最终将 8 点序列组合为 16 点序列,完成全部 FFT 计算。
FFT 算法输出形式
对完整 FFT 计算流程进行总结,各阶段输出可归纳为:
a a a:2 点蝶形运算结果
b b b:4 点蝶形运算结果
c c c:8 点蝶形运算结果
d d d:16 点蝶形运算结果,即 FFT 最终输出
FFT 输出为一组复数序列:
在 16 点信号示例中,共对 16 个频率分量进行求解,得到 16 组复数。
由该复数序列可求解对应正弦波的频率、幅度与相位,进而生成频谱图与相位图。
FFT 输出的幅度与相位计算
设 x [ n ] x[n] x[n] 为长度为 N N N 的时域离散信号, n = 0 , 1 , ... , N − 1 n = 0, 1, \ldots, N-1 n=0,1,...,N−1。其 N N N 点 FFT 变换定义为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π N k n , k = 0 , 1 , ... , N − 1 X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}kn}, \quad k = 0, 1, \ldots, N-1 X[k]=n=0∑N−1x[n]⋅e−jN2πkn,k=0,1,...,N−1
其中 X [ k ] X[k] X[k] 为第 k k k 个频点对应的复数值, R e { X [ k ] } \mathrm{Re}\{X[k]\} Re{X[k]} 和 I m { X [ k ] } \mathrm{Im}\{X[k]\} Im{X[k]} 分别表示其实部与虚部。
幅度计算
各频点的幅度由复数模运算求得:
∣ X [ k ] ∣ = R e { X [ k ] } 2 + I m { X [ k ] } 2 |X[k]| = \sqrt{\mathrm{Re}\{X[k]\}^2 + \mathrm{Im}\{X[k]\}^2} ∣X[k]∣=Re{X[k]}2+Im{X[k]}2
相位计算
各频点的相位由复数辐角确定:
ϕ [ k ] = arctan ( I m { X [ k ] } R e { X [ k ] } ) \phi[k] = \arctan\left(\frac{\mathrm{Im}\{X[k]\}}{\mathrm{Re}\{X[k]\}}\right) ϕ[k]=arctan(Re{X[k]}Im{X[k]})
实际计算中通常采用四象限反正切函数(如 atan2)以避免象限模糊问题。
真实信号的完整 FFT 流程
16 点信号在实际应用中不具备代表性,下面对更贴近实际的信号进行分析。
设一段时长为 10 秒的连续信号,对其进行离散化采样,样本点数 N = 1024 N = 1024 N=1024,采样率:
R = 1024 10 Hz R = \frac{1024}{10}\ \text{Hz} R=101024 Hz
频率索引 k k k 的取值范围为 0 ∼ N − 1 0 \sim N-1 0∼N−1,对应可分析的频率范围为 0 ∼ R 0 \sim R 0∼R。
标准 DFT 变换的数学表达式为:
X ( k ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π k N n , k ∈ { 0 , 1 , ... , N − 1 } X(k)=\sum_{n=0}^{N-1}x(n)e^{-i\frac{2\pi k}{N}n},\quad k\in \{0,1,\dots,N-1\} X(k)=n=0∑N−1x(n)e−iN2πkn,k∈{0,1,...,N−1}
为简化表达式,定义旋转因子:
W N k = e − i 2 π k N W_{N}^{k}=e^{-i\frac{2\pi k}{N}} WNk=e−iN2πk
旋转因子 W W W 的基本性质
性质 1:缩放性
W N k = W 2 N 2 k W_{N}^{k}=W_{2N}^{2k} WNk=W2N2k
证明过程 :
根据欧拉公式 e − i θ = cos θ − i sin θ e^{-i\theta} = \cos\theta - i\sin\theta e−iθ=cosθ−isinθ,将旋转因子展开:
W N k = e − i 2 π k N = cos ( − 2 π k N ) + i sin ( − 2 π k N ) = cos ( − 2 π ( 2 k ) 2 N ) + i sin ( − 2 π ( 2 k ) 2 N ) = W 2 N 2 k \begin{aligned} W_{N}^{k} &= e^{-i\frac{2\pi k}{N}} = \cos\left(-\frac{2\pi k}{N}\right)+i\sin\left(-\frac{2\pi k}{N}\right) \\ &= \cos\left(-\frac{2\pi(2k)}{2N}\right)+i\sin\left(-\frac{2\pi(2k)}{2N}\right) = W_{2N}^{2k} \end{aligned} WNk=e−iN2πk=cos(−N2πk)+isin(−N2πk)=cos(−2N2π(2k))+isin(−2N2π(2k))=W2N2k
性质 2:对称性
W N k + N 2 = − W N k W_{N}^{k+\frac{N}{2}}=-W_{N}^{k} WNk+2N=−WNk
性质 3:周期性
W N 0 = W N N W_{N}^{0}=W_{N}^{N} WN0=WNN
性质 2 与性质 3 的证明方法与性质 1 一致,均通过欧拉公式展开后进行代数变换即可验证。
快速傅里叶变换 (FFT) 的数学推导
将 DFT 变换结果 X ( k ) X(k) X(k) 按输入序列索引的奇偶性拆分。当 k ∈ { 0 , 1 , ... , N 2 − 1 } k\in \{0,1,\dots,\frac{N}{2}-1\} k∈{0,1,...,2N−1} 时,原式可改写为:
X ( k ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π k N n X(k)=\sum_{n=0}^{N-1}x(n)e^{-i\frac{2\pi k}{N}n} X(k)=n=0∑N−1x(n)e−iN2πkn
按奇偶索引拆分求和项:
X ( k ) = ∑ n = 0 N 2 − 1 x ( 2 n ) e − i 2 π k N ( 2 n ) + ∑ n = 0 N 2 − 1 x ( 2 n + 1 ) e − i 2 π k N ( 2 n + 1 ) = ∑ n = 0 N 2 − 1 x ( 2 n ) e − i 2 π k N / 2 n + e − i 2 π k N ∑ n = 0 N 2 − 1 x ( 2 n + 1 ) e − i 2 π k N / 2 n \begin{aligned} X(k) &= \sum_{n=0}^{\frac{N}{2}-1}x(2n)e^{-i\frac{2\pi k}{N}(2n)} +\sum_{n=0}^{\frac{N}{2}-1}x(2n+1)e^{-i\frac{2\pi k}{N}(2n+1)} \\ &= \sum_{n=0}^{\frac{N}{2}-1}x(2n)e^{-i\frac{2\pi k}{N/2}n} +e^{-i\frac{2\pi k}{N}}\sum_{n=0}^{\frac{N}{2}-1}x(2n+1)e^{-i\frac{2\pi k}{N/2}n} \end{aligned} X(k)=n=0∑2N−1x(2n)e−iN2πk(2n)+n=0∑2N−1x(2n+1)e−iN2πk(2n+1)=n=0∑2N−1x(2n)e−iN/22πkn+e−iN2πkn=0∑2N−1x(2n+1)e−iN/22πkn
由于 e − i 2 π N e^{-i\frac{2\pi}{N}} e−iN2π 为与 n n n 无关的常数,可将 X ( k ) X(k) X(k) 表示为旋转因子的函数形式:
X ( e − i 2 π k N ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π k N n X\left(e^{-i\frac{2\pi k}{N}}\right)=\sum_{n=0}^{N-1}x(n)e^{-i\frac{2\pi k}{N}n} X(e−iN2πk)=n=0∑N−1x(n)e−iN2πkn
代入旋转因子定义 W N k = e − i 2 π k N W_N^k = e^{-i\frac{2\pi k}{N}} WNk=e−iN2πk,可得:
X ( W N k ) = ∑ n = 0 N − 1 x ( n ) ( W N k ) n = ∑ n = 0 N 2 − 1 x ( 2 n ) ( W N 2 k ) n + W N k ∑ n = 0 N 2 − 1 x ( 2 n + 1 ) ( W N 2 k ) n , k ∈ { 0 , 1 , ... , N 2 − 1 } \begin{aligned} X(W_{N}^{k}) &= \sum_{n=0}^{N-1}x(n)\left(W_{N}^{k}\right)^{n} \\ &= \sum_{n=0}^{\frac{N}{2}-1}x(2n)\left(W_{\frac{N}{2}}^{k}\right)^{n} +W_{N}^{k}\sum_{n=0}^{\frac{N}{2}-1}x(2n+1)\left(W_{\frac{N}{2}}^{k}\right)^{n}, \quad k\in \{0,1,\dots,\tfrac{N}{2}-1\} \end{aligned} X(WNk)=n=0∑N−1x(n)(WNk)n=n=0∑2N−1x(2n)(W2Nk)n+WNkn=0∑2N−1x(2n+1)(W2Nk)n,k∈{0,1,...,2N−1}
定义两个子序列的 DFT 结果:
F ( W N 2 k ) = ∑ n = 0 N 2 − 1 x ( 2 n ) ( W N 2 k ) n G ( W N 2 k ) = ∑ n = 0 N 2 − 1 x ( 2 n + 1 ) ( W N 2 k ) n \begin{aligned} F\left(W_{\frac{N}{2}}^{k}\right) &= \sum_{n=0}^{\frac{N}{2}-1}x(2n)\left(W_{\frac{N}{2}}^{k}\right)^{n} \\ G\left(W_{\frac{N}{2}}^{k}\right) &= \sum_{n=0}^{\frac{N}{2}-1}x(2n+1)\left(W_{\frac{N}{2}}^{k}\right)^{n} \end{aligned} F(W2Nk)G(W2Nk)=n=0∑2N−1x(2n)(W2Nk)n=n=0∑2N−1x(2n+1)(W2Nk)n
则当 k ∈ { 0 , 1 , ... , N 2 − 1 } k\in \{0,1,\dots,\frac{N}{2}-1\} k∈{0,1,...,2N−1} 时, X ( W N k ) X(W_N^k) X(WNk) 可表示为:
X ( W N k ) = F ( W N 2 k ) + W N k G ( W N 2 k ) X(W_{N}^{k})=F\left(W_{\frac{N}{2}}^{k}\right)+W_{N}^{k}\,G\left(W_{\frac{N}{2}}^{k}\right) X(WNk)=F(W2Nk)+WNkG(W2Nk)
接下来推导 k + N 2 k+\frac{N}{2} k+2N 处的结果 X ( W N k + N 2 ) X(W_N^{k+\frac{N}{2}}) X(WNk+2N),其中 k ∈ { 0 , 1 , ... , N 2 − 1 } k\in \{0,1,\dots,\frac{N}{2}-1\} k∈{0,1,...,2N−1}:
X ( W N k + N 2 ) = F ( W N 2 k + N 2 ) + W N k + N 2 G ( W N 2 k + N 2 ) = F ( W N 2 k + N ) + W N k + N 2 G ( W N 2 k + N ) = F ( W N 2 k W N N ) − W N k G ( W N 2 k W N N ) = F ( W N 2 k ) − W N k G ( W N 2 k ) \begin{aligned} X\left(W_{N}^{k+\frac{N}{2}}\right) &= F\left(W_{\frac{N}{2}}^{k+\frac{N}{2}}\right) +W_{N}^{k+\frac{N}{2}}\,G\left(W_{\frac{N}{2}}^{k+\frac{N}{2}}\right) \\ &= F\left(W_{N}^{2k+N}\right) +W_{N}^{k+\frac{N}{2}}\,G\left(W_{N}^{2k+N}\right) \\ &= F\left(W_{N}^{2k}W_{N}^{N}\right) -W_{N}^{k}\,G\left(W_{N}^{2k}W_{N}^{N}\right) \\ &= F\left(W_{\frac{N}{2}}^{k}\right) -W_{N}^{k}\,G\left(W_{\frac{N}{2}}^{k}\right) \end{aligned} X(WNk+2N)=F(W2Nk+2N)+WNk+2NG(W2Nk+2N)=F(WN2k+N)+WNk+2NG(WN2k+N)=F(WN2kWNN)−WNkG(WN2kWNN)=F(W2Nk)−WNkG(W2Nk)
综上,得到蝶形运算关系式:
{ X ( W N k ) = F ( W N 2 k ) + W N k G ( W N 2 k ) X ( W N k + N 2 ) = F ( W N 2 k ) − W N k G ( W N 2 k ) \left\{ \begin{aligned} X(W_{N}^{k}) &= F\left(W_{\frac{N}{2}}^{k}\right) + W_{N}^{k}G\left(W_{\frac{N}{2}}^{k}\right) \\ X\left(W_{N}^{k+\frac{N}{2}}\right) &= F\left(W_{\frac{N}{2}}^{k}\right) - W_{N}^{k}G\left(W_{\frac{N}{2}}^{k}\right) \end{aligned} \right. ⎩ ⎨ ⎧X(WNk)X(WNk+2N)=F(W2Nk)+WNkG(W2Nk)=F(W2Nk)−WNkG(W2Nk)
该组公式表明, N N N 点 DFT 结果的前半部分与后半部分可由其奇偶子序列的 N / 2 N/2 N/2 点 DFT 结果通过线性组合得到。
4 点 FFT 蝶形变换实例验证
令 N = 4 N=4 N=4,以 k = 0 k=0 k=0 为例展开计算,直观验证蝶形变换的计算逻辑。
首先计算 X ( W 4 0 ) X(W_4^0) X(W40):
X ( W 4 0 ) = F ( W 2 0 ) + W 4 0 G ( W 2 0 ) = ∑ n = 0 1 x ( 2 n ) ( W 2 0 ) n + W 4 0 ∑ n = 0 1 x ( 2 n + 1 ) ( W 2 0 ) n \begin{aligned} X(W_{4}^{0}) &= F(W_{2}^{0})+W_{4}^{0}\,G(W_{2}^{0}) \\ &= \sum_{n=0}^{1}x(2n)\left(W_{2}^{0}\right)^{n} +W_{4}^{0}\sum_{n=0}^{1}x(2n+1)\left(W_{2}^{0}\right)^{n} \end{aligned} X(W40)=F(W20)+W40G(W20)=n=0∑1x(2n)(W20)n+W40n=0∑1x(2n+1)(W20)n
其中子序列 DFT 结果 F ( W 2 0 ) F(W_2^0) F(W20) 与 G ( W 2 0 ) G(W_2^0) G(W20) 进一步递归拆分:
F ( W 2 0 ) = F f ( W 1 0 ) + W 2 0 G f ( W 1 0 ) = ∑ n = 0 0 x ( 4 n ) ( W 1 0 ) n + W 2 0 ∑ n = 0 0 x ( 4 n + 2 ) ( W 1 0 ) n = x ( 0 ) + x ( 2 ) W 2 0 \begin{aligned} F(W_{2}^{0}) &= F_{f}(W_{1}^{0})+W_{2}^{0}\,G_{f}(W_{1}^{0}) \\ &= \sum_{n=0}^{0}x(4n)\left(W_{1}^{0}\right)^{n} +W_{2}^{0}\sum_{n=0}^{0}x(4n+2)\left(W_{1}^{0}\right)^{n} \\ &= x(0)+x(2)\,W_{2}^{0} \end{aligned} F(W20)=Ff(W10)+W20Gf(W10)=n=0∑0x(4n)(W10)n+W20n=0∑0x(4n+2)(W10)n=x(0)+x(2)W20
G ( W 2 0 ) = F g ( W 1 0 ) + W 2 0 G g ( W 1 0 ) = ∑ n = 0 0 x ( 4 n + 1 ) ( W 1 0 ) n + W 2 0 ∑ n = 0 0 x ( 4 n + 3 ) ( W 1 0 ) n = x ( 1 ) + x ( 3 ) W 2 0 \begin{aligned} G(W_{2}^{0}) &= F_{g}(W_{1}^{0})+W_{2}^{0}\,G_{g}(W_{1}^{0}) \\ &= \sum_{n=0}^{0}x(4n+1)\left(W_{1}^{0}\right)^{n} +W_{2}^{0}\sum_{n=0}^{0}x(4n+3)\left(W_{1}^{0}\right)^{n} \\ &= x(1)+x(3)\,W_{2}^{0} \end{aligned} G(W20)=Fg(W10)+W20Gg(W10)=n=0∑0x(4n+1)(W10)n+W20n=0∑0x(4n+3)(W10)n=x(1)+x(3)W20
注: F f , G f F_f,\,G_f Ff,Gf 为 F F F 对应的递归子序列 DFT 结果; F g , G g F_g,\,G_g Fg,Gg 为 G G G 对应的递归子序列 DFT 结果。
因此 X ( W 4 0 ) X(W_4^0) X(W40) 可写为:
X ( W 4 0 ) = x ( 0 ) + x ( 2 ) W 2 0 + W 4 0 ( x ( 1 ) + x ( 3 ) W 2 0 ) X(W_{4}^{0})=x(0)+x(2)\,W_{2}^{0}+W_{4}^{0}\left(x(1)+x(3)\,W_{2}^{0}\right) X(W40)=x(0)+x(2)W20+W40(x(1)+x(3)W20)
4 点 FFT 的蝶形变换结构如下图所示:
上述计算过程的分步图解如下(其中 X [ i ] = X ( W 4 i ) X[i] = X(W_4^i) X[i]=X(W4i)):
子序列递归计算的图解:
完整的 4 点 FFT 蝶形变换图解:
通过蝶形变换,FFT 算法将 DFT 的计算复杂度从 O ( N 2 ) O(N^2) O(N2) 降低至 O ( N log 2 N ) O(N\log_{2}N) O(Nlog2N),提升了计算效率。
DFT 变换的数学表达式为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j k 2 π K n , k = 0 , 1 , 2 , . . . , K − 1 X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{K}n}},\ k=0,1,2,...,K-1} X[k]=n=0∑N−1x[n]e−jkK2πn, k=0,1,2,...,K−1
与传统教材表述不同的是,此处 k k k 的取值范围不再与输入信号索引 n n n 的长度 0 ∼ N − 1 0 \sim N-1 0∼N−1 保持一致,而是可独立设定。这一设定旨在强调 k k k 的本质作用是对以 2 π 2\pi 2π 为周期的连续频谱进行离散化处理(DFT 是对 DTFT 连续频域结果进行离散化采样后的产物),即完成频谱的离散采样操作。
为便于分析,在 FFT 的计算过程中,通常选取 k = 0 ∼ N − 1 k = 0 \sim N-1 k=0∼N−1 的取值策略,此时 DFT 变换公式可表示为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j k 2 π N n , k = 0 , 1 , 2 , . . . , N − 1 X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{N}n}},\ k=0,1,2,...,N-1} X[k]=n=0∑N−1x[n]e−jkN2πn, k=0,1,2,...,N−1
上述公式可直接求解,但计算量较大,需执行 N 2 N^2 N2 次复数乘法运算与 N ( N − 1 ) N(N-1) N(N−1) 次复数加法运算。为简化表达式,引入旋转因子 W N k n = e − j k 2 π N n W_N^{kn} = e^{-jk\frac{2\pi}{N}n} WNkn=e−jkN2πn,则 DFT 公式可改写为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j k 2 π N n = ∑ n = 0 N − 1 x [ n ] W N k n X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]{{e}^{-jk\frac{2\pi }{N}n}}=\sum\limits_{n=0}^{N-1}{x\left[ n \right]W_{N}^{kn}}} X[k]=n=0∑N−1x[n]e−jkN2πn=n=0∑N−1x[n]WNkn
其中,旋转因子的完整定义为: W N k n = e − j k 2 π N n W_{N}^{kn} = {{e}^{-jk\frac{2\pi }{N}n}} WNkn=e−jkN2πn, W = e − j 2 π N W = {{e}^{-j\frac{2\pi }{N}}} W=e−jN2π。FFT 算法对 DFT 计算过程的简化,正是依托旋转因子 W W W 的若干基本性质实现的。
二、旋转因子 W W W 的性质
旋转因子具有以下数学性质,这些性质是简化 DFT 计算的关键:
周期性: W N a + N = W N a W_{N}^{a+N} = W_{N}^{a} WNa+N=WNa
对称性: W N a + N / 2 = − W N a W_{N}^{a+N/2} = -W_{N}^{a} WNa+N/2=−WNa
缩放性: W N 2 = W N / 2 1 W_{N}^{2} = W_{N/2}^{1} WN2=WN/21
FFT 的计算流程融合了分治算法的设计思想,并结合旋转因子 W W W 的性质实现计算简化,具体推导过程如下:
步骤 1:输入信号的奇偶分解
将输入时域信号 x [ n ] , n = 0 , 1 , . . . , N − 1 x[n],\ n=0,1,...,N-1 x[n], n=0,1,...,N−1 按索引的奇偶性拆分为两个子序列:
f e v e n [ n ] = x [ 2 n ] f o d d [ n ] = x [ 2 n + 1 ] f_{even}\left[ n \right] = x\left[ 2n \right]\\f_{odd}\left[ n \right] = x\left[ 2n+1 \right] feven[n]=x[2n]fodd[n]=x[2n+1]
此时,子序列的索引范围为 n = 0 , 1 , 2 , . . . , N / 2 − 1 n=0,1,2,...,N/2-1 n=0,1,2,...,N/2−1。
步骤 2:DFT 公式的拆分与化简
对 DFT 公式 X [ k ] = ∑ n = 0 N − 1 x [ n ] W N k n , k = 0 , 1 , . . . , N − 1 X\left[ k \right]=\sum\limits_{n=0}^{N-1}{x\left[ n \right]W_{N}^{kn}},\ k=0,1,...,N-1 X[k]=n=0∑N−1x[n]WNkn, k=0,1,...,N−1 进行拆分,按索引奇偶性将求和项分为两部分:
X [ k ] = ∑ n 为偶数 x [ n ] W N k n + ∑ n 为奇数 x [ n ] W N k n , k = 0 , 1 , . . . , N − 1 X\left[ k \right]=\sum\limits_{n \text{ 为偶数}}{x\left[ n \right]W_{N}^{kn}}+\sum\limits_{n \text{ 为奇数}}{x\left[ n \right]W_{N}^{kn}},\ k=0,1,...,N-1 X[k]=n 为偶数∑x[n]WNkn+n 为奇数∑x[n]WNkn, k=0,1,...,N−1
该拆分过程的基本逻辑为将原求和序列按奇偶索引分离,如下图所示:
进一步展开可得:
X [ k ] = ∑ m = 0 ( N / 2 ) − 1 x [ 2 m ] W N k ⋅ 2 m + ∑ m = 0 ( N / 2 ) − 1 x [ 2 m + 1 ] W N k ⋅ ( 2 m + 1 ) , k = 0 , 1 , . . . , N − 1 X\left[ k \right]=\sum\limits_{m=0}^{(N/2)-1}{x\left[ 2m \right]W_{N}^{k\cdot 2m}}+\sum\limits_{m=0}^{(N/2)-1}{x\left[ 2m+1 \right]W_{N}^{k\cdot \left( 2m+1 \right)}},\ k=0,1,...,N-1 X[k]=m=0∑(N/2)−1x[2m]WNk⋅2m+m=0∑(N/2)−1x[2m+1]WNk⋅(2m+1), k=0,1,...,N−1
结合旋转因子的缩放性 W N 2 k m = W N / 2 k m W_N^{2km} = W_{N/2}^{km} WN2km=WN/2km,可将上式化简为:
X [ k ] = ∑ m = 0 ( N / 2 ) − 1 f e v e n [ m ] W N / 2 k ⋅ m + W N k ∑ m = 0 ( N / 2 ) − 1 f o d d [ m ] W N / 2 k ⋅ m , k = 0 , 1 , . . . , N − 1 X\left[ k \right]=\sum\limits_{m=0}^{(N/2)-1}{f_{even}\left[ m \right]W_{N/2}^{k\cdot m}}+W_{N}^{k}\sum\limits_{m=0}^{(N/2)-1}{f_{odd}\left[ m \right]W_{N/2}^{k\cdot m}},\ k=0,1,...,N-1 X[k]=m=0∑(N/2)−1feven[m]WN/2k⋅m+WNkm=0∑(N/2)−1fodd[m]WN/2k⋅m, k=0,1,...,N−1
令 F e v e n [ k ] F_{even}[k] Feven[k] 表示偶索引子序列 f e v e n [ n ] f_{even}[n] feven[n] 的 DFT 结果, F o d d [ k ] F_{odd}[k] Fodd[k] 表示奇索引子序列 f o d d [ n ] f_{odd}[n] fodd[n] 的 DFT 结果,则上式可简化为:
X [ k ] = F e v e n [ k ] + W N k F o d d [ k ] , k = 0 , 1 , . . . , N − 1 X\left[ k \right] = F_{even}\left[ k \right] + W_{N}^{k}F_{odd}\left[ k \right],\ k=0,1,...,N-1 X[k]=Feven[k]+WNkFodd[k], k=0,1,...,N−1
步骤 3:子序列 DFT 结果的周期性分析
F e v e n [ k ] F_{even}[k] Feven[k] 与 F o d d [ k ] F_{odd}[k] Fodd[k] 的时域输入长度均为 N / 2 N/2 N/2,但 k k k 的取值范围为 0 , 1 , ... , N − 1 0,1,...,N-1 0,1,...,N−1,是输入长度的 2 倍。这表明 F e v e n [ k ] F_{even}[k] Feven[k] 与 F o d d [ k ] F_{odd}[k] Fodd[k] 具有周期性特征(可理解为 N N N 个采样点包含了 2 个 2 π 2\pi 2π 周期的频谱采样),即:
F e v e n [ k + N / 2 ] = F e v e n [ k ] F o d d [ k + N / 2 ] = F o d d [ k ] F_{even}\left[ k+N/2 \right] = F_{even}\left[ k \right]\\F_{odd}\left[ k+N/2 \right] = F_{odd}\left[ k \right] Feven[k+N/2]=Feven[k]Fodd[k+N/2]=Fodd[k]
步骤 4:FFT 递推关系的推导
基于上述周期性,DFT 结果的前半部分可直接表示为:
X [ k ] = F e v e n [ k ] + W N k F o d d [ k ] , k = 0 , 1 , . . . , N / 2 − 1 X\left[ k \right] = F_{even}\left[ k \right] + W_{N}^{k}F_{odd}\left[ k \right],\ k=0,1,...,N/2-1 X[k]=Feven[k]+WNkFodd[k], k=0,1,...,N/2−1
结合旋转因子的对称性 W N k + N / 2 = − W N k W_N^{k+N/2} = -W_N^k WNk+N/2=−WNk,DFT 结果的后半部分可推导为:
X [ k + N / 2 ] = F e v e n [ k ] − W N k F o d d [ k ] , k = 0 , 1 , . . . , N / 2 − 1 X\left[ k+N/2 \right] = F_{even}\left[ k \right] - W_{N}^{k}F_{odd}\left[ k \right],\ k=0,1,...,N/2-1 X[k+N/2]=Feven[k]−WNkFodd[k], k=0,1,...,N/2−1
上述推导表明:一个 N N N 点的 DFT 结果可由其奇偶索引子序列的 N / 2 N/2 N/2 点 DFT 结果计算得到。例如,8 点 DFT 可由偶索引 4 点 DFT 结果与奇索引 4 点 DFT 结果推导得出;同理,4 点 DFT 可进一步分解为 2 点 DFT 结果的组合,以此类推,通过分治策略完成整个计算过程。