ESC
输入关键词搜索文章
目录

DFT 与 FFT

从频域表达走向高效计算
有限长序列的频谱分析与快速傅里叶变换
9主节
11完整例题
4变换类型
NlogN复杂度

前置知识回顾

DFT 和 FFT 是把前面几节的理论变成可计算算法的关键。读这一节前,先把下面几件事放在手边:

  • DTFT:知道 $X(e^{j\omega})$$2\pi$ 周期的连续频谱。可回看 DTFT 笔记
  • 复指数正交性:不同频率槽位的复指数在一个周期内求和为 0,这是 DFT 能反变换的根本。
  • 卷积:知道线性卷积长度为 $L_x+L_h-1$,并理解卷积中"平移、翻转、相乘、求和"的操作。
  • 周期延拓:DFT 默认长度为 $N$ 的序列首尾相接,这会把普通卷积变成循环卷积。
Part 1 · 背景与动机
从 DTFT 到可计算的频谱分析

1.1 为什么有了 DTFT 还要 DFT

DTFT 给出的是连续频率函数 $X(e^{j\omega})$,理论上很完整,但计算机不能直接保存"连续函数"。实际实验和工程里,我们拿到的是有限长样本块,比如一段语音、一帧图像行信号、一段传感器记录。要分析这段有限数据的频率结构,就必须把连续频率轴离散化。

DFT 做的事情就是:在一个 $2\pi$ 周期内取 $N$ 个等间隔频率点,把频谱变成长度为 $N$ 的复数数组。这样一来,频域分析就能进入矩阵运算和程序实现。FFT 则进一步回答:这些 DFT 频点怎样才能高效算出来。

三者关系:DTFT 讲理论频谱,DFT 讲有限点频谱,FFT 讲快速计算 DFT 的算法。

DFT 的思想并非凭空出现。早在 1805 年,Gauss 就提出了将长度为 $N$ 的 DFT 递归分解为两个 $N/2$ 点 DFT 的算法——用于插值小行星 Pallas 和 Juno 的轨道。但 Gauss 没有分析算法的时间复杂度,且用新拉丁文发表,这个工作长期未被认知。直到 1965 年,Cooley 和 Tukey 在冷战核试验检测的实际需求驱动下重新发明了这个算法,并明确指出对 $N=2^k$ 的复杂度从 $O(N^2)$ 降至 $O(N\log N)$。此后 FFT 迅速普及,恰逢高速 ADC 的问世,直接推动了数字信号处理学科的诞生。

工程中的身影:你手机里的语音通话(GSM 编解码)、音乐软件的频谱可视化、WiFi(OFDM 调制解调)和 4G/5G 通信,底层都依赖 FFT 进行实时频域运算。

1.2 四大变换形式与时频对偶性

傅氏变换按时间和频率的连续/离散、有限/无限可以分为四种基本形式。它们之间遵守一条简单规律:

对偶性规律:时域里是离散的,频域里就必然是周期的;时域里是连续的,频域里就一定是非周期的。反过来也一样。

下表列出了四种变换及其时频域特征:

变换名称时域频域数学形式
FT(傅氏变换)连续、非周期连续、非周期$X(j\Omega)=\int_{-\infty}^{\infty}x(t)e^{-j\Omega t}dt$
FS(傅氏级数)连续、周期离散、非周期$X[k]=\frac1P\int_P x(t)e^{-j k\Omega_0 t}dt$
DTFT离散、非周期连续、周期($2\pi$$X(e^{j\omega})=\sum_{-\infty}^{\infty}x[n]e^{-j\omega n}$
DFT离散、有限长离散、有限长$X[k]=\sum_{0}^{N-1}x[n]e^{-j2\pi kn/N}$

表中 DTFT 时域离散、频域连续且周期——这对应了前面对偶性规律:离散化必然导致周期化。DFT 则在两个域上都做了离散化(等效于对 DTFT 的频域采样),所以时空两域都变成离散的有限长序列。

四种变换不是彼此替代的关系——FT 是最通用的数学工具,FS 用于周期连续信号,DTFT 是计算机能处理离散采样后的理论频谱,DFT 才是真正能让机器逐点算出来的有限维变换。

一张图理解:时域抽样(离散化)→ 频域周期折叠;频域抽样(离散化)→ 时域周期延拓。DFT 同时做了两件事:时域离散化(采样)+ 频域离散化(在一个周期内取 N 个点),所以时频两域都有限长。
PDF时频域对偶性示意p.6
正在渲染 PDF 第 6 页…
时频域对偶性示意(PDF 第 6 页) · 打开原文

1.3 对偶性证明

上面给出了定性结论:时域离散→频域周期,频域离散→时域周期。现在从数学定义出发,把这两条链各自严格推导一遍。

证明一:时域离散化 → 频域周期化

设时域信号 $x[n]$ 是离散序列($n$ 取整数),其 DTFT 为

$$X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n}.$$

把自变量 $\omega$ 替换为 $\omega+2\pi$

$$X(e^{j(\omega+2\pi)})=\sum_{n=-\infty}^{\infty}x[n]e^{-j(\omega+2\pi)n} =\sum_{n=-\infty}^{\infty}x[n]\underbrace{e^{-j\omega n}}_{\text{原项}}\cdot\underbrace{e^{-j2\pi n}}_{=?}.$$

关键一步:因为 $n$ 是整数,所以

$$e^{-j2\pi n}=\cos(2\pi n)-j\sin(2\pi n)=1.$$

于是

$$X(e^{j(\omega+2\pi)})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n}=X(e^{j\omega}).$$

频域以 $2\pi$ 为周期。如果 $n$ 不是整数而是连续变量 $t$,那么 $e^{-j2\pi t}\neq 1$(除非 $t$ 恰好为整数),周期性不成立。所以周期性的根源在于 $n$ 的离散(整数)性

证明二:频域离散化 → 时域周期化

设频域信号 $X[k]$ 在等间隔频率点上取值($k$ 取整数),通过 IDFS/IDFT 恢复时域:

