Skip to content

B.2 降采样:从高速到低速

一段音频用 16 kHz 采样保存,每秒有 16000 个样本。现在要把它存成 8 kHz,每秒只留8000 个样本。音频内容没变,采样网格变稀了,原来一秒 16000 个位置,现在只有 8000 个位置。

容易想到的办法是每隔一个样本保留一个,保留第 0、2、4、… 个样本,丢掉第 1、3、5、… 个样本。这样确实把样本数减半,采样率也降到原来的一半。但降低采样率不只是少存一些数,采样率降了,新的 Nyquist 边界也降了。原来能表示的某些高频成分,在新采样率下可能已经越界。

隔点取样这个动作,假设原始序列有 16 个样本:

x[n]=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]x[n] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

做 2 倍降采样时,保留偶数下标位置的样本:

y[m]=[1,3,5,7,9,11,13,15]y[m] = [1,3,5,7,9,11,13,15]

这个操作叫抽取(decimation)。对 2 倍抽取,可以写成

y[m]=x[2m]y[m] = x[2m]

对一般的 MM 倍抽取,写成

y[m]=x[mM]y[m] = x[mM]

如果原采样率是 fsf_s,抽取后的采样率变成 fs/Mf_s/M;如果原采样间隔是 TT,抽取后的采样间隔变成 MTMT。在 MATLAB 中,2 倍抽取的核心写法是:

M = 2;
y = x(1:M:end);
图B.2-1:直接抽取
图B.2-1:直接抽取

这段代码只说明取哪些样本,它能改变样本数和采样率,但不能保证降采样后的信号仍然正确。要检查的是原信号中的频率成分,新的采样率还能不能表示。

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 两个频率成分:

x[n]=cos(2π200016000n)+cos(2π600016000n)x[n] = \cos\left(2\pi\frac{2000}{16000}n\right) + \cos\left(2\pi\frac{6000}{16000}n\right)

在 16 kHz 采样率下,2 kHz 和 6 kHz 都低于 8 kHz 的 Nyquist 边界,这两个频率都能被区分。如果直接做 2 倍抽取,输出序列为

y[m]=x[2m]=cos(2π20008000m)+cos(2π60008000m)\begin{aligned} y[m] &= x[2m] \\ &= \cos\left(2\pi\frac{2000}{8000}m\right) + \cos\left(2\pi\frac{6000}{8000}m\right) \end{aligned}

抽取后的采样率是 8 kHz。对 8 kHz 采样来说,6 kHz 已经超过 4 kHz 的 Nyquist 边界。离散时间频率以采样率为周期,6 kHz 与 68=26-8=-2 kHz 落在同一个位置。对余弦信号,2-2 kHz 和 22 kHz 表现为同一个实频率成分:

cos(2π60008000m)=cos(2π20008000m)=cos(2π20008000m)\cos\left(2\pi\frac{6000}{8000}m\right) = \cos\left(-2\pi\frac{2000}{8000}m\right) = \cos\left(2\pi\frac{2000}{8000}m\right)

原来的 6 kHz 成分折回到了 2 kHz。若两个分量幅度相同、相位也正好对齐,直接抽取后的结果会变成

y[m]=2cos(2π20008000m)y[m] = 2\cos\left(2\pi\frac{2000}{8000}m\right)

输出中只剩一个 2 kHz 位置的结果,里面既有原来的 2 kHz,也有从 6 kHz 折回来的成分。抽取之后,已经无法判断这两部分各自来自哪里。

这个现象叫混叠(aliasing)。在降采样中,混叠不是细节变少,而是高频成分伪装成低频成分。

图B.2-2:抽取后的混叠
图B.2-2:抽取后的混叠

先看 2 倍抽取。输出频率 ω\omega 处,可能来自原频谱中的两个位置:

ω2,ω2π2\frac{\omega}{2}, \qquad \frac{\omega-2\pi}{2}

这两个位置在抽取后都会乘以 2:

2ω2=ω,2ω2π2=ω2π2\cdot\frac{\omega}{2}=\omega,\qquad 2\cdot\frac{\omega-2\pi}{2}=\omega-2\pi

ω\omegaω2π\omega-2\pi 在离散时间频谱里是同一个位置。因此,2 倍抽取后的输出频谱可以写成

Y(ejω)=12[X(ejω/2)+X(ej(ω2π)/2)]Y(e^{j\omega}) = \frac{1}{2} \left[ X\left(e^{j\omega/2}\right) + X\left(e^{j(\omega-2\pi)/2}\right) \right]

括号里的两项,就是原频谱中两个位置的贡献。它们只要同时不为零,就会加到同一个输出频率上。

推广到 MM 倍抽取,输出频率 ω\omega 会对应原频谱中的 MM 个位置:

ωM,ω2πM,,ω2π(M1)M\frac{\omega}{M},\quad \frac{\omega-2\pi}{M},\quad \cdots,\quad \frac{\omega-2\pi(M-1)}{M}

把这 MM 份贡献相加,就得到一般公式:

Y(ejω)=1Mk=0M1X(ej(ω2πk)/M)Y(e^{j\omega}) = \frac{1}{M} \sum_{k=0}^{M-1} X\left(e^{j(\omega-2\pi k)/M}\right)

