B.2 降采样:从高速到低速
一段音频用 16 kHz 采样保存,每秒有 16000 个样本。现在要把它存成 8 kHz,每秒只留8000 个样本。音频内容没变,采样网格变稀了,原来一秒 16000 个位置,现在只有 8000 个位置。
容易想到的办法是每隔一个样本保留一个,保留第 0、2、4、… 个样本,丢掉第 1、3、5、… 个样本。这样确实把样本数减半,采样率也降到原来的一半。但降低采样率不只是少存一些数,采样率降了,新的 Nyquist 边界也降了。原来能表示的某些高频成分,在新采样率下可能已经越界。
隔点取样这个动作,假设原始序列有 16 个样本:
做 2 倍降采样时,保留偶数下标位置的样本:
这个操作叫抽取(decimation)。对 2 倍抽取,可以写成
对一般的 倍抽取,写成
如果原采样率是 ,抽取后的采样率变成 ;如果原采样间隔是 ,抽取后的采样间隔变成 。在 MATLAB 中,2 倍抽取的核心写法是:
M = 2;y = x(1:M:end);
这段代码只说明取哪些样本,它能改变样本数和采样率,但不能保证降采样后的信号仍然正确。要检查的是原信号中的频率成分,新的采样率还能不能表示。
直接抽取造成混叠
Section titled “直接抽取造成混叠”16 kHz 采样时,Nyquist 边界是 8 kHz。降到 8 kHz 后,新的 Nyquist 边界只有 4 kHz。原信号中 0 到 4 kHz 的成分可以继续保留,4 kHz 到 8 kHz 之间的成分在 16 kHz 采样率下原本合法,但不能直接带入 8 kHz 的新网格。
用一个双音信号看这个问题。原始信号以 16 kHz 采样,里面有 2 kHz 和 6 kHz 两个频率成分:
在 16 kHz 采样率下,2 kHz 和 6 kHz 都低于 8 kHz 的 Nyquist 边界,这两个频率都能被区分。如果直接做 2 倍抽取,输出序列为
抽取后的采样率是 8 kHz。对 8 kHz 采样来说,6 kHz 已经超过 4 kHz 的 Nyquist 边界。离散时间频率以采样率为周期,6 kHz 与 kHz 落在同一个位置。对余弦信号, kHz 和 kHz 表现为同一个实频率成分:
原来的 6 kHz 成分折回到了 2 kHz。若两个分量幅度相同、相位也正好对齐,直接抽取后的结果会变成
输出中只剩一个 2 kHz 位置的结果,里面既有原来的 2 kHz,也有从 6 kHz 折回来的成分。抽取之后,已经无法判断这两部分各自来自哪里。
这个现象叫混叠(aliasing)。在降采样中,混叠不是细节变少,而是高频成分伪装成低频成分。

先看 2 倍抽取。输出频率 处,可能来自原频谱中的两个位置:
这两个位置在抽取后都会乘以 2:
而 和 在离散时间频谱里是同一个位置。因此,2 倍抽取后的输出频谱可以写成
括号里的两项,就是原频谱中两个位置的贡献。它们只要同时不为零,就会加到同一个输出频率上。
推广到 倍抽取,输出频率 会对应原频谱中的 个位置:
把这 份贡献相加,就得到一般公式:
这里的证明推导写的比较粗略,详细请看奥本海姆的离散时间信号处理第三版,4.6.1小节。只知道结论不影响使用,不过我还是喜欢追根究底推一遍。
式子里的 只是在枚举这些来源。前面的 是换尺度产生的归一化系数;混叠由后面的求和项决定。抽取会让频率位置按 倍展开,再按 周期折回。折回到同一位置的频谱副本相加,就发生混叠。
安全条件可以写成
如果原信号在抽取前含有超过这个范围的频率成分, 倍抽取后就可能发生混叠。对于 2 倍抽取,安全频带是 。混叠一旦发生,事后滤波不能恢复原来的高频信息,因为不同来源的频率成分已经加到同一个输出频率位置,滤波器看不到它们原来的身份。
防止混叠的方法是在抽取之前先做低通滤波。降采样前的低通滤波器称为抗混叠滤波器,它保留目标采样率还能表达的低频部分,压掉会在抽取后折回来的高频部分。
对 16 kHz 降到 8 kHz 的任务,目标采样率的 Nyquist 边界是 4 kHz,在抽取前应该先压掉 4 kHz 以上的成分。用源采样率 16 kHz 来表示,4 kHz 对应的数字角频率是
对一般的 倍降采样,理想抗混叠低通滤波器的截止频率为
理想频率响应可以写成

抗混叠滤波器的通带增益通常取 1。它的任务是保留可用低频并压制高频,不需要像升采样低通那样乘以 来补偿插零造成的幅度稀释。实际滤波器不能在 处突然从 1 变成 0,因此会有过渡带。工程实现时,要根据允许的通带损伤、阻带衰减、计算量和延迟选择滤波器长度,并在截止频率附近留出余量。
滤波必须放在抽取之前。仍然看 2 kHz 和 6 kHz 的双音信号,如果先抽取,6 kHz 已经折回到 2 kHz,此时再低通,滤波器会把原来的 2 kHz 和折回来的 2 kHz 一起保留下来,滤波器无法从同一个 2 kHz 位置分辨它们的来源。
完整降采样系统
Section titled “完整降采样系统”完整的 倍降采样系统包含两个动作,先低通滤波,再抽取。若滤波后的中间序列记为 ,则
其中 是抗混叠低通滤波器, 表示卷积。

对 16 kHz 到 8 kHz 的例子,降采样倍数为
先设计截止频率为 的低通滤波器,对原序列滤波,滤波后再保留第 0、2、4、… 个样本。时域上是减少样本数,频域上是在降低采样率前先删除新系统无法表达的高频内容。
下面是 2 倍降采样的 MATLAB 核心实现:
M = 2;h = fir1(50,1/M); % 1/M 对应数字频率 pi/Mv = conv(x, h, 'same'); % 抽取前先抗混叠滤波y = v(1:M:end); % 再每 M 个样本取一个fir1 的截止频率按 Nyquist 频率归一化,1/M 对应数字角频率 。conv(x, h, 'same') 完成低通滤波,v(1:M:end) 完成抽取。这里的滤波器系数不乘以 ,因为降采样滤波器的通带增益取 1。
升采样与降采样的对照
Section titled “升采样与降采样的对照”升采样和降采样都要用低通滤波器,但低通出现的位置不同,原因在于两种操作制造的问题不同。
| 项目 | 升采样 | 降采样 |
|---|---|---|
| 典型任务 | 8 kHz 到 16 kHz | 16 kHz 到 8 kHz |
| 改变采样率的动作 | 插零 | 抽取 |
| 主要频域问题 | 插零后出现镜像频谱 | 高频成分折回低频形成混叠 |
| 低通滤波位置 | 插零之后 | 抽取之前 |
| 截止频率 | ||
| 通带增益 | 1 | |
| 滤波目的 | 去除已经产生的镜像 | 防止抽取时发生混叠 |
升采样时,插零先把采样网格变密,随后产生的镜像可以用低通滤波去掉。降采样时,抽取会丢弃样本,若高频成分已经折回低频,信息来源就无法分开。降采样的安全流程是先低通,再抽取。直接抽取只有在输入信号已经限制到 时才安全。