$$x[n]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]W_N^{-kn},\quad W_N=e^{-j2\pi/N}.$$

$n$ 替换为 $n+N$

$$x[n+N]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]W_N^{-k(n+N)} =\frac{1}{N}\sum_{k=0}^{N-1}X[k]\underbrace{W_N^{-kn}}_{\text{原项}}\cdot\underbrace{W_N^{-kN}}_{=?}.$$

计算第二项:

$$W_N^{-kN}=(e^{-j2\pi/N})^{-kN}=e^{j2\pi k}=1.$$

因为 $k$ 是整数,$e^{j2\pi k}=1$。所以

$$x[n+N]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]W_N^{-kn}=x[n].$$

时域以 $N$ 为周期。同样的逻辑:如果 $k$ 不是整数而是连续变量 $\omega$(对应 DTFT 的情况),$e^{j2\pi\omega}\neq 1$,时域就不会周期化。所以时域周期化的根源在于频域采样点 $k$ 的离散(整数)性

反向命题:连续 → 非周期

  • 时域连续 → 频域非周期:如果 $n$ 换成连续变量 $t$,则 $e^{-j2\pi t}$ 一般不等于 1,无法推出 $X(\Omega+2\pi)=X(\Omega)$。连续时间傅氏变换(FT)的频谱不具有周期性。
  • 频域连续 → 时域非周期:如果 $k$ 换成连续变量 $\omega$,则 $e^{j2\pi\omega}$ 一般不等于 1,无法推出 $x[n+N]=x[n]$。DTFT 对应的时域序列不具有周期性。
四条规则统一证明:离散↔周期是同一枚硬币的两面。证明核心只有一个——$e^{-j2\pi\times\text{整数}}=1$。只要自变量是整数,旋转因子就回到 1,另一个域就会出现周期性;只要自变量是连续的,旋转因子就回不到 1,另一个域就是非周期的。
变换时域变量频域变量谁离散→谁周期
FT$t$ 连续$\Omega$ 连续都连续 → 都非周期
FS$t$ 连续,$T$ 周期$k$ 离散时域周期 → 频域离散;频域离散又反推时域周期
DTFT$n$ 离散$\omega$ 连续$n$ 整数 → 频域 $2\pi$ 周期
DFS/DFT$n$ 离散$k$ 离散$n$ 整数 → 频域周期;$k$ 整数 → 时域周期
Part 2 · 定义
DFT 定义与数学基础

2.1 N 点 DFT 与 IDFT

长度为 $N$ 的序列 $x[0],x[1],\ldots,x[N-1]$ 的 DFT 定义为

$$X[k]=\sum_{n=0}^{N-1}x[n]e^{-j2\pi kn/N},\quad k=0,1,\ldots,N-1.$$

$W_N=e^{-j2\pi/N}$,也可写成

$$X[k]=\sum_{n=0}^{N-1}x[n]W_N^{kn}.$$

反变换为 IDFT(逆离散傅里叶变换,Inverse Discrete Fourier Transform):

$$x[n]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]e^{j2\pi kn/N},\quad n=0,1,\ldots,N-1.$$
IDFT 做什么:DFT 把时域序列变成频域的 $N$ 个复数系数,IDFT 把这些系数变回时域序列。前面多一个 $1/N$ 归一化因子,是复指数正交性的直接结果(见下方 2.2 节)。两者互为逆运算,合在一起构成完整的时频域转换对。在 MATLAB 中分别用 fft()ifft() 实现。

$k$ 不是普通编号,而是频率槽位。它对应的角频率为 $\omega_k=2\pi k/N$。当采样频率为 $f_s$ 时,第 $k$ 个频点对应物理频率 $f_k=kf_s/N$,但超过 $N/2$ 的频点通常解释为负频率。

工程中的身影:音乐软件的均衡器柱状图就是对音频信号做 DFT 后各频点的幅度值。雷达回波分析中,DFT 将时域回波变换为距离-速度二维谱。

2.2 正交性:为什么 IDFT 能恢复序列

DFT 的核心代数基础是复指数正交性:

$$\sum_{n=0}^{N-1}e^{j2\pi (k-m)n/N}=\begin{cases}N,&k=m\pmod N,\\0,&k\ne m\pmod N.\end{cases}$$

如果两个频率槽位不同,它们在一个完整周期里的旋转方向会均匀绕圈,求和相互抵消;如果频率槽位相同,每一项都是 1,求和为 $N$。IDFT 前面的 $1/N$ 正是为了抵消这个归一化因子。

从线性代数角度看,DFT 是把 $x$ 投影到一组正交复指数基上;IDFT 是把这些基按系数加回来。

例题 1:手算 4 点 DFT

题目:$x[n]=[1,2,0,0]$,求 4 点 DFT。

目标:熟悉 DFT 定义中每个频点的计算。

  1. 写出 4 点旋转因子:$W_4=e^{-j2\pi/4}=e^{-j\pi/2}=-j$
  2. 逐点计算:
    $$X[k]=\sum_{n=0}^{3}x[n]W_4^{kn}=1+2W_4^k.$$
  3. 代入 $k=0,1,2,3$
    $$X[0]=3,$$
    $$X[1]=1+2(-j)=1-2j,$$
    $$X[2]=1+2(-1)=-1,$$
    $$X[3]=1+2(j)=1+2j.$$

答案:$X=[3,1-2j,-1,1+2j]$

易错点:$W_N^{kn}$ 的指数是 $kn$,不是 $k+n$。实序列的 DFT 满足共轭对称,所以 $X[3]=X^*[1]$,这也可用于检查答案。

例题 2:求 $a^n R_N(n)$$N$ 点 DFT

题目:$x(n)=a^n R_N(n)$,求 $N$ 点 DFT。