这里的证明推导写的比较粗略,详细请看奥本海姆的离散时间信号处理第三版,4.6.1小节。只知道结论不影响使用,不过我还是喜欢追根究底推一遍。

式子里的 kk 只是在枚举这些来源。前面的 1/M1/M 是换尺度产生的归一化系数;混叠由后面的求和项决定。抽取会让频率位置按 MM 倍展开,再按 2π2\pi 周期折回。折回到同一位置的频谱副本相加,就发生混叠。

安全条件可以写成

ωπM|\omega| \leq \frac{\pi}{M}

如果原信号在抽取前含有超过这个范围的频率成分,MM 倍抽取后就可能发生混叠。对于 2 倍抽取,安全频带是 ωπ/2|\omega|\leq \pi/2。混叠一旦发生,事后滤波不能恢复原来的高频信息,因为不同来源的频率成分已经加到同一个输出频率位置,滤波器看不到它们原来的身份。

防止混叠的方法是在抽取之前先做低通滤波。降采样前的低通滤波器称为抗混叠滤波器,它保留目标采样率还能表达的低频部分,压掉会在抽取后折回来的高频部分。

对 16 kHz 降到 8 kHz 的任务,目标采样率的 Nyquist 边界是 4 kHz,在抽取前应该先压掉 4 kHz 以上的成分。用源采样率 16 kHz 来表示,4 kHz 对应的数字角频率是

ωc=2π400016000=π2\omega_c = 2\pi\frac{4000}{16000} = \frac{\pi}{2}

对一般的 MM 倍降采样,理想抗混叠低通滤波器的截止频率为

ωc=πM\omega_c = \frac{\pi}{M}

理想频率响应可以写成

Haa(ejω)={1,ωπ/M0,π/M<ωπH_{aa}(e^{j\omega}) = \begin{cases} 1, & |\omega| \leq \pi/M \\ 0, & \pi/M < |\omega| \leq \pi \end{cases}
图B.2-3:抗混叠滤波器
图B.2-3:抗混叠滤波器

抗混叠滤波器的通带增益通常取 1。它的任务是保留可用低频并压制高频,不需要像升采样低通那样乘以 LL 来补偿插零造成的幅度稀释。实际滤波器不能在 π/M\pi/M 处突然从 1 变成 0,因此会有过渡带。工程实现时,要根据允许的通带损伤、阻带衰减、计算量和延迟选择滤波器长度,并在截止频率附近留出余量。

滤波必须放在抽取之前。仍然看 2 kHz 和 6 kHz 的双音信号,如果先抽取,6 kHz 已经折回到 2 kHz,此时再低通,滤波器会把原来的 2 kHz 和折回来的 2 kHz 一起保留下来,滤波器无法从同一个 2 kHz 位置分辨它们的来源。

完整的 MM 倍降采样系统包含两个动作,先低通滤波,再抽取。若滤波后的中间序列记为 v[n]v[n],则

v[n]=h[n]x[n]v[n] = h[n] * x[n] y[m]=v[mM]y[m] = v[mM]

其中 h[n]h[n] 是抗混叠低通滤波器,* 表示卷积。

图B.2-4:降采样系统框图
图B.2-4:降采样系统框图

对 16 kHz 到 8 kHz 的例子,降采样倍数为

M=160008000=2M = \frac{16000}{8000} = 2

先设计截止频率为 π/2\pi/2 的低通滤波器,对原序列滤波,滤波后再保留第 0、2、4、… 个样本。时域上是减少样本数,频域上是在降低采样率前先删除新系统无法表达的高频内容。

下面是 2 倍降采样的 MATLAB 核心实现:

M = 2;
h = fir1(50,1/M); % 1/M 对应数字频率 pi/M
v = conv(x, h, 'same'); % 抽取前先抗混叠滤波
y = v(1:M:end); % 再每 M 个样本取一个

fir1 的截止频率按 Nyquist 频率归一化,1/M 对应数字角频率 π/M\pi/Mconv(x, h, 'same') 完成低通滤波,v(1:M:end) 完成抽取。这里的滤波器系数不乘以 MM,因为降采样滤波器的通带增益取 1。

升采样和降采样都要用低通滤波器,但低通出现的位置不同,原因在于两种操作制造的问题不同。

项目升采样降采样
典型任务8 kHz 到 16 kHz16 kHz 到 8 kHz
改变采样率的动作插零 L\uparrow L抽取 M\downarrow M
主要频域问题插零后出现镜像频谱高频成分折回低频形成混叠
低通滤波位置插零之后抽取之前
截止频率π/L\pi/Lπ/M\pi/M
通带增益LL1
滤波目的去除已经产生的镜像防止抽取时发生混叠

升采样时,插零先把采样网格变密,随后产生的镜像可以用低通滤波去掉。降采样时,抽取会丢弃样本,若高频成分已经折回低频,信息来源就无法分开。降采样的安全流程是先低通,再抽取。直接抽取只有在输入信号已经限制到 ωπ/M|\omega|\leq \pi/M 时才安全。