↓ 跳过正文
  1. 文章/

DSP-16 快速DFT算法 (FFT)

学习笔记 DSP

目录
DSP - 这篇文章属于一个选集。
§ 16: 本文

DSP复习指南

🌟 欢迎来到第16讲:快速DFT算法 (FFT)
#

(对应课本第11章内容)

大家好!我们已经知道,DFT是连接理论与实践的桥梁,让计算机能够进行频谱分析。但是,直接计算DFT的代价是高昂的,其 $O(N^2)$ 的复杂度在计算机诞生初期几乎是无法承受的。今天,我们将学习彻底改变这一现状的伟大算法——快速傅里叶变换 (Fast Fourier Transform, FFT)。

FFT不是一个新的变换,而是一系列高效计算DFT的"捷径"。我们将深入探索其核心思想——“分而治之”,并详细剖析两种最经典的基-2 FFT算法:按时间抽取 (DIT) 和按频率抽取 (DIF)。

核心学习目标:

  1. 理解DFT的计算瓶颈:认识到 $O(N^2)$ 复杂度的巨大计算量及其在现实应用中的局限性。
  2. 掌握FFT的核心思想:深刻理解"分而治之"策略,以及如何利用旋转因子 $W\_N$ 的对称性和周期性来减少冗余计算。
  3. 精通按时间抽取(DIT)算法:能够推导DIT-FFT的蝶形运算单元,并理解其"输入倒序,输出顺序"的特点。
  4. 精通按频率抽取(DIF)算法:能够推导DIF-FFT的蝶形运算单元,并理解其"输入顺序,输出倒序"的特点。
  5. 认识比特逆序:理解比特逆序在FFT算法中的作用和规律。

📝 本讲主要内容
#

1. DFT的运算量问题
#

  • 直接计算DFT: $$ X[k] = \sum_{n=0}^{N-1} x[n] W_N^{kn}, \quad 0 \le k \le N-1 $$
    • 复数乘法: 计算每个 $X[k]$ 需要N次复数乘法,总共需要 $N \times N = N^2$ 次。
    • 复数加法: 计算每个 $X[k]$ 需要N-1次复数加法,总共需要 $N \times (N-1)$ 次。
    • 复杂度: $O(N^2)$。
  • 问题的严重性:
    • 1024点DFT: 需要约 $1024^2 \approx 100$ 万次复数乘法。在早期计算机上,这可能需要数十分钟甚至一小时。
    • 图像处理: 对一幅 $1024 \times 1024$ 的图像做二维DFT,需要做 $2 \times 1024$ 次1024点的DFT,计算时间将是天文数字。

2. FFT算法的核心思想
#

FFT的魔力来源于两个关键洞察:

  1. 利用旋转因子 $W\_N$ 的特性:
    • 对称性: $W\_N^{k+N/2} = -W\_N^k$
    • 周期性: $W\_N^{k+N} = W\_N^k$ 这意味着在DFT的计算中,有大量的乘法项是相同或仅相差一个负号的,存在巨大的冗余。
  2. 分而治之 (Divide and Conquer): 一个大问题可以被分解成若干个结构相同的小问题来解决。FFT的核心就是将一个N点DFT的计算,分解为多个更小尺寸(如N/2点)DFT的计算。

3. 按时间抽取 (DIT) 基-2 FFT算法
#

  • 思路:将输入的时间序列 $x[n]$ 按奇偶分成两组。
  1. 分解: 将N点DFT的求和式拆分为偶数项和奇数项两部分: $$ X[k] = \sum_{r=0}^{N/2-1} x[2r]W_N^{k(2r)} + \sum_{r=0}^{N/2-1} x[2r+1]W_N^{k(2r+1)} $$

  2. 化简: 利用 $W\_N^{2rk} = (W\_N^2)^{rk} = W\_{N/2}^{rk}$ 和 $W\_N^{k(2r+1)} = W\_N^k \cdot W\_{N/2}^{rk}$,上式变为: $$ X[k] = \underbrace{\sum_{r=0}^{N/2-1} x_{even}[r] W_{N/2}^{rk}}_{\text{偶数序列的N/2点DFT: } G[k]} + W_N^k \underbrace{\sum_{r=0}^{N/2-1} x_{odd}[r] W_{N/2}^{rk}}_{\text{奇数序列的N/2点DFT: } H[k]} $$ 于是,我们得到: $$ X[k] = G[k] + W_N^k H[k] $$

  3. 蝶形运算 (Butterfly Operation): 利用对称性 $W\_N^{k+N/2} = -W\_N^k$,我们可以同时计算 $X[k]$ 和 $X[k+N/2]$: $$ \begin{cases} X[k] = G[k] + W_N^k H[k] \\ X[k+N/2] = G[k] - W_N^k H[k] \end{cases} \quad \text{for } 0 \le k < N/2 $$ 这个计算结构就是著名的蝶形运算单元。

    【图片:DIT蝶形运算单元的信号流图 (参考PPT P12, P13),清晰展示两个输入(G[k], H[k])如何通过一次复数乘法和两次复数加法得到两个输出(X[k], X[k+N/2])】 file-第16讲快速DFT算法(FFT).jpg

  • 递归分解: 这个分解过程可以递归地进行下去。一个N点DFT分解为两个N/2点DFT,每个N/2点DFT又可以分解为两个N/4点DFT,依此类推,直到最后分解为最简单的2点DFT。

    【图片:8点DFT的DIT-FFT三层分解过程示意图 (参考PPT P15, P16, P17),逐层展示分解过程,最终形成完整的流图。】 file-第16讲快速DFT算法(FFT)3.jpg

  • DIT-FFT算法流程与特点:

    • 输入倒序:为了进行原位运算,输入序列 $x[n]$ 必须按照比特逆序 (Bit Reversal) 的顺序排列。
    • 蝶形运算:总共有 $L = \log\_2 N$ 级蝶形运算,每级有 $N/2$ 个蝶形。蝶形运算的"跨度"从第一级的1逐渐增大到最后一级的N/2。
    • 输出顺序:计算完成后,输出的频谱序列 $X[k]$ 是自然顺序的。

    【比特逆序示例 (N=8)】