$R_N(n)$矩形窗序列(rectangular window),定义为 $R_N(n)=1$$0\le n\le N-1$),其余为 0。所以 $a^n R_N(n)$ 就是 $a^n$ 只取前 $N$ 个点,是一个长度为 $N$ 的有限长序列。在程佩青教材中,$R_N$ 用于显式标记截断操作。

目标:熟悉几何级数在 DFT 中的处理。

  1. 写出 DFT 定义:
    $$X(k)=\sum_{n=0}^{N-1}a^n W_N^{kn}=\sum_{n=0}^{N-1}(aW_N^k)^n.$$
  2. $k=0$ 时:$W_N^0=1$,故 $X(0)=\sum_{n=0}^{N-1}a^n=\frac{1-a^N}{1-a}$$a\neq 1$ 时)。
  3. $k=1,\ldots,N-1$ 时:几何级数求和,利用 $W_N^{kN}=1$
    $$X(k)=\frac{1-(aW_N^k)^N}{1-aW_N^k}=\frac{1-a^N}{1-aW_N^k}.$$

答案:$X(k)=\frac{1-a^N}{1-aW_N^k}$$k=0,1,\ldots,N-1$

易错点:$W_N^{kn}$ 的指数是乘积 $kn$。当 $a=1$ 时,$X(k)=N\delta(k)$

例题 3:求 $\delta(n-n_0)$$N$ 点 DFT

题目:$x(n)=\delta(n-n_0)$$0<n_0<N$,求 $N$ 点 DFT。

目标:理解冲激序列的 DFT 就是旋转因子本身。

  1. 代入定义:$X(k)=\sum_{n=0}^{N-1}\delta(n-n_0)W_N^{kn}=W_N^{kn_0}$
  2. 物理含义:时域延迟 $n_0$ 对应频域乘以 $W_N^{kn_0}=e^{-j2\pi kn_0/N}$,这是 DFT 时移性质的特例。

答案:$X(k)=W_N^{kn_0}=e^{-j2\pi kn_0/N}$

Part 3 · 理论桥梁
从 DTFT 到 DFT 的理论桥梁

3.1 DFT 是 DTFT 的等间隔采样

如果把有限长序列看成

$$x[n]=0,\quad n<0\text{ 或 } n\ge N,$$

它的 DTFT 是

$$X(e^{j\omega})=\sum_{n=0}^{N-1}x[n]e^{-j\omega n}.$$

$\omega_k=2\pi k/N$ 处采样,就得到

$$X(e^{j\omega_k})=\sum_{n=0}^{N-1}x[n]e^{-j2\pi kn/N}=X[k].$$

这说明 DFT 不是凭空发明的新变换,而是 DTFT 在有限网格上的采样。但 DFT 的反变换会把这 $N$ 个频点解释成一个长度为 $N$ 的周期序列,因此边界处理和循环结构会自然出现。

工程中的身影:数字音乐调音器需要足够的频率分辨率来识别音高——DFT 的频率分辨率 $\Delta_f = f_s/N$ 决定了能否区分相邻半音。5G 通信中的 OFDM 调制,本质上就是对宽带信号做 DFT 分解成多个正交子载波。

3.2 DFS:DFT 的周期延拓根基

严格说,DFT 是周期序列的离散傅里叶级数(DFS)被矩形窗截取一个周期后的结果。DFS 处理周期序列 $\tilde{x}[n]$(周期 $N$),其定义是

$$\tilde{X}[k]=\sum_{n=0}^{N-1}\tilde{x}[n]W_N^{nk},\quad k=0,\ldots,N-1.$$

$\tilde{X}[k]$ 本身也是周期为 $N$ 的序列。DFS 逆变换恢复周期序列:

$$\tilde{x}[n]=\frac1N\sum_{k=0}^{N-1}\tilde{X}[k]W_N^{-nk}.$$

DFS 和 DFT 的数学表达式一模一样,唯一的区别是解读方式:DFS 的输入和输出都默认是周期无限的,DFT 的输入和输出都视为有限长的主值区间。两者的关系可以写作

$$X[k] = \tilde{X}[k]\cdot R_N[k],\qquad x[n] = \tilde{x}[n]\cdot R_N[n],$$

其中 $R_N[\cdot]$ 是矩形窗(主值区间 $0\le n \le N-1$ 内为 1,其余为 0)。

DFS ↔ DFT 的关系:DFS 先假设序列是周期的,DFT 取主值区间把它截断为有限长。课后做题时序列一般写 $x[n]$(有限长),但做 DFT 时理解成隐含了 $\tilde{x}[n]=x[(n\bmod N)]$ 的周期延拓会更有用,尤其是理解循环卷积时。

DFS 同样满足一系列性质,其中最有用的几个:

DFS 性质时域频域说明
线性$a\tilde{x}[n]+b\tilde{y}[n]$$a\tilde{X}[k]+b\tilde{Y}[k]$简单叠加,DFS 是线性变换
时移$\tilde{x}[n+m]$$W_N^{-mk}\tilde{X}[k]=e^{j2\pi mk/N}\tilde{X}[k]$时域移位不改变幅度,只引入相位旋转
频移$W_N^{ln}\tilde{x}[n]$$\tilde{X}[k+l]$频谱搬移的对偶性质
周期卷积$\sum_{m=0}^{N-1}\tilde{x}_1[m]\tilde{x}_2[n-m]$$\tilde{X}_1[k]\tilde{X}_2[k]$DFS 域乘法对应时域周期卷积
共轭对称$\tilde{x}[n]$ 为实序列$\tilde{X}[k]=\tilde{X}^*[-k]$实序列的 DFS 幅度关于 $k=0$ 偶对称

DFS 的性质几乎完全照搬到 DFT,区别只在于 DFT 需要处理索引的模 $N$ 回绕(因为 DFT 把有限长序列当作周期序列的一个周期来对待)。

PDFDFS 定义与性质 · p.12–61p.12–61
正在渲染 PDF 第 12 页…
正在渲染 PDF 第 61 页…
DFS 定义与性质(PDF p.12–61) · 打开原文
Part 4 · 循环卷积
DFT 域乘法对应的是循环卷积

