DFT 与 FFT
前置知识回顾
DFT 和 FFT 是把前面几节的理论变成可计算算法的关键。读这一节前,先把下面几件事放在手边:
- DTFT:知道 $X(e^{j\omega})$ 是 $2\pi$ 周期的连续频谱。可回看 DTFT 笔记。
- 复指数正交性:不同频率槽位的复指数在一个周期内求和为 0,这是 DFT 能反变换的根本。
- 卷积:知道线性卷积长度为 $L_x+L_h-1$,并理解卷积中"平移、翻转、相乘、求和"的操作。
- 周期延拓:DFT 默认长度为 $N$ 的序列首尾相接,这会把普通卷积变成循环卷积。
1.1 为什么有了 DTFT 还要 DFT
DTFT 给出的是连续频率函数 $X(e^{j\omega})$,理论上很完整,但计算机不能直接保存"连续函数"。实际实验和工程里,我们拿到的是有限长样本块,比如一段语音、一帧图像行信号、一段传感器记录。要分析这段有限数据的频率结构,就必须把连续频率轴离散化。
DFT 做的事情就是:在一个 $2\pi$ 周期内取 $N$ 个等间隔频率点,把频谱变成长度为 $N$ 的复数数组。这样一来,频域分析就能进入矩阵运算和程序实现。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 的问世,直接推动了数字信号处理学科的诞生。
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 才是真正能让机器逐点算出来的有限维变换。
1.3 对偶性证明
上面给出了定性结论:时域离散→频域周期,频域离散→时域周期。现在从数学定义出发,把这两条链各自严格推导一遍。
证明一:时域离散化 → 频域周期化
设时域信号 $x[n]$ 是离散序列($n$ 取整数),其 DTFT 为
把自变量 $\omega$ 替换为 $\omega+2\pi$:
关键一步:因为 $n$ 是整数,所以
于是
频域以 $2\pi$ 为周期。如果 $n$ 不是整数而是连续变量 $t$,那么 $e^{-j2\pi t}\neq 1$(除非 $t$ 恰好为整数),周期性不成立。所以周期性的根源在于 $n$ 的离散(整数)性。
证明二:频域离散化 → 时域周期化
设频域信号 $X[k]$ 在等间隔频率点上取值($k$ 取整数),通过 IDFS/IDFT 恢复时域:
把 $n$ 替换为 $n+N$:
计算第二项:
因为 $k$ 是整数,$e^{j2\pi k}=1$。所以
时域以 $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 对应的时域序列不具有周期性。
| 变换 | 时域变量 | 频域变量 | 谁离散→谁周期 |
|---|---|---|---|
| FT | $t$ 连续 | $\Omega$ 连续 | 都连续 → 都非周期 |
| FS | $t$ 连续,$T$ 周期 | $k$ 离散 | 时域周期 → 频域离散;频域离散又反推时域周期 |
| DTFT | $n$ 离散 | $\omega$ 连续 | $n$ 整数 → 频域 $2\pi$ 周期 |
| DFS/DFT | $n$ 离散 | $k$ 离散 | $n$ 整数 → 频域周期;$k$ 整数 → 时域周期 |
2.1 N 点 DFT 与 IDFT
长度为 $N$ 的序列 $x[0],x[1],\ldots,x[N-1]$ 的 DFT 定义为
令 $W_N=e^{-j2\pi/N}$,也可写成
反变换为 IDFT(逆离散傅里叶变换,Inverse Discrete Fourier Transform):
fft() 和 ifft() 实现。$k$ 不是普通编号,而是频率槽位。它对应的角频率为 $\omega_k=2\pi k/N$。当采样频率为 $f_s$ 时,第 $k$ 个频点对应物理频率 $f_k=kf_s/N$,但超过 $N/2$ 的频点通常解释为负频率。
2.2 正交性:为什么 IDFT 能恢复序列
DFT 的核心代数基础是复指数正交性:
如果两个频率槽位不同,它们在一个完整周期里的旋转方向会均匀绕圈,求和相互抵消;如果频率槽位相同,每一项都是 1,求和为 $N$。IDFT 前面的 $1/N$ 正是为了抵消这个归一化因子。
从线性代数角度看,DFT 是把 $x$ 投影到一组正交复指数基上;IDFT 是把这些基按系数加回来。
2.3 周期延拓:DFT 的隐含假设
DFT 公式看起来只是一个有限求和,但它背后隐含了一个至关重要的假设:你输入的 $N$ 点序列不是一个"有始有终"的有限信号,而是一个无限周期信号的一个周期。
这个隐含假设叫周期延拓(periodic extension):
也就是说,DFT 在数学上处理的不是 $x[n]$,而是把 $x[0],x[1],\ldots,x[N-1]$ 首尾相接无限重复后得到的周期序列 $\tilde{x}[n]$。DFT 系数 $X[k]$ 本质上是这个周期序列的傅里叶级数系数。
为什么这个假设如此重要?因为周期延拓会改变信号的物理含义。同一个有限长序列,用不同的 $N$ 做 DFT,意味着不同的周期延拓方式,从而对应完全不同的周期信号。具体例子见本章末尾例题区。
2.4 周期 $N$ 与序列长度 $L$ 的关系
设原始序列 $x[n]$ 的实际长度为 $L$(即 $x[n]$ 在 $0\le n\le L-1$ 之外全为零),DFT 点数为 $N$。$N$ 与 $L$ 的相对大小直接决定了周期延拓后信号的物理含义:
| 情况 | 周期延拓效果 | 频谱含义 | 典型场景 |
|---|---|---|---|
| $N=L$ | 序列恰好填满一个周期,首尾相接 | DFT 是 DTFT 的 $L$ 个等间隔采样 | 默认情况,最"紧凑"的延拓 |
| $N>L$(补零) | 序列后补 $N-L$ 个零再延拓,周期变长 | 频域采样更密,看到更多 DTFT 细节;但不增加信息量,不提高真实频率分辨率 | 栅栏效应减轻,频谱可视化更平滑 |
| $N<L$(截断) | 只取前 $N$ 个点做延拓,后面的数据被丢弃 | 时域信息丢失,频谱失真;相当于先加矩形窗再做 DFT | 通常应避免,除非有意截断 |
核心原则:
- 补零($N>L$)改变的是频域采样密度,不改变 DTFT 本身。它让栅栏更密,看到更多细节,但主瓣宽度(真实频率分辨率)由原始数据长度 $L$ 决定,补零无法缩窄主瓣。
- 截断($N<L$)是真正的信息丢失。被丢弃的 $L-N$ 个样本永远消失了,频谱会产生额外的泄漏和失真。
- 周期延拓的"边界效应"取决于 $N$ 与信号实际周期的关系。如果信号本身是周期性的且 $N$ 恰好是整数个周期,边界处连续,频谱干净;否则边界不连续会产生频谱泄漏。
周期延拓的三个直接后果:
- 循环移位:DFT 中的"移位"不是普通平移,而是循环移位——从右边移出的元素会从左边绕回来。因为周期延拓后没有"边界",$x[N]=x[0]$。
- 循环卷积:DFT 域乘法对应的是循环卷积而非线性卷积。线性卷积的"尾巴"会在周期边界处折回,产生混叠。
- 频谱泄漏与栅栏效应:周期延拓在边界处可能产生不连续(除非信号恰好是整数个周期),这种不连续在频域表现为频谱泄漏。同时 DFT 只在离散频点采样,可能"漏掉"重要的频谱特征。
fft(x) 时,你实际上在说:"把 $x$ 当作一个周期信号的一个周期,求它的傅里叶级数。"理解这一点,DFT 的所有"奇怪行为"——循环卷积、频谱泄漏、补零效应——都变得自然了。2.5 综合例题:矩形序列 $R_4(n)$ 的 DFT 与幅频特性
题目:设 $x(n)=R_4(n)=[1,1,1,1]$,分别求 4 点 DFT 和 8 点 DFT,并分析它们与 DTFT 幅频曲线的关系。
目标:理解 DFT 是 DTFT 的频域采样,不同点数对应不同采样密度,揭示栅栏效应与周期延拓的影响。
Step 0: DTFT 幅频特性。
$R_4(n)$ 的 DTFT 为
幅度响应为经典的Dirichlet 核(数字 sinc)形状:
在 $\omega=0$ 处主瓣峰值为 $4$,零点位于 $\omega=\pi/2,\;\pi,\;3\pi/2$,零点之间有旁瓣。
Step 1: 4 点 DFT。
$N=4$,$W_4=e^{-j2\pi/4}=-j$,采样频率 $\omega_k=2\pi k/4$:
- $k=0$:$X_4(0)=1+1+1+1=4$
- $k=1$:$X_4(1)=1+(-j)+(-1)+j=0$
- $k=2$:$X_4(2)=1+(-1)+1+(-1)=0$
- $k=3$:$X_4(3)=1+j+(-1)+(-j)=0$
4 点采样位置与 DTFT 的对应:
| $k$ | $\omega_k$ | $|X(e^{j\omega_k})|$ | $|X_4(k)|$ | 采样位置 |
|---|---|---|---|---|
| 0 | $0$ | $4$ | $4$ | 主瓣峰值 |
| 1 | $\pi/2$ | $0$ | $0$ | 第一个零点 |
| 2 | $\pi$ | $0$ | $0$ | 第二个零点 |
| 3 | $3\pi/2$ | $0$ | $0$ | 第三个零点 |
4 点 DFT 的采样间隔 $\Delta\omega=\pi/2$ 恰好等于 DTFT 零点间距,所有采样点恰好落在零点或主瓣峰值上,旁瓣完全被"漏掉"。
Step 2: 8 点 DFT(末尾补 4 个零)。
$y(n)=[1,1,1,1,0,0,0,0]$,$N=8$,$W_8=e^{-j2\pi/8}=e^{-j\pi/4}$,采样频率 $\omega_k=2\pi k/8=\pi k/4$:
用几何级数公式 $X_8(k)=\dfrac{1-e^{-j\pi k}}{1-e^{-j\pi k/4}}$:
- $k=0$:$X_8(0)=4$
- $k=1$:$X_8(1)=\dfrac{2}{1-e^{-j\pi/4}}$,$|X_8(1)|=\sqrt{4+2\sqrt{2}}\approx 2.613$
- $k=2$:$X_8(2)=1+(-j)+(-1)+j=0$(恰好落在 DTFT 零点 $\omega=\pi/2$)
- $k=3$:$X_8(3)=\dfrac{2}{1-e^{-j3\pi/4}}$,$|X_8(3)|=\sqrt{4-2\sqrt{2}}\approx 1.082$
- $k=4$:$X_8(4)=0$(落在 DTFT 零点 $\omega=\pi$)
- $k=5$:共轭对称,$|X_8(5)|=|X_8(3)|\approx 1.082$
- $k=6$:$X_8(6)=0$(落在 DTFT 零点 $\omega=3\pi/2$)
- $k=7$:共轭对称,$|X_8(7)|=|X_8(1)|\approx 2.613$
8 点采样位置与 DTFT 的对应:
| $k$ | $\omega_k$ | $|X(e^{j\omega_k})|$ | $|X_8(k)|$ | 采样位置 |
|---|---|---|---|---|
| 0 | $0$ | $4$ | $4$ | 主瓣峰值 |
| 1 | $\pi/4$ | $\approx 2.613$ | $\approx 2.613$ | 主瓣下降沿 |
| 2 | $\pi/2$ | $0$ | $0$ | 第一个零点 |
| 3 | $3\pi/4$ | $\approx 1.082$ | $\approx 1.082$ | 第一旁瓣 |
| 4 | $\pi$ | $0$ | $0$ | 第二个零点 |
| 5 | $5\pi/4$ | $\approx 1.082$ | $\approx 1.082$ | 对称旁瓣 |
| 6 | $3\pi/2$ | $0$ | $0$ | 第三个零点 |
| 7 | $7\pi/4$ | $\approx 2.613$ | $\approx 2.613$ | 对称主瓣 |
Step 3: 4 点 vs 8 点 DFT 的核心区别。
| 对比维度 | 4 点 DFT | 8 点 DFT |
|---|---|---|
| 采样间隔 | $\Delta\omega=\pi/2$ | $\Delta\omega=\pi/4$(加密一倍) |
| 采样点位置 | $0,\;\pi/2,\;\pi,\;3\pi/2$ | $0,\;\pi/4,\;\pi/2,\;3\pi/4,\;\pi,\;5\pi/4,\;3\pi/2,\;7\pi/4$ |
| 幅度谱 | $[4,0,0,0]$ | $[4,\;2.6,\;0,\;1.1,\;0,\;1.1,\;0,\;2.6]$ |
| 看到的频谱特征 | 只有 DC 分量,其余为零 | 看到主瓣下降沿和旁瓣($k=1,3,5,7$),同时 $k=2,4,6$ 仍落在零点 |
| 栅栏效应 | 严重——采样点恰好全落在零点上 | 减轻——中间采样点揭示了旁瓣 |
| 频率分辨率 | 粗($\pi/2$) | 细($\pi/4$) |
Step 4: 周期延拓视角。为什么 4 点和 8 点 DFT 结果不同?回顾本节 2.3 和 2.4 的讨论:DFT 在数学上等价于先把有限长序列周期延拓成周期序列,再求 DFS 系数。4 点延拓得到全 1 常数序列(只有 DC),8 点延拓得到周期方波(含奇次谐波)。同一个 $[1,1,1,1]$,延拓周期不同,频谱自然不同。
例题区
例:$R_4(n)=[1,1,1,1]$ 的两种周期延拓
4 点延拓:$\tilde{x}_4[n] = [\ldots, 1,1,1,1,\; 1,1,1,1, \ldots]$ → 全 1 常数序列 → 只有 DC → $X_4(k)=[4,0,0,0]$
8 点延拓(先补零到 8 点):$\tilde{x}_8[n] = [\ldots, 1,1,1,1,0,0,0,0,\; 1,1,1,1,0,0,0,0, \ldots]$ → 周期方波(占空比 50%)→ 含奇次谐波 → $X_8(k)=[4,\;2.6,\;0,\;1.1,\;0,\;1.1,\;0,\;2.6]$
同一个 $[1,1,1,1]$,延拓周期不同,得到的周期信号完全不同,频谱自然不同。
例题 1:手算 4 点 DFT
题目:设 $x[n]=[1,2,0,0]$,求 4 点 DFT。
目标:熟悉 DFT 定义中每个频点的计算。
- 写出 4 点旋转因子:$W_4=e^{-j2\pi/4}=e^{-j\pi/2}=-j$。
- 逐点计算:
$$X[k]=\sum_{n=0}^{3}x[n]W_4^{kn}=1+2W_4^k.$$
- 代入 $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]$。
例题 2:求 $a^n R_N(n)$ 的 $N$ 点 DFT
题目:设 $x(n)=a^n R_N(n)$,求 $N$ 点 DFT。
目标:熟悉几何级数在 DFT 中的处理。
- 写出 DFT 定义:
$$X(k)=\sum_{n=0}^{N-1}a^n W_N^{kn}=\sum_{n=0}^{N-1}(aW_N^k)^n.$$
- $k=0$ 时:$W_N^0=1$,故 $X(0)=\sum_{n=0}^{N-1}a^n=\frac{1-a^N}{1-a}$($a\neq 1$ 时)。
- $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$。
例题 3:求 $\delta(n-n_0)$ 的 $N$ 点 DFT
题目:设 $x(n)=\delta(n-n_0)$,$0<n_0<N$,求 $N$ 点 DFT。
目标:理解冲激序列的 DFT 就是旋转因子本身。
- 代入定义:$X(k)=\sum_{n=0}^{N-1}\delta(n-n_0)W_N^{kn}=W_N^{kn_0}$。
- 物理含义:时域延迟 $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}$。
例题 3.1:数值计算 $\delta(n-2)$ 的 5 点 DFT
题目:已知 $x(n)=\delta(n-2)$,求其 5 点 DFT。
解:5 点 DFT 定义为
因为 $x(n)=\delta(n-2)$ 只有 $n=2$ 处为 1,其余为 0,所以
逐点写出:
物理解释:时域冲激右移 2 个样本,频域各频点获得与频率 $k$ 成正比的线性相位 $-4\pi k/5$,幅度保持为 1。这正好体现了 DFT 的时移性质:延迟 $n_0$ 对应频域乘以 $W_N^{kn_0}$。
例题 4:余弦序列的 DFT
题目:设 $x(n)=\cos\left(\dfrac{\pi n}{6}\right)$,$n=0,1,\ldots,11$,求 12 点 DFT。
目标:理解纯余弦信号的 DFT 是两根谱线,掌握用 Euler 公式和正交性快速求解。
- Euler 展开:
$$x(n)=\cos\left(\frac{\pi n}{6}\right)=\frac{1}{2}\left(e^{j\pi n/6}+e^{-j\pi n/6}\right)$$
- 写成旋转因子形式:$N=12$,$W_{12}=e^{-j2\pi/12}=e^{-j\pi/6}$,所以
$$e^{j\pi n/6}=e^{j2\pi n/12}=W_{12}^{-n},\qquad e^{-j\pi n/6}=W_{12}^{n}$$
即 $x(n)=\dfrac{1}{2}(W_{12}^{-n}+W_{12}^{n})$。
- 利用正交性:DFT 定义 $X(k)=\sum_{n=0}^{N-1}x(n)W_N^{kn}$,而
$$\sum_{n=0}^{N-1}W_N^{mn}=\begin{cases}N,&m\equiv 0\pmod N,\\0,&m\not\equiv 0\pmod N.\end{cases}$$
所以 $W_{12}^{-n}$ 的 DFT 是 $12\cdot\delta(k-1)$(频率槽位 $m=-1\equiv 11\pmod{12}$),$W_{12}^{n}$ 的 DFT 是 $12\cdot\delta(k+1)=12\cdot\delta(k-11)$(频率槽位 $m=1$)。
答案:
即 $X(k)$ 只在 $k=1$ 和 $k=11$ 处非零,值均为 6:
DFT 的所有性质都根源于一个事实:DFT 隐含了周期延拓假设(见 Part 2 的 2.3 节)。理解了这一点,下面的每条性质都变得自然。
3.1 线性性质
DFT 是线性变换,满足叠加原理:
这是 DFT 定义中求和运算线性的直接结果。做题时常用它把复杂序列拆成简单序列分别求 DFT 再叠加。
3.2 循环移位性质
时域循环移位:
时域循环移位 $m$ 位,频域只产生相位旋转,幅度谱不变。注意这里的移位是循环移位——从右边移出的元素会从左边绕回来,因为周期延拓后没有"边界"。
频域循环移位(对偶性质):
时域乘以复指数 $e^{j2\pi ln/N}$,频域循环移位 $l$ 位。这是频谱搬移的数学基础。
3.3 循环卷积定理
在 DTFT 中,时域线性卷积对应频域乘法。但在 DFT 中,因为序列被默认周期延拓,频域逐点乘法对应的是长度为 $N$ 的循环卷积:
其中循环卷积定义为:
这里的 $\bmod N$ 表示索引超出边界后会绕回前面。普通线性卷积的尾巴如果超过 $N-1$,在循环卷积里就会折叠到开头,这叫时域混叠或循环混叠。
| 卷积类型 | 参与对象 | 核心公式 | 与 DFT 的关系 |
|---|---|---|---|
| 线性卷积 | 任意有限/无限序列 $x[n],h[n]$ | $y_l[n]=\sum_{m=-\infty}^{\infty}x[m]h[n-m]$ | DTFT 域相乘 |
| 周期卷积 | 周期序列 $\tilde{x}[n],\tilde{h}[n]$(周期 $N$) | $\tilde{y}[n]=\sum_{m=0}^{N-1}\tilde{x}[m]\tilde{h}[n-m]$ | DFS 域相乘 |
| 圆周卷积 | 有限长序列 $x[n],h[n]$($0\le n\le N-1$) | $y_c[n]=\sum_{m=0}^{N-1}x[m]h[(n-m)\bmod N]$ | DFT 域相乘 |
循环卷积和线性卷积之间有一个严谨的数学关系:长度为 $L$ 的循环卷积等于线性卷积的周期延拓再截取。设 $x_1[n]$ 长度为 $L$,$x_2[n]$ 长度为任意长,记线性卷积为 $y_l[n]=x_1[n]*x_2[n]$,则循环卷积
可以展开为
证明的核心步骤是:把 $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$ 的项会互相重叠——这就是时域混叠。
对偶性质(时域相乘):
时域相乘对应频域循环卷积(带 $1/N$ 归一化)。这是加窗分析的数学基础——时域加窗等于频域与窗函数频谱做循环卷积,导致频谱泄漏。
3.4 复共轭与共轭对称性
复共轭的 DFT:
推导:$\sum_{n=0}^{N-1} x^*[n] W_N^{kn} = \left(\sum_{n=0}^{N-1} x[n] W_N^{-kn}\right)^* = X^*[-k]$。注意 $-k \bmod N = N-k$($k \ne 0$ 时)。
实序列的共轭对称性:当 $x[n]$ 为实序列时,
证明:因为 $x[n]$ 是实序列,$x^*[n]=x[n]$,所以 $\text{DFT}\{x^*[n]\}=\text{DFT}\{x[n]\}=X[k]$。另一方面,由复共轭性质 $\text{DFT}\{x^*[n]\}=X^*[N-k]$,因此
两边取共轭即得 $X[N-k]=X^*[k]$。
直接推导:也可以从 DFT 定义直接验证。由
而 $W_N^{Nn}=e^{-j\frac{2\pi}{N}Nn}=e^{-j2\pi n}=1$,所以
这意味着:
- 幅度谱偶对称:$|X[N-k]| = |X[k]|$
- 相位谱奇对称:$\arg X[N-k] = -\arg X[k]$
- 实部偶对称,虚部奇对称
特殊点:$X[0]$ 和 $X[N/2]$($N$ 为偶数时)必为实数。
直觉 1:$W_N$ 本身是共轭配对的
DFT 公式里的复指数 $W_N^k = e^{-j2\pi k/N}$,它和 $W_N^{-k}=W_N^{N-k}$ 是一对共轭。所以 DFT 天然就在"正负频率成对出现"的框架上工作。实序列只能产生实系数组合,这就要求正负频率分量互为共轭,以保证输出为实数。
直觉 2:三角函数的奇偶性
把 $W_N^{kn}$ 拆为 $\cos(\omega_k n) - j\sin(\omega_k n)$。展开 $X[k]$:
正频率 $\omega_k$ 和负频率 $-\omega_k = \omega_{N-k}$ 互为共轭($\cos$ 是偶函数、$\sin$ 是奇函数),所以 $X[N-k]$ 和 $X[k]$ 互为共轭。
直觉 3:实信号的物理本质
任何可测量的物理量(电压、压力、温度)都是实数。频谱里的复数表示中,虚部对应"90° 相移的无功分量"。如果正负频率的虚部不互为相反数,输出就会带虚部——违反实信号定义。所以实信号的频谱必须共轭对称,这是物理强制的结果,不是 DFT 的数学巧合。
实偶序列 $X[k]$ 必为实偶函数;实奇序列 $X[k]$ 必为纯虚奇函数。这是后续"频谱"和"对称性"章节的基石。
3.5 Parseval 定理
时域能量等于频域能量(差归一化因子):
证明:从左边出发,将 $|x[n]|^2$ 拆为 $x[n]\,x^*[n]$:
将 IDFT 公式代入其中一个 $x[n]$:
得:
考察 (*) 项:
代回原式:
证毕。
核心思路:把 $|x[n]|^2$ 拆成 $x[n]x^*[n]$,用 IDFT 替换其中一个 $x[n]$,交换求和顺序后,内层求和恰好是 $X^*(k)$。物理意义是能量守恒在离散频域中的体现。
3.6 频谱泄漏与窗函数
频谱泄漏的本质不是信号的问题,而是边界假设的问题。DFT 隐含假设输入是周期信号的单个周期。当信号实际频率 $f_0$ 不等于任何 DFT 分析频率(即 $f_0 \neq k \cdot f_s / N$)时,信号周期延拓在边界处产生不连续性。为了拟合这个尖锐跳变,DFT 被迫在所有频率上分配能量。
从数学上看,对无限长信号做 $N$ 点 DFT 等价于先加矩形窗截断再做 DFT。时域相乘对应频域循环卷积,矩形窗的频谱(Dirichlet 核)与信号真实频谱卷积后,能量从主瓣"泄漏"到旁瓣。
减少泄漏的方法是使用非矩形窗(Hamming、Hanning、Blackman 等),它们以加宽主瓣为代价压低旁瓣:
| 窗函数 | 主瓣宽度 | 旁瓣峰值 | 适用场景 |
|---|---|---|---|
| 矩形窗 | $4\pi/N$ | $-13$ dB | 频率分辨率优先 |
| Hanning | $8\pi/N$ | $-31$ dB | 通用频谱分析 |
| Hamming | $8\pi/N$ | $-41$ dB | 需要低旁瓣 |
| Blackman | $12\pi/N$ | $-57$ dB | 旁瓣抑制优先 |
3.7 性质速查表
| 性质 | 时域 | 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[n]$ 为实数 | $X[N-k]=X^*[k]$ | 减少计算和检查结果 |
| Parseval | $\sum|x[n]|^2$ | $\frac1N\sum|X[k]|^2$ | 能量核对 |
3.8 Parseval 定理例题
Parseval 定理的证明细节见本章末尾例题区。配套的工程实例:
3.9 复习速查表
| 问题 | 核心公式 | 关键判断 | 常见误区 |
|---|---|---|---|
| 求 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$ 不变 | 真正分辨率由信号时长决定 | 以为补零能提高分辨率 |
例题区
例题:复共轭的 DFT 数值计算
题目:已知 $x(n)$ 的 4 点 DFT 为 $X(k)=\left\{1,\; \dfrac{1}{2}+j,\; -2,\; 1+j\right\}$,求 $x^*(n)$ 的 4 点 DFT。
解:由复共轭性质 $\text{DFT}\{x^*(n)\} = X^*(N-k)$,$N=4$:
- $k=0$:$X^*(4) = X^*(0) = 1^* = 1$
- $k=1$:$X^*(3) = (1+j)^* = 1-j$
- $k=2$:$X^*(2) = (-2)^* = -2$
- $k=3$:$X^*(1) = \left(\dfrac{1}{2}+j\right)^* = \dfrac{1}{2}-j$
例题:实序列共轭对称性求奇数点 DFT
题目:已知 $N=7$ 点实序列的 DFT 偶数点的值如下,求 DFT 奇数点的值:
解:$x(n)$ 为实序列,由共轭对称性 $X(k) = X^*(N-k)$,$N=7$:
- $X(1) = X^*(7-1) = X^*(6) = (5.2+j3.7)^* = 5.2-j3.7$
- $X(3) = X^*(7-3) = X^*(4) = (2.4+j4.2)^* = 2.4-j4.2$
- $X(5) = X^*(7-5) = X^*(2) = (3.1+j2.5)^* = 3.1-j2.5$
例题 4:为什么线性卷积需要零填充
题目:设 $x=[1,1,1]$,$h=[1,1]$。比较 3 点循环卷积和线性卷积。
目标:看清楚循环混叠是怎么发生的。
- 线性卷积:
$$x*h=[1,2,2,1].$$
长度为 $3+2-1=4$。
- 若只做 3 点循环卷积:线性卷积的第 4 个样本会折回第 1 个位置,所以得到
$$y_3=[1+1,2,2]=[2,2,2].$$
- 正确零填充:把两序列补到 $N\ge4$,例如 $x=[1,1,1,0]$、$h=[1,1,0,0]$,再做 4 点循环卷积,就得到线性卷积 $[1,2,2,1]$。
答案:3 点循环卷积为 $[2,2,2]$,不是线性卷积;零填充到 4 点后才得到正确线性卷积。
例题 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)$?
目标:理解循环卷积与线性卷积的混叠关系。
- 线性卷积长度:$6+15-1=20$。
- 15 点循环卷积:$f(n)=\sum_{r=-\infty}^{\infty}[x*y](n+15r)$,$n=0,\ldots,14$。
- 混叠分析:$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$)发生混叠。
例题 9:DFT 帕塞瓦定理的证明
题目:写出并证明 DFT 的帕塞瓦定理。
目标:建立时域能量与频域能量的对应关系。
- 将 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)$。
- 交换求和顺序,内层 $\sum_{n=0}^{N-1}x(n)W_N^{kn}=X^*(k)$(正交性)。
- 化简得 $\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$。
4.1 DFT 是 DTFT 的等间隔采样
如果把有限长序列看成
它的 DTFT 是
在 $\omega_k=2\pi k/N$ 处采样,就得到
这说明 DFT 不是凭空发明的新变换,而是 DTFT 在有限网格上的采样。但 DFT 的反变换会把这 $N$ 个频点解释成一个长度为 $N$ 的周期序列,因此边界处理和循环结构会自然出现。
4.2 DFS:DFT 的周期延拓根基
严格说,DFT 是周期序列的离散傅里叶级数(DFS)被矩形窗截取一个周期后的结果。DFS 处理周期序列 $\tilde{x}[n]$(周期 $N$),其定义是
$\tilde{X}[k]$ 本身也是周期为 $N$ 的序列。DFS 逆变换恢复周期序列:
DFS 和 DFT 的数学表达式一模一样,唯一的区别是解读方式:DFS 的输入和输出都默认是周期无限的,DFT 的输入和输出都视为有限长的主值区间。两者的关系可以写作
其中 $R_N[\cdot]$ 是矩形窗(主值区间 $0\le n \le N-1$ 内为 1,其余为 0)。
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 把有限长序列当作周期序列的一个周期来对待)。
4.3 频域采样定理
时域采样定理告诉我们:对带限信号以足够高的频率采样,可以无失真地恢复原信号。频域采样定理是其对偶:对有限长序列的频谱(DTFT)在频域采样足够多的点,可以无失真地恢复原序列。
问题提出:设 $x[n]$ 是长度为 $M$ 的有限长序列($x[n]=0$,$n$ 在 $[0, M-1]$ 之外),其 DTFT 为 $X(e^{j\omega})$。在 $N$ 个等间隔频点 $\omega_k=2\pi k/N$ 上对 $X(e^{j\omega})$ 采样,得到 $X[k]=X(e^{j2\pi k/N})$。问:$N$ 至少取多少,才能从 $X[k]$ 无失真地恢复 $x[n]$?
定理内容:当频域采样点数 $N \ge M$ 时,IDFT 可以精确恢复原序列:
当 $N < M$ 时,恢复出的序列发生时域混叠(aliasing),无法无失真恢复。
推导:对 DTFT 做频域采样得到 $X[k]$,再做 IDFT,得到的序列 $x_N[n]$ 是原序列 $x[n]$ 的周期延拓再取主值:
其中 $R_N[n]$ 是长度为 $N$ 的矩形窗。当 $N \ge M$ 时,平移后的副本 $x[n+rN]$($r \ne 0$)完全落在窗外,不与主值区间重叠,因此 $x_N[n] = x[n]$,无混叠。当 $N < M$ 时,相邻周期的序列尾部会折叠进主值区间,产生时域混叠。
- 时域采样定理:时域采样(间隔 $T$)→ 频域周期延拓(周期 $f_s=1/T$)。无失真条件:采样率 $f_s \ge 2f_{\max}$(奈奎斯特准则)。
- 频域采样定理:频域采样($N$ 个点)→ 时域周期延拓(周期 $N$)。无失真条件:$N \ge M$(序列长度)。
频域采样定理的工程意义:
- DFT 的本质就是频域采样:$N$ 点 DFT 就是对 DTFT 在 $N$ 个等间隔频点上采样。只要 $N \ge M$,DFT 包含了原序列的全部信息,IDFT 可以完美重建。
- 补零不增加信息:$N > M$ 时(末尾补零),频域采样更密,但重建出的序列只是原序列后面加了零,没有新的时域信息。
- 截断会丢失信息:$N < M$ 时,频域采样不够密,IDFT 恢复的序列发生时域混叠,是原序列的失真版本。具体例子见本章末尾例题区。
4.4 频域内插:DFT 频点之间是什么?
DFT 只在 $N$ 个离散频点 $\omega_k=2\pi k/N$ 上给出了频谱值。如果想知道两个频点之间的连续频谱是什么——比如想要更高分辨率地观察谱峰——就用到频域内插。
DFT 频点 $X[k]$ 到连续 DTFT 频谱 $X(e^{j\omega})$ 的内插公式为
其中 $\phi(\omega)$ 是内插函数,它是单个矩形窗序列 $R_N[n]$ 的 DTFT:
翻译成自然语言:每个 $X[k]$ 被一个中心在 $\omega_k$ 上的 $\operatorname{dirc}$ 型函数(类似 sinc)加权,相邻频点的旁瓣相互重叠后精确重建了完整的连续频谱。这也意味着,零填充到更长 $N$ 后再做 DFT 得到的并不是新的信息——它只是在相同 DTFT 曲线上更密集地采样。
如果把 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$ 处有
这意味着 DFT 频点值乘上 $T$ 就逼近了原连续信号的频谱采样值。这个关系在工程中用来标定频谱的物理单位。
4.5 Z 域内插:从 DFT 重建完整 Z 变换
4.4 节给出的是单位圆上的内插——用 $N$ 个 $X[k]$ 重建 $X(e^{j\omega})$。如果把 $z$ 放到整个 Z 平面,DFT 同样可以重建完整的 Z 变换 $X(z)$。这就是 Z 域内插公式,有时也叫DFT 的 Z 域重建公式。
Z 域内插公式
设 $x[n]$ 为长度 $N$ 的有限序列(或取周期序列的一个主值周期),$X[k]$ 为其 $N$ 点 DFT,则其 Z 变换为
若采用 $W_N=e^{j2\pi/N}$ 的符号约定,则等价写成
推导:从 IDFT $x[n]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]W_N^{-kn}$ 出发,代入 Z 变换:
对有限项几何级数求和,利用 $W_N^{-kN}=e^{j2\pi k}=1$:
由于分子 $1-z^{-N}$ 与 $k$ 无关,可以提到求和号外,即得 Z 域内插公式。
- $1-z^{-N}$ 是梳状滤波器,在 Z 平面单位圆上有 $N$ 个等间隔零点 $z_k=e^{j2\pi k/N}$($k=0,\ldots,N-1$)。
- 求和项 $X[k]/(1-W_N^{-k}z^{-1})$ 是 $N$ 个一阶谐振器,每个在单位圆上有极点 $z=W_N^{-k}=e^{j2\pi k/N}$,恰好与梳状滤波器的零点位置相同。
- 零极点相消后,系统只在采样频率点 $\omega_k=2\pi k/N$ 上保留 $X[k]$ 决定的频响,整体仍是长度为 $N$ 的 FIR。
与频域内插公式的关系:令 $z=e^{j\omega}$,分子变为 $1-e^{-jN\omega}$,分母变为 $1-W_N^{-k}e^{-j\omega}=1-e^{-j(\omega-2\pi k/N)}$。整理后正是 4.4 节的频域内插函数 $\phi(\omega)$。所以 Z 域内插公式是频域内插公式的 Z 平面推广,后者只是前者在单位圆上的特例。
例题区
例题:$N < M$ 时的时域混叠
题目:已知 $x(n) = \{1, 2, 3, 4, 5, 4, 3, 2, 1\}$,$X(k)$ 是序列 $x(n)$ 的傅里叶变换在 $[0, 2\pi]$ 上的 8 点等间隔采样。请写出 $X(k)$ 的 8 点 IDFT 变换序列。
分析:$x(n)$ 长度 $M=9$,频域采样点数 $N=8 < M$,不满足频域采样定理的无混叠条件。IDFT 恢复的序列为:
原序列只有 $x[0]$ 到 $x[8]$ 非零,所以 $r=0$ 和 $r=-1$ 的项有贡献:
- $n=0$:$x[0] + x[0+8] = 1+1 = 2$(混叠!)
- $n=1$:$x[1] + x[9] = 2+0 = 2$
- $n=2$:$x[2] + x[10] = 3+0 = 3$
- $n=3$:$x[3] = 4$
- $n=4$:$x[4] = 5$
- $n=5$:$x[5] = 4$
- $n=6$:$x[6] = 3$
- $n=7$:$x[7] = 2$
例题 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)$ 的关系。
目标:理解末尾补零对频谱的影响。
- 代入 $rN$ 点 DFT 定义:$Y(k)=\sum_{n=0}^{N-1}x(n)W_{rN}^{kn}$。
- 当 $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)$。
- 当 $k$ 不是 $r$ 的整数倍时,$Y(k)$ 给出 DTFT 在原频点之间的内插值。
答案:$Y(rm)=X(m)$($m=0,1,\ldots,N-1$),原频点处值不变;其余 $k$ 处为新的频率内插值。
例题 11:内插零值的 $rN$ 点 DFT
题目:设 $x(n)$ 为 $N$ 点序列。每两点之间补 $r-1$ 个零得到 $rN$ 点序列 $y(n)$,求 $\mathrm{DFT}_{rN}[y(n)]$ 与 $X(k)$ 的关系。
目标:理解时域补零对应频域频谱内插(周期复制)。
- $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}$。
- 这与 $N$ 点 DFT 定义形式相同,但 $k$ 取值 $0,1,\ldots,rN-1$。
答案:$Y(k)=X(k\bmod N)$。时域补零使频域产生 $r$ 个周期副本,但并未增加频谱信息。
5.1 直接计算 DFT 的运算量
DFT 的定义式为
每个 $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)$ 地算,它在工程中几乎没用。
5.2 减少运算量的途径
直接计算 DFT 之所以慢,是因为每一个 $X[k]$ 都独立地遍历所有 $N$ 个 $x[n]$,各 $X[k]$ 之间没有共享任何中间结果。FFT 的核心突破就是:利用旋转因子 $W_N$ 的性质,让不同的 $X[k]$ 共享计算。
旋转因子 $W_N=e^{-j2\pi/N}$ 有两个关键性质:
旋转因子的对称性与周期性
- 对称性:$W_N^{k+N/2}=-W_N^k$(相差半圈,方向相反)
- 周期性:$W_N^{k+N}=W_N^k$(转一整圈回到起点),由此推出 $W_N^2=W_{N/2}$
- 可约性:$W_N^2=W_{N/2}$,$W_N^4=W_{N/4}$,$\ldots$
这意味着:如果我们把 $N$ 点 DFT 拆成两个 $N/2$ 点 DFT,它们的旋转因子从 $W_N$ 变成 $W_{N/2}$,恰好可以利用 $W_N^2=W_{N/2}$ 复用已有计算。这就是分治的起点。
FFT(Fast Fourier Transform,快速傅里叶变换)是什么
FFT 不是一个新变换,而是计算 DFT 的一种快速算法。它算出的结果和直接按定义算的完全一样,但把计算量从 $O(N^2)$ 降到 $O(N\log_2 N)$。
核心思想:分治——把一个 $N$ 点 DFT 拆成两个 $N/2$ 点 DFT,递归下去,最终只需要 $\frac{N}{2}\log_2 N$ 次复乘。
这个思想最早由 Gauss 在 1805 年提出,1965 年 Cooley 和 Tukey 的论文使其广为人知。FFT 被誉为 20 世纪最重要的数值算法之一。
FFT 的两条路线:DIT 与 DIF
分治的关键问题是:"拆什么?" DFT 有输入端(时域 $x[n]$)和输出端(频域 $X[k]$),两侧都可以拆。
| DIT(按时间抽取) | DIF(按频率抽取) | |
|---|---|---|
| 拆分对象 | 输入序列 $x[n]$:按 $n$ 的奇偶分成两组 | 输出频谱 $X[k]$:按 $k$ 的奇偶分成两组 |
| "时间抽取"含义 | 对时间变量 $n$ 做抽取(下采样) | — |
| "频率抽取"含义 | — | 对频率变量 $k$ 做抽取(下采样) |
| 输入顺序 | 需 bit-reversal 重排 | 自然顺序 |
| 输出顺序 | 自然顺序 | 需 bit-reversal 重排 |
| 旋转因子位置 | 蝶形前(先乘后加减) | 蝶形后(先加减后乘) |
两者运算量完全相同($\frac{N}{2}\log_2 N$ 次复乘),只是分解视角不同。下面先讲 DIT(教材主线),再讲 DIF(对偶形式)。
5.3 按时间抽取(DIT)基 2 FFT
5.3.1 分解推导
要求 $N=2^M$。思路:把输入序列按偶数和奇数下标拆成两组,分别做 $N/2$ 点 DFT,再用一层合成得到完整的 $N$ 点 DFT。
对 $N=2M$ 的 DFT,按偶数和奇数样本拆开:
利用 $W_N^2=W_{N/2}=W_M$,得到
$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$,得
5.3.2 蝶形运算
上面这对公式就是蝶形运算(butterfly)。一对输入 $(E[k],\,O[k])$ 通过一次复乘 $W_N^k O[k]$ 和两次加减,同时产生两个输出 $X[k]$ 和 $X[k+M]$。上下两支只差一个加减号。
| 输入 | 运算 | 输出 |
|---|---|---|
| $E[k]$, $W_N^k O[k]$ | $+$(加) | $X[k]=E[k]+W_N^k O[k]$ |
| $E[k]$, $W_N^k O[k]$ | $-$(减) | $X[k{+}M]=E[k]-W_N^k O[k]$ |
$O[k] \xrightarrow{\times W_N^k} W_N^k O[k] \longrightarrow \begin{cases} E[k]+W_N^k O[k] = X[k] \\ E[k]-W_N^k O[k] = X[k{+}M] \end{cases}$
递归拆分到 2 点 DFT 后,整个计算量满足
5.3.3 $N=8$ DIT 的完整分解过程
以 $N=8$ 为例,展示 DIT FFT 的三层分解。
第一层:$8\to 4+4$
偶数序列 $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\to 2+2$(对 $X_1$ 和 $X_2$ 各做一次)
对 $X_1$:偶偶序列 $x[0],x[4]$ 做 2 点 DFT,偶奇序列 $x[2],x[6]$ 做 2 点 DFT,用 $W_4$ 合成。
对 $X_2$:奇偶序列 $x[1],x[5]$ 做 2 点 DFT,奇奇序列 $x[3],x[7]$ 做 2 点 DFT,用 $W_4$ 合成。
第三层:$2\to 1+1$,2 点 DFT 就是一个无旋转因子的蝶形:$X[0]=a+b$,$X[1]=a-b$。
5.3.4 码位倒读(Bit-Reversal):为什么会这样?
逐层追踪 $N=8$ 的输入重排
原始输入:$x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]$,下标二进制:$000,001,010,011,100,101,110,111$。
第一层拆分——按最低位(LSB)分组:
- 偶数(LSB=0):$x[0]_{000},\,x[2]_{010},\,x[4]_{100},\,x[6]_{110}$
- 奇数(LSB=1):$x[1]_{001},\,x[3]_{011},\,x[5]_{101},\,x[7]_{111}$
第二层拆分——在每组内按次低位分组:
- 偶偶(最低两位=00):$x[0]_{000},\,x[4]_{100}$
- 偶奇(最低两位=10):$x[2]_{010},\,x[6]_{110}$
- 奇偶(最低两位=01):$x[1]_{001},\,x[5]_{101}$
- 奇奇(最低两位=11):$x[3]_{011},\,x[7]_{111}$
最终排列(从上到下):
| 排列位置 | 原始下标 | 二进制 | 位反转 | 排列后的值 |
|---|---|---|---|---|
| 0 | 0 | 000 | 000 | $x[0]$ |
| 1 | 4 | 100 | 001 | $x[4]$ |
| 2 | 2 | 010 | 010 | $x[2]$ |
| 3 | 6 | 110 | 011 | $x[6]$ |
| 4 | 1 | 001 | 100 | $x[1]$ |
| 5 | 5 | 101 | 101 | $x[5]$ |
| 6 | 3 | 011 | 110 | $x[3]$ |
| 7 | 7 | 111 | 111 | $x[7]$ |
结论:第一层拆分按最低位分,第二层按次低位分,第三层按最高位分。最终排列顺序恰好是把原始下标的二进制位从右到左读,即码位倒读(Bit-Reversal)。
Bit-reversal 的对合性:位反转操作做两次就回到原序($(i^R)^R = i$),所以只需交换每一对 $(i,\,i^R)$ 即可原地完成重排,不需要额外数组。
5.3.5 原位计算(In-Place Computation)
FFT 的原地特性意味着所有中间结果直接覆盖原数组位置,无需额外存储空间——$N$ 点 FFT 只需 $O(N)$ 的存储。这是因为每一级蝶形运算的输出对 $(X[k],X[k+M])$ 恰好写入输入对 $(E[k],O[k])$ 原来的位置,不会影响其他蝶形的输入。
5.4 按频率抽取(DIF)基 2 FFT
DIF 是 DIT 的对偶形式。DIT 对输入按 $n$ 的奇偶分组(拆时间端),DIF 对输出按 $k$ 的奇偶分组(拆频率端)。两者殊途同归,算出来的 $X[k]$ 完全一样。
5.4.1 分解推导
将 $N$ 点 DFT 的求和拆成前半段和后半段:
利用 $W_N^{kN/2}=(-1)^k$,分 $k$ 的奇偶讨论:
偶数频点 $k=2r$:此时 $(-1)^k=1$:
这正是 $N/2$ 点 DFT,输入是前半段与后半段之和 $a[n]=x[n]+x[n+N/2]$。
奇数频点 $k=2r+1$:此时 $(-1)^k=-1$:
这也是 $N/2$ 点 DFT,输入是差值乘旋转因子 $b[n]=(x[n]-x[n+N/2])W_N^n$。
5.4.2 DIF 蝶形与信号流图
DIF 的蝶形与 DIT 不同:先加减,后乘旋转因子。
递归分解到 2 点 DFT 后,$X[k]$ 按码位倒读顺序排列——这次不是输入端,而是输出端需要 bit-reversal 重排。
5.5 DIT 与 DIF 的完整对比
| 对比项 | DIT(按时间抽取) | DIF(按频率抽取) |
|---|---|---|
| 分解思路 | 对 $x[n]$ 按 $n$ 奇偶拆分 | 对 $X[k]$ 按 $k$ 奇偶拆分 |
| 蝶形结构 | 先乘 $W_N^k$,后加减 | 先加减,后乘 $W_N^k$ |
| 输入顺序 | bit-reversal(乱序) | 自然顺序 |
| 输出顺序 | 自然顺序 | bit-reversal(乱序) |
| 复乘次数 | $\dfrac{N}{2}\log_2 N$(完全相同) | |
| 复加次数 | $N\log_2 N$(完全相同) | |
| 原位计算 | 都支持 | |
| 转置关系 | DIT 流图转置 = DIF 流图 | |
5.6 运算量与存储
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$ 倍。
5.7 IFFT:用 FFT 算逆变换
IDFT 的定义是 $x[n]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]\,W_N^{-kn}$。与 DFT 相比只差两点:旋转因子取共轭 $W_N^{-kn}$,结果除以 $N$。因此可以用同一个 FFT 硬件/程序实现 IFFT:
步骤:输入取共轭 → 做 FFT → 输出取共轭 → 除以 $N$。这种"共轭 Trick"让所有 FFT 的优化技术自动适用于 IFFT。
5.8 其他 FFT 算法(了解)
当 $N$ 不是 2 的幂时,Radix-2 无法直接使用。但分治思想仍然适用:
- Mixed Radix:若 $N$ 可以分解为多个小素因子(如 $N=2^a\times 3^b\times 5^c$),可以用多基 Cooley-Tukey 分解。
- Rader's algorithm:将素数长度 $N$ 的 DFT 转化为长度 $N-1$ 的循环卷积,再用 FFT 计算。
- Bluestein's algorithm(chirp-Z 变换):将任意长度 $N$ 的 DFT 转化为 2 的幂长度的卷积。
5.9 频谱分析、滤波与 STFT
FFT 让 DFT 足够快,于是很多滤波和谱估计任务都可以转到频域完成:先 FFT,频域乘以滤波器响应,再 IFFT 回到时域。只要处理好零填充和块边界,就能把长信号卷积变成高效的块处理算法。
Overlap-Add(OLA)和Overlap-Save(OLS)是两种经典的分块快速卷积方法:
- OLA:将输入切成不重叠的块,每块补零后做 FFT → 频域乘法 → IFFT,相邻块的结果在重叠区相加。
- OLS:每一块输入从前一块末尾保留 $M-1$ 个样本($M$ 为滤波器长度),卷积后丢弃前 $M-1$ 个被循环混叠污染的样本。
FFT 最广泛的应用形式是短时傅里叶变换(STFT):将长信号切成重叠的短窗,对每个窗做 FFT,得到时-频二维表示:
其中 $w[n]$ 是窗函数,$R$ 是跳距(hop size),$m$ 是帧编号。帧长越大,频率分辨率越高($\Delta_f = f_s/N$),但时间分辨率越差——这是经典的测不准原理 trade-off。
例题区
例题:画出 8 点基 2 DIF FFT 流图,分析存储单元和运算量
题目:画出 8 点基 2 按频率抽取(DIF)FFT 流图,分析实现该算法所需存储单元,计算复数乘法和复数加法的次数。
(一)8 点 DIF FFT 流图
DIF 的输入是自然顺序 $x(0),x(1),\ldots,x(7)$,输出是码位倒读顺序 $X(0),X(4),X(2),X(6),X(1),X(5),X(3),X(7)$。一共 $\log_2 8=3$ 级蝶形,每级 $N/2=4$ 个蝶形。
第一级($N\to N/2$,前半段与后半段配对,旋转因子 $W_8^0\sim W_8^3$):
| 蝶形 | 上端输出 | 下端输出 |
|---|---|---|
| $x(0),x(4)$ | $x(0)+x(4)$ | $[x(0)-x(4)]W_8^0$ |
| $x(1),x(5)$ | $x(1)+x(5)$ | $[x(1)-x(5)]W_8^1$ |
| $x(2),x(6)$ | $x(2)+x(6)$ | $[x(2)-x(6)]W_8^2$ |
| $x(3),x(7)$ | $x(3)+x(7)$ | $[x(3)-x(7)]W_8^3$ |
上端 4 个输出送入偶数频点支路(最终产生 $X(0),X(2),X(4),X(6)$),下端 4 个输出送入奇数频点支路(最终产生 $X(1),X(3),X(5),X(7)$)。
第二级($N/2\to N/4$,各自再做 4 点 DFT,旋转因子 $W_4^0, W_4^1$):
偶数支路(上端 4 个)做 4 点 DIF,奇数支路(下端 4 个)做 4 点 DIF,各用 $W_4^0=1$ 和 $W_4^1=-j$ 做蝶形合成。
第三级($N/4\to 2$,2 点 DFT,旋转因子 $W_2^0=1$):
最后一层是无旋转因子的加减蝶形,输出 $X(k)$ 按 bit-reversal 排列。
完整流图参见课件 page=49(前文 5.4.2 节已展示)
(二)存储单元分析
存储需求
- 数据存储:DIF 支持原位计算(in-place),每个蝶形的两个输出直接写入输入位置,因此只需 $N=8$ 个复数存储单元存放中间数据。
- 旋转因子表:$W_8^0,W_8^1,W_8^2,W_8^3$ 共 $N/2=4$ 个独立复数值(利用对称性 $W_8^{k+4}=-W_8^k$ 只需存一半)。若不利用对称性,需存 $N=8$ 个。
- 总计:利用对称性最少需要 $8+4=12$ 个复数存储单元;不利用对称性需 $8+8=16$ 个。
(三)运算量计算
运算量
$N=8$,级数 $L=\log_2 N = 3$,每级蝶形数 $N/2 = 4$。
每个蝶形 = 1 次复乘 + 2 次复加。
- 复数乘法:$\dfrac{N}{2}\log_2 N = \dfrac{8}{2}\times 3 = \boxed{12}$ 次
- 复数加法:$N\log_2 N = 8\times 3 = \boxed{24}$ 次
例题 6:8 点 radix-2 DIT FFT 的分治入口
题目:说明 8 点 DFT 如何拆成两个 4 点 DFT。
- 从定义开始:
$$X[k]=\sum_{n=0}^{7}x[n]W_8^{kn}.$$
- 按偶数和奇数下标拆分:
$$X[k]=\sum_{r=0}^{3}x[2r]W_8^{k(2r)}+\sum_{r=0}^{3}x[2r+1]W_8^{k(2r+1)}.$$
- 利用 $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 点 DFT:令 $E[k]$ 为偶数样本的 4 点 DFT,$O[k]$ 为奇数样本的 4 点 DFT,则
$$X[k]=E[k]+W_8^kO[k],\quad X[k+4]=E[k]-W_8^kO[k],\quad k=0,1,2,3.$$
例题 7:512 点 DFT 直接计算与 FFT 运算时间
题目:计算机每次复乘 $5\,\mu\text{s}$,每次复加 $0.5\,\mu\text{s}$。计算 512 点 DFT,直接计算和 FFT 各需多少时间?
- 直接计算:$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}.$$
- 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 DIT FFT 流程图
题目:画出 4 点基 2 按时间抽取(DIT)FFT 的蝶形流程图。
- 位序重排:输入按偶奇下标分开:$x(0),x(2),x(1),x(3)$(比特逆序)。
- 第一级蝶形($W_2^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).$$
- 第二级蝶形(旋转因子 $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$ 次通用复乘)。
例题:时域周期延拓与频域插零(完整证明)
题目:已知实序列 $x(n)$ 长度为 8,其 8 点 DFT 为 $X(k)=\{0.9,\; 0.5,\; 0.3,\; 0.2,\; 0.1,\; 0.2,\; 0.3,\; 0.5\}$。构造 $y(n)=x((n))_8 R_{16}(n)$,即 $x(n)$ 重复 2 次得到长度 16 的序列。求 $y(n)$ 的 16 点 DFT $Y(k)$。
推导:
由 16 点 DFT 定义:
由于 $y(n)$ 是 $x(n)$ 重复两次,将求和拆成前 8 项和后 8 项,第二项令 $m=n-8$:
关键步骤:计算 $W_{16}^{8k}$:
因此:
$k$ 为偶数($k=2r$,$r=0,1,\ldots,7$):$(-1)^k=1$,$1+1=2$,且 $W_{16}^{2rn}=W_8^{rn}$:
$k$ 为奇数:$(-1)^k=-1$,$1+(-1)=0$:
结论:
代入数值:
学完 DFT/FFT 后,频域分析从"能理解"变成"能计算"。下一节 数字滤波器基础与结构 会继续使用这里的思想:滤波器有频率响应,频率响应可以通过 DFT 采样和 FFT 计算,FIR 滤波器也可以通过快速卷积实现。
如果说 DTFT 是理论镜头,DFT 是有限网格,FFT 就是实际相机。没有 FFT,大规模频谱分析和实时数字滤波很难成为工程常规工具。
参考来源
- 本地课程材料:《数字信号处理教程(第五版)》第 3、4 章;课程第三讲 PPT《第三讲1.pdf》;相关作业与答案。
- MIT OCW · Lecture 9: The Discrete Fourier Transform:用于核对 DFT 定义、性质与频点解释。
- MIT · DFT chapter notes:用于补充 DFT 矩阵视角和计算例题结构。
- Oxford Signal Processing Lecture 7:用于参考 DFT 和循环卷积的讲法。
- Julius O. Smith III · Mathematics of the DFT:用于补充 DTFT、DFT、FFT 的统一视角。
- The Scientist and Engineer's Guide to DSP:用于补充 FFT 工程直觉和频谱分析背景。
- Wikipedia · Cooley–Tukey FFT algorithm:用于补充 FFT 历史背景(Gauss 1805、Cooley-Tukey 1965)和算法变体。
- DSPRelated · How the Cooley-Tukey FFT Algorithm Works:用于补充 FFT 分治思想和 DIT/DIF 对比。
- National Instruments · Understanding FFTs and Windowing:用于窗函数工程选择原则。
- Brian McFee · Digital Signals Theory Ch.6 Leakage:用于频谱泄漏的直觉解释。
- Julius O. Smith III · Zero Padding Applications:用于零填充的正确理解。
- Julius O. Smith III · Overlap-Add OLA STFT Processing:用于 Overlap-Add 和 STFT 原理。