自然顺序 二进制 比特倒置 逆序后十进制
0 (x) 000 000 0 (x)
1 (x) 001 100 4 (x)
2 (x) 010 010 2 (x)
3 (x) 011 110 6 (x)
4 (x) 100 001 1 (x)
5 (x) 101 101 5 (x)
6 (x) 110 011 3 (x)
7 (x) 111 111 7 (x)

4. 按频率抽取 (DIF) 基-2 FFT算法
#

  • 思路:与DIT相反,DIF是对输出的频谱序列 $X[k]$ 按奇偶进行分组。
  1. 分解: 将输入序列 $x[n]$ 分为前后两半: $$ X[k] = \sum_{n=0}^{N/2-1} x[n]W_N^{kn} + \sum_{n=N/2}^{N-1} x[n]W_N^{kn} $$ 通过变量替换,上式可化为: $$ X[k] = \sum_{n=0}^{N/2-1} (x[n] + (-1)^k x[n+N/2]) W_{N/2}^{kn} $$

  2. 奇偶谱线:

    • 当k为偶数, $k=2r$: $X[2r] = \sum\_{n=0}^{N/2-1} (x[n] + x[n+N/2]) W\_{N/2}^{rn}$ (前半部分和的N/2点DFT)
    • 当k为奇数, $k=2r+1$: $X[2r+1] = \sum\_{n=0}^{N/2-1} \left( (x[n] - x[n+N/2])W\_N^n \right) W\_{N/2}^{rn}$ (前半部分差乘以旋转因子的N/2点DFT)
  • DIF-FFT算法流程与特点:

    • 输入顺序:输入序列 $x[n]$ 是自然顺序的。
    • 蝶形运算:同样有 $\log\_2 N$ 级,每级 $N/2$ 个蝶形。但蝶形的"跨度"从第一级的N/2逐渐减小到最后一级的1。
    • 输出倒序:计算完成后,输出的频谱序列 $X[k]$ 是比特逆序的。

    【图片:8点DIF-FFT运算流图 (参考PPT P28),与DIT流图对比,注意蝶形大小变化和输入输出顺序。】 file-第16讲快速DFT算法(FFT)1.jpg

5. 运算量分析
#

运算类型 DFT (直接计算) FFT (基-2) 改善比 (N=1024)
复数乘法 $N^2$ $(N/2)\log\_2 N$ $2N/\log\_2 N \approx 205$ 倍
复数加法 $N(N-1)$ $N\log\_2 N$ $(N-1)/\log\_2 N \approx 102$ 倍

结论: FFT将计算复杂度从 $O(N^2)$ 戏剧性地降低到了 $O(N\log N)$,当N很大时,计算效率的提升是革命性的。


🔗 知识关联与应用
#

  • 承上启下: FFT是数字信号处理从理论走向大规模实用化的核心引擎。我们之前学的所有基于DFT的应用,如快速卷积、频谱分析、滤波器设计分析等,在实际中都是通过FFT来实现的。

  • 现实应用:

    1. 通信 (OFDM): Wi-Fi和4G/5G通信的核心技术OFDM,其调制和解调过程就是通过IFFT和FFT来实现的。FFT的高效率使得在单个信道上并行传输成百上千路数据成为可能。
    2. 音频/图像处理: 音乐播放器中的频谱均衡器、图像的JPEG压缩,都离不开FFT进行快速的频域分析和变换。
    3. 科学计算与数据分析: 从雷达信号处理到医疗成像(MRI),再到天文学数据分析,任何需要分析信号频率成分的领域,FFT都是不可或缺的基础工具。

🤔 引导式提问
#

  1. DIT和DIF算法的本质区别是什么? 它们在"分而治之"的策略上,一个是对"输入"进行划分,一个是对"输出"进行划分,这具体是如何体现在推导过程和最终的流图结构上的?
  2. 为什么FFT算法中会出现"比特逆序"这个现象? 它与算法的哪一步操作紧密相关?(提示:思考奇偶分解的递归过程)
  3. FFT算法要求N通常是2的整数次幂。如果我们要处理一个长度为1000点的序列,应该如何使用基-2 FFT算法? (提示:思考补零)

💡 本讲总结
#

今天,我们学习了数字信号处理皇冠上的明珠——FFT算法。 * 问题: DFT的 $O(N^2)$ 复杂度是其大规模应用的瓶颈。 * 核心思想: FFT通过"分而治之"和利用旋转因子的对称性/周期性,将N点DFT分解为更小DFT的组合,从而减少冗余计算。 * 两大算法: * DIT-FFT:按时间抽取(奇偶分解输入),流图为"输入倒序、输出顺序",蝶形由小变大。 * DIF-FFT:按频率抽取(奇偶分解输出),流图为"输入顺序、输出倒序",蝶形由大变小。 * 革命性成果: FFT将DFT的计算复杂度降至 $O(N\log N)$,使得海量数据的实时频谱分析成为可能,是现代数字技术不可或缺的基石。

DSP - 这篇文章属于一个选集。
§ 16: 本文

相关文章