在 DTFT 中,时域线性卷积对应频域乘法。但在 DFT 中,因为序列被默认周期延拓,频域逐点乘法对应的是长度为 $N$ 的循环卷积:

$$y[n]=\sum_{m=0}^{N-1}x[m]h[(n-m)\bmod N].$$

这里的 $\bmod N$ 表示索引超出边界后会绕回前面。普通线性卷积的尾巴如果超过 $N-1$,在循环卷积里就会折叠到开头,这叫时域混叠循环混叠

用 DFT 做线性卷积的规则:如果 $x[n]$ 长度为 $L_x$$h[n]$ 长度为 $L_h$,至少零填充到 $N\ge L_x+L_h-1$,循环回绕才不会污染有效结果。

循环卷积和线性卷积之间有一个严谨的数学关系:长度为 $L$ 的循环卷积等于线性卷积的周期延拓再截取。设 $x_1[n]$ 长度为 $L$$x_2[n]$ 长度为任意长,记线性卷积为 $y_l[n]=x_1[n]*x_2[n]$,则循环卷积

$$\tilde{y}[n]=\sum_{m=0}^{L-1}x_1[m]x_2[(n-m)\bmod L]$$

可以展开为

$$\tilde{y}[n]=\sum_{r=-\infty}^{\infty}y_l[n+rL].$$

证明的核心步骤是:把 $x_2[(n-m)\bmod L]$ 写成 $\sum_{r=-\infty}^{\infty}x_2[n+rL-m]$(周期延拓的求和),然后交换两个求和顺序。这个关系说明,循环卷积的每个输出点 $\tilde{y}[n]$ 都包含了线性卷积在 $n, n\pm L, n\pm 2L,\ldots$ 处所有值的叠加。因此当 $L$ 小于线性卷积长度时,不同 $r$ 的项会互相重叠——这就是时域混叠。

工程中的身影:实时音频降噪和均衡器使用 Overlap-Add 或 Overlap-Save 方法——把长音频切成小块,每块做 DFT → 频域乘滤波器响应 → IDFT,然后重叠拼接。这比时域直接卷积快得多,是所有数字音频工作站(DAW)的底层机制。
PDF周期卷积推导p.80
正在渲染 PDF 第 80 页…
周期卷积推导(PDF 第 80 页) · 打开原文

例题 4:为什么线性卷积需要零填充

题目:$x=[1,1,1]$$h=[1,1]$。比较 3 点循环卷积和线性卷积。

目标:看清楚循环混叠是怎么发生的。

  1. 线性卷积:
    $$x*h=[1,2,2,1].$$

    长度为 $3+2-1=4$

  2. 若只做 3 点循环卷积:线性卷积的第 4 个样本会折回第 1 个位置,所以得到
    $$y_3=[1+1,2,2]=[2,2,2].$$
  3. 正确零填充:把两序列补到 $N\ge4$,例如 $x=[1,1,1,0]$$h=[1,1,0,0]$,再做 4 点循环卷积,就得到线性卷积 $[1,2,2,1]$

答案:3 点循环卷积为 $[2,2,2]$,不是线性卷积;零填充到 4 点后才得到正确线性卷积。

易错点:"DFT 乘法实现卷积"这句话默认是循环卷积。要实现线性卷积必须先补零。

例题 5:15 点 DFT 乘积与线性卷积的关系

题目:$x(n)$ 长度为 $6$$0\le n\le 5$),$y(n)$ 长度为 $15$$0\le n\le 14$)。各作 15 点 DFT 相乘后 IDFT,得 $f(n)$,问 $f(n)$ 的哪些点对应线性卷积 $x(n)*y(n)$

目标:理解循环卷积与线性卷积的混叠关系。

  1. 线性卷积长度:$6+15-1=20$
  2. 15 点循环卷积:$f(n)=\sum_{r=-\infty}^{\infty}[x*y](n+15r)$$n=0,\ldots,14$
  3. 混叠分析:$n+15\ge 20$$n\ge 5$ 时成立,此时 $[x*y](n+15)=0$,无混叠。

答案:$f(n)=[x*y](n)$$n=5,6,\ldots,14$。前 $5$ 个点($n=0\sim 4$)发生混叠。

关键规律:$x$ 长度为 $L_x$$y$ 长度为 $L_y$,做 $N$ 点循环卷积,则 $n=L_x-1,\ldots,N-1$ 的输出与线性卷积一致。
Part 5 · 窗函数
频谱泄漏与窗函数选择

实际用 DFT 分析信号时,隐含了两个动作:截取有限窗口、在有限频点上观察频谱。截取窗口相当于时域乘上窗函数,频域会变成原频谱与窗函数频谱的卷积。因此如果信号频率不正好落在 DFT 频点上,能量会扩散到相邻频点,这就是频谱泄漏(spectral leakage)。

频谱泄漏的本质不是信号的问题,而是边界假设的问题。DFT 隐含假设输入是周期信号的单个周期。当信号实际频率 $f_0$ 不等于任何 DFT 分析频率(即 $f_0 \neq k \cdot f_s / N$)时,信号周期延拓在边界处产生不连续性。为了拟合这个尖锐跳变,DFT 被迫在所有频率上分配能量。

频率分辨率定义:$\Delta_f = f_s/N = 1/T$,其中 $T$ 是信号观测窗口时长。只有当两个正弦信号的频率差 $\Delta f > \Delta_f$ 时,DFT 才能将它们区分开来。

不同窗函数的区别在于主瓣宽度旁瓣衰减之间的 trade-off:

窗函数主瓣宽度(相对)旁瓣衰减特点
矩形窗最小-13 dB(最差)等效于不加窗,频谱最窄但泄漏最严重
Hann(升余弦)较宽-31 dB平滑过渡到零,通用默认选择
Hamming较宽-43 dB两端不完全到零,对周期性信号稍好
Blackman更宽-67 dB旁瓣最低,主瓣最宽

选择窗函数的工程原则:

  • 频率是否对齐 DFT bin?若精确对齐,矩形窗即可;否则用 Hann 窗(覆盖 95% 的应用场景)。
  • 频率分辨率 vs 动态范围:频率靠得很近 → 用主瓣窄的窗(Hann);关注弱信号与大信号共存 → 用旁瓣衰减强的窗(Blackman)。
  • 通用默认:Hann 窗是大多数情况下的良好默认。
工程中的身影:音频分析仪和振动监测软件都默认使用 Hann 窗。医学 EEG 信号分析中,Blackman 窗用于在强 $\alpha$ 波旁检测微弱的 $\gamma$ 波成分。
8 点 radix-2 FFT 蝶形结构示意图
FFT 的意义不只是"算得快",而是利用偶奇拆分和旋转因子复用,让原本 $N^2$ 级别的 DFT 在工程上可用。
Part 6 · FFT
$N^2$$N\log N$:快速傅里叶变换

6.1 为什么需要 FFT:DFT 的计算瓶颈

DFT 的定义式为

$$X[k]=\sum_{n=0}^{N-1}x[n]\,W_N^{kn},\quad k=0,1,\ldots,N-1.$$

每个 $X[k]$ 需要 $N$ 次复数乘法,一共 $N$$k$,所以直接计算 $N$ 点 DFT 需要 $N^2$ 次复乘。当 $N$ 较小时问题不大,但工程中 $N$ 经常很大:

$N$$N^2$ 次复乘直接计算时间(每次复乘 $5\,\mu\text{s}$
$64$$4\,096$$20\,\text{ms}$
$512$$262\,144$$1.31\,\text{s}$
$8192$$67\,108\,864$$336\,\text{s}$(5.6 分钟)
$2^{20}$$\approx 10^{12}$约 58 天

音频 CD 以 $44.1\,\text{kHz}$ 采样,1 秒的数据对应 $N=44100$,直接算 DFT 要 $\sim 2\times 10^9$ 次复乘,实时处理根本不可能。图像处理、雷达、MRI 等场景的 $N$ 更大。如果 DFT 只能 $O(N^2)$ 地算,它在工程中几乎没用。

FFT(Fast Fourier Transform,快速傅里叶变换)是什么

FFT 不是一个新变换,而是计算 DFT 的一种快速算法。它算出的结果和直接按定义算的完全一样,但把计算量从 $O(N^2)$ 降到 $O(N\log_2 N)$

核心思想:分治。把一个 $N$ 点 DFT 拆成两个 $N/2$ 点 DFT,利用旋转因子 $W_N$ 的对称性和周期性复用中间结果。递归拆分下去,最终只需要 $\frac{N}{2}\log_2 N$ 次复乘。

这个思想最早由 Gauss 在 1805 年提出,1965 年 Cooley 和 Tukey 的论文使其广为人知。FFT 被誉为 20 世纪最重要的数值算法之一。

关键认知:FFT 算的是精确 DFT,不是近似值。快来自旋转因子的周期性和对称性被复用,不是牺牲精度换速度。

6.2 Radix-2 DIT 分治推导

最常用的 FFT 变体是 Radix-2 按时间抽取(DIT, Decimation In Time),要求 $N=2^M$。它的思路是:把输入序列按偶数和奇数下标拆成两组,分别做 $N/2$ 点 DFT,再用一层合成得到完整的 $N$ 点 DFT。

$N=2M$ 的 DFT,按偶数和奇数样本拆开:

$$X[k]=\sum_{r=0}^{M-1}x[2r]W_N^{2rk}+\sum_{r=0}^{M-1}x[2r+1]W_N^{(2r+1)k}.$$

利用 $W_N^2=W_{N/2}$,得到

$$X[k]=\underbrace{\sum_{r=0}^{M-1}x[2r]W_M^{rk}}_{E[k]}+W_N^k\underbrace{\sum_{r=0}^{M-1}x[2r+1]W_M^{rk}}_{O[k]}.$$

$E[k]$ 是偶数样本的 $M$ 点 DFT,$O[k]$ 是奇数样本的 $M$ 点 DFT,两者都已经对 $M$ 周期,所以 $E[k+M]=E[k]$$O[k+M]=O[k]$。再利用 $W_N^{k+M}=-W_N^k$,得

$$\boxed{\begin{aligned}X[k]&=E[k]+W_N^k\,O[k],\\X[k+M]&=E[k]-W_N^k\,O[k],\end{aligned}}\quad k=0,1,\ldots,M-1.$$

这两个式子就是蝶形运算(butterfly)。一对输入 $(E[k],\,O[k])$ 通过一次复乘 $W_N^k O[k]$ 和两次加减,同时产生两个输出 $X[k]$$X[k+M]$。上下两支只差一个加减号。

每个蝶形只需要 1 次复乘$W_N^k O[k]$)和 2 次复加(加和减)。$N$ 点 FFT 有 $\log_2 N$ 级,每级 $N/2$ 个蝶形,所以总复乘次数为 $\frac{N}{2}\log_2 N$

递归拆分到 2 点 DFT 后,整个计算量满足

$$T(N)=2T(N/2)+\Theta(N)=\Theta(N\log_2 N).$$
PDF计算工作量分析:一次分解使计算量减半p.13

pdf/dsp/第四讲1.pdf · p.13

打开原文

6.2a N=8 的具体分解过程

$N=8$ 为例,展示 FFT 分治的具体操作。

PDFN=8 DFT 分解为两个 N/4=4 点 DFTp.14

pdf/dsp/第四讲1.pdf · p.14

打开原文

第一步:按偶数/奇数下标拆分

偶数序列 $x_1[r]=x[2r]$$x_1[0]=x[0]$$x_1[1]=x[2]$$x_1[2]=x[4]$$x_1[3]=x[6]$

奇数序列 $x_2[r]=x[2r+1]$$x_2[0]=x[1]$$x_2[1]=x[3]$$x_2[2]=x[5]$$x_2[3]=x[7]$

第二步:分别做 4 点 DFT

$$X_1[k]=\sum_{r=0}^{3}x[2r]W_4^{rk},\quad X_2[k]=\sum_{r=0}^{3}x[2r+1]W_4^{rk},\quad k=0,1,2,3.$$

第三步:蝶形合成

PDF蝶形合成公式p.15

pdf/dsp/第四讲1.pdf · p.15

打开原文

$$X[k]=X_1[k]+W_8^k\,X_2[k],\quad X[k+4]=X_1[k]-W_8^k\,X_2[k],\quad k=0,1,2,3.$$

这一层蝶形需要 4 次复乘($W_8^0,W_8^1,W_8^2,W_8^3$)和 8 次复加。对 $X_1$$X_2$ 再分别递归拆成两个 2 点 DFT,就完成了整个 8 点 FFT。

PDFN=8 DFT 分解为两个 N/2 点 DFT + 蝶形合成p.16
正在渲染 PDF 第 16 页…
N=8 DFT 分解为两个 N/2 点 DFT + 蝶形合成(PDF 第 16 页) · 打开原文

6.3 DIT 与 DIF、Bit-Reversal 与其他算法

Radix-2 有两种对偶形式:按时间抽取(DIT)将输入序列按奇/偶下标分组(上面推导的);按频率抽取(DIF)将输出频谱按奇/偶 $k$ 分组。两者在计算效率上几乎无差异,都包含 $\log_2 N$ 个阶段,每阶段 $N/2$ 个蝶形运算。

PDFDIT-FFT 运算规律p.27

pdf/dsp/第四讲1.pdf · p.27

打开原文

$N$ 点 FFT 的总运算量

PDFFFT 运算量公式p.28

pdf/dsp/第四讲1.pdf · p.28

打开原文

FFT 运算量

复数乘法:$\frac{N}{2}\log_2 N$

复数加法:$N\log_2 N$

与直接计算 DFT 的 $N^2$ 次复乘相比,加速比为 $\frac{2N}{\log_2 N}$。当 $N=1024$ 时加速约 $204$ 倍,$N=2^{20}$ 时加速约 $10^5$ 倍。

FFT 的原地(in-place)特性意味着所有中间结果直接覆盖原数组位置,无需额外存储空间——$N$ 点 FFT 只需 $O(N)$ 的存储。这也是为什么蝶形图中每条数据路径都直接写入而不经过额外缓冲区。

PDF原位运算与可并行性p.29

pdf/dsp/第四讲1.pdf · p.29

打开原文

递归偶奇拆分会导致输出下标是输入下标二进制位反转后的顺序——即 bit-reversal。以 $N=8$ 为例:

输入下标二进制反转后输出下标
00000000
10011004
20100102
30111106
41000011
51011015
61100113
71111117

输入顺序 $0,1,2,3,4,5,6,7$ 经过 bit-reversal 后变为 $0,4,2,6,1,5,3,7$。由于 bit-reversal 是一个对合(做两次恢复原序),只需做一次交换即可原地恢复正序。

$N$ 包含大素因子时 Radix-2 无法高效分解,此时有特殊算法:Rader's algorithm 将素数长度 $N$ 的 DFT 转化为长度 $N-1$ 的循环卷积;Bluestein's algorithm 用 chirp-Z 变换将任意长度 $N$ 的 DFT 转化为 2 的幂长度的卷积。

PDF8 点 FFT 完整蝶形信号流图p.26
正在渲染 PDF 第 26 页…
8 点 FFT 完整蝶形信号流图(PDF 第 26 页) · 打开原文
PDF进一步分解到 N/4 点 DFTp.19

pdf/dsp/第四讲1.pdf · p.19

打开原文

工程中的身影:JPEG 压缩用 DCT(DFT 的亲兄弟,可用 FFT 实现)将图像块变换到频域后量化。MRI 图像重建的核心步骤就是对采样数据做 2D FFT。地震勘探中,FFT 将地震波从时间域变换到频率域进行分析。

6.2 频谱分析、滤波与 STFT

FFT 让 DFT 足够快,于是很多滤波和谱估计任务都可以转到频域完成:先 FFT,频域乘以滤波器响应,再 IFFT 回到时域。只要处理好零填充和块边界,就能把长信号卷积变成高效的块处理算法。

Overlap-Add(OLA)Overlap-Save(OLS)是两种经典的分块快速卷积方法:

  • OLA:将输入切成不重叠的块,每块补零后做 FFT → 频域乘法 → IFFT,相邻块的结果在重叠区相加。
  • OLS:每一块输入从前一块末尾保留 $M-1$ 个样本($M$ 为滤波器长度),卷积后丢弃前 $M-1$ 个被循环混叠污染的样本。

两者在数学上等价,计算量相同。OLA = "先补零再卷积,再重叠相加";OLS = "先重叠输入,卷积后丢弃无效部分"。

FFT 最广泛的应用形式是短时傅里叶变换(STFT):将长信号切成重叠的短窗,对每个窗做 FFT,得到时-频二维表示:

$$X(m,\omega)=\sum_{n=-\infty}^{\infty}x[n]\cdot w[n-mR]\cdot e^{-j\omega n}$$

其中 $w[n]$ 是窗函数,$R$ 是跳距(hop size),$m$ 是帧编号。帧长越大,频率分辨率越高($\Delta_f = f_s/N$),但时间分辨率越差——这是一条经典的不确定原理 trade-off。

工程中的身影:音乐软件的实时频谱动画就是 STFT 的可视化结果。语音识别系统(如 Siri、小爱同学)的第一步也是用 STFT 提取音频的时频特征。Shazam 的歌曲识别原理:对音频做 STFT 后提取频谱峰值构成"指纹"。

例题 6:8 点 radix-2 FFT 的分治入口

题目:说明 8 点 DFT 如何拆成两个 4 点 DFT。

目标:理解 FFT 为什么能从 $O(N^2)$ 降到 $O(N\log N)$

  1. 从定义开始:
    $$X[k]=\sum_{n=0}^{7}x[n]W_8^{kn}.$$
  2. 按偶数和奇数下标拆分:
    $$X[k]=\sum_{r=0}^{3}x[2r]W_8^{k(2r)}+\sum_{r=0}^{3}x[2r+1]W_8^{k(2r+1)}.$$
  3. 利用 $W_8^2=W_4$
    $$X[k]=\sum_{r=0}^{3}x[2r]W_4^{kr}+W_8^k\sum_{r=0}^{3}x[2r+1]W_4^{kr}.$$
  4. 定义两个 4 点 DFT:$E[k]$ 为偶数样本的 4 点 DFT,$O[k]$ 为奇数样本的 4 点 DFT,则
    $$X[k]=E[k]+W_8^kO[k],$$
    $$X[k+4]=E[k]-W_8^kO[k],\quad k=0,1,2,3.$$

答案:8 点 DFT 可以由两个 4 点 DFT 加一层蝶形合成。继续递归,就得到 radix-2 FFT。

易错点:FFT 不是近似算法,它算出的仍然是精确 DFT;快来自复用对称性和周期性。

例题 7:512 点 DFT 直接计算与 FFT 运算时间

题目:计算机每次复乘 $5\,\mu\text{s}$,每次复加 $0.5\,\mu\text{s}$。计算 512 点 DFT,直接计算和 FFT 各需多少时间?

目标:体会 FFT 的工程加速比。

  1. 直接计算:$N^2=262\,144$ 次复乘,$N(N-1)=261\,632$ 次复加。
    $$T_{\text{直}}=262144\times 5+261632\times 0.5=1\,441\,536\,\mu\text{s}\approx 1.44\,\text{s}.$$
  2. FFT:$\frac{N}{2}\log_2 N=2304$ 次复乘,$N\log_2 N=4608$ 次复加。
    $$T_{\text{FFT}}=2304\times 5+4608\times 0.5=13\,824\,\mu\text{s}\approx 13.8\,\text{ms}.$$

答案:直接计算约 $1.44\,\text{s}$,FFT 约 $13.8\,\text{ms}$,加速比约 $104$ 倍。

例题 8:4 点基 2 按时间抽取 FFT 流程图

题目:画出 4 点基 2 按时间抽取(DIT)FFT 的蝶形流程图。

目标:掌握 FFT 蝶形运算的位序重排和旋转因子分配。

  1. 位序重排:输入按偶奇下标分开:$x(0),x(2),x(1),x(3)$(比特逆序)。
  2. 第一级蝶形$W_4^0=1$):
    $$A(0)=x(0)+x(2),\quad A(1)=x(0)-x(2),\quad A(2)=x(1)+x(3),\quad A(3)=x(1)-x(3).$$
  3. 第二级蝶形(旋转因子 $W_4^0=1$$W_4^1=-j$):
    $$X(0)=A(0)+A(2),\quad X(1)=A(1)-jA(3),\quad X(2)=A(0)-A(2),\quad X(3)=A(1)+jA(3).$$

答案:两级蝶形,共 $8$ 次复加、$1$ 次复乘($W_4^1=-j$ 的乘法只需交换实虚部符号,实际 $0$ 次通用复乘)。

Part 7 · 性质与速查
做题常用性质与复习速查表

7.1 DFT 做题常用性质

性质时域DFT 域用途
线性$ax[n]+by[n]$$aX[k]+bY[k]$拆分序列
循环时移$x[(n-n_0)\bmod N]$$e^{-j2\pi kn_0/N}X[k]$处理延迟
循环频移$e^{j2\pi k_0n/N}x[n]$$X[(k-k_0)\bmod N]$搬移频谱
循环卷积$x[n]\circledast_N h[n]$$X[k]H[k]$快速滤波
时域相乘$x[n]h[n]$$\frac{1}{N}X[k]\circledast_N H[k]$窗函数分析
共轭对称$x[n]$ 为实数$X[N-k]=X^*[k]$减少计算和检查结果
Parseval$\sum_{n=0}^{N-1}|x[n]|^2$$\frac1N\sum_{k=0}^{N-1}|X[k]|^2$能量核对

例题 9:DFT 帕塞瓦定理的证明

题目:写出并证明 DFT 的帕塞瓦定理。

目标:建立时域能量与频域能量的对应关系。

  1. 将 IDFT 表达式 $x(n)=\frac{1}{N}\sum_{k=0}^{N-1}X(k)W_N^{-kn}$ 代入 $\sum|x(n)|^2=\sum x(n)x^*(n)$
  2. 交换求和顺序,内层 $\sum_{n=0}^{N-1}x(n)W_N^{kn}=X^*(k)$(正交性)。
  3. 化简得 $\frac{1}{N}\sum_{k=0}^{N-1}|X(k)|^2$

答案:$\sum_{n=0}^{N-1}|x(n)|^2=\frac{1}{N}\sum_{k=0}^{N-1}|X(k)|^2$

物理意义:信号的总能量在时域和频域相等(差一个归一化因子 $1/N$)。这是能量守恒在离散频域中的体现。
工程中的身影:通信系统中的能量检测:接收端计算信号功率时,可以在频域用帕塞瓦定理验证时域功率计算的正确性,也可以直接在频域做子载波功率分配。

7.2 复习速查表

问题核心公式关键判断常见误区
求 DFT$X[k]=\sum x[n]e^{-j2\pi kn/N}$长度 $N$ 是否明确旋转因子符号写反
求 IDFT$x[n]=\frac1N\sum X[k]e^{j2\pi kn/N}$归一化因子位置漏掉 $1/N$
循环卷积$\sum_m x[m]h[(n-m)\bmod N]$是否发生回绕当成线性卷积
线性卷积$N\ge L_x+L_h-1$是否足够零填充补零长度不够
FFT 复杂度$O(N\log_2N)$$N$ 是否适合分解以为 FFT 是新变换
实序列频谱$X[N-k]=X^*[k]$共轭对称误把后半频谱当新信息
频谱泄漏选 Hann 窗频率是否对齐 bin以为加窗能提高分辨率
零填充$\Delta_f = f_s/N$ 不变真正分辨率由信号时长决定以为补零能提高分辨率
Part 8 · 频域内插
DFT 频点之间是什么?从频谱采样到信号重建

DFT 只在 $N$ 个离散频点 $\omega_k=2\pi k/N$ 上给出了频谱值。如果想知道两个频点之间的连续频谱是什么——比如想要更高分辨率地观察谱峰——就用到频域内插。

DFT 频点 $X[k]$ 到连续 DTFT 频谱 $X(e^{j\omega})$ 的内插公式为

$$X(e^{j\omega})=\sum_{k=0}^{N-1}X[k]\,\phi\!\left(\omega-\frac{2\pi k}{N}\right),$$

其中 $\phi(\omega)$ 是内插函数,它是单个矩形窗序列 $R_N[n]$ 的 DTFT:

$$\phi(\omega)=\frac1N\cdot\frac{\sin(N\omega/2)}{\sin(\omega/2)}\,e^{-j(N-1)\omega/2}.$$

翻译成自然语言:每个 $X[k]$ 被一个中心在 $\omega_k$ 上的 $\operatorname{dirc}$ 型函数(类似 sinc)加权,相邻频点的旁瓣相互重叠后精确重建了完整的连续频谱。这也意味着,零填充到更长 $N$ 后再做 DFT 得到的并不是新的信息——它只是在相同 DTFT 曲线上更密集地采样。

零填充的正确理解:频率分辨率(区分两个相邻正弦的能力)由有效信号持续时间 $T$ 决定:$\Delta_f = 1/T$。零填充不增加任何关于信号的新信息,无法提高真正的频谱分辨率。它的实际价值在于:(1) 频谱可视化——更密集的频率采样让谱线更平滑;(2) 精确频率估计——通过内插找到 sinc 主瓣峰值的精确位置;(3) 对齐 FFT 长度——某些硬件/库要求长度为 2 的幂。

如果把 DFT 和连续信号连起来看,还有一个重要的关系:设采样周期为 $T$ 的离散序列 $x[n]$ 的 DFT 为 $X[k]$,连续信号 $x(t)$ 的 FT 是 $X(j\Omega)$,则在频率点 $\Omega_k=k\Omega_0=k\cdot 2\pi f_s / N$ 处有

$$X(k\Omega_0)=T\cdot\sum_{n=0}^{N-1}x(nT)e^{-jkn2\pi T f_s/N}=T\cdot X[k].$$

这意味着 DFT 频点值乘上 $T$ 就逼近了原连续信号的频谱采样值。这个关系在工程中用来标定频谱的物理单位。

工程中的身影:音乐软件中频谱的平滑显示——本质上就是补零后对 DFT 频点做视觉内插,让谱线看起来连续,但真正的频率分辨率并没有提高。
PDF频域内插与频谱采样 · p.91–95p.91–95
正在渲染 PDF 第 91 页…
正在渲染 PDF 第 95 页…
频域内插与频谱采样(PDF p.91–95) · 打开原文

例题 10:末尾补零的 $rN$ 点 DFT

题目:$x(n)$$N$ 点序列,$X(k)=\mathrm{DFT}_N[x(n)]$。将 $x(n)$ 末尾补零到 $rN$ 点:$y(n)=x(n)$$0\le n\le N-1$),$y(n)=0$$N\le n\le rN-1$)。求 $\mathrm{DFT}_{rN}[y(n)]$$X(k)$ 的关系。

目标:理解末尾补零对频谱的影响。

  1. 代入 $rN$ 点 DFT 定义:$Y(k)=\sum_{n=0}^{N-1}x(n)W_{rN}^{kn}$
  2. $k=rm$$m=0,\ldots,N-1$)时,利用 $W_{rN}^r=W_N$$Y(rm)=\sum_{n=0}^{N-1}x(n)W_N^{mn}=X(m)$
  3. $k$ 不是 $r$ 的整数倍时,$Y(k)$ 给出 DTFT 在原频点之间的内插值。

答案:$Y(rm)=X(m)$$m=0,1,\ldots,N-1$),原频点处值不变;其余 $k$ 处为新的频率内插值。

末尾补零不增加新的频谱信息,等效于在原 DTFT 曲线上更密集地采样。

例题 11:内插零值的 $rN$ 点 DFT

题目:$x(n)$$N$ 点序列。每两点之间补 $r-1$ 个零得到 $rN$ 点序列 $y(n)$,求 $\mathrm{DFT}_{rN}[y(n)]$$X(k)$ 的关系。

目标:理解时域补零对应频域频谱内插(周期复制)。

  1. $y(n)$ 只在 $n=0,r,2r,\ldots$ 处非零,代入得 $Y(k)=\sum_{i=0}^{N-1}x(i)W_{rN}^{ikr}=\sum_{i=0}^{N-1}x(i)W_N^{ik}$
  2. 这与 $N$ 点 DFT 定义形式相同,但 $k$ 取值 $0,1,\ldots,rN-1$

答案:$Y(k)=X(k\bmod N)$。时域补零使频域产生 $r$ 个周期副本,但并未增加频谱信息。

Part 9 · 后续衔接
DFT/FFT 如何通向数字滤波器

学完 DFT/FFT 后,频域分析从"能理解"变成"能计算"。下一节 数字滤波器基础与结构 会继续使用这里的思想:滤波器有频率响应,频率响应可以通过 DFT 采样和 FFT 计算,FIR 滤波器也可以通过快速卷积实现。

如果说 DTFT 是理论镜头,DFT 是有限网格,FFT 就是实际相机。没有 FFT,大规模频谱分析和实时数字滤波很难成为工程常规工具。

参考来源