Skip to content

B.3 分数倍率变换

前两节各处理一种情况:8 kHz 到 16 kHz,先插零再低通;16 kHz 到 8 kHz,先低通再抽取。实际系统里,目标采样率往往不是原来的整数倍,也不是整除关系。

比如 CD 常见采样率是 44.1 kHz,很多音频设备内部用 48 kHz。两套采样时刻对不上:44.1 kHz 每秒 44100 个点,48 kHz 每秒 48000 个点,大部分时刻都错开了,不能把 44.1 kHz 的样本原样搬到 48 kHz 的位置上。

把 44.1 kHz 转成 48 kHz,采样率之比是

4800044100=160147\frac{48000}{44100}=\frac{160}{147}

也就是说目标采样率是原来的 160/147160/147 倍。把一秒画成一条时间轴:44.1 kHz 在上面标出 44100 个采样时刻,48 kHz 标出 48000 个,除了少数重合点,目标时刻大多落在原样本之间。

解决办法是先建立一套更密的中间采样时刻。原样本先放到这套时刻上,低通滤波器补出中间位置的值,再从中取出目标采样率需要的那些。对 L/ML/M 倍这种分数倍率变换,流程如图B.3-1。

图B.3-1:L/M 变换系统
图B.3-1:L/M 变换系统

插零 LL 倍之后,中间采样率变成 LfsL f_s。再抽取 MM 倍,输出采样率变成

fs=fsLMf_s' = f_s\frac{L}{M}

这套中间时刻同时容纳了原采样率和目标采样率的位置:升采样把原样本放到足够密的格子上,降采样再从里面取出目标位置的样本。

图B.3-2:中间采样时刻
图B.3-2:中间采样时刻

L/ML/M 转换里的低通滤波器要同时做两件事:去掉插零带来的镜像,以及防止后续抽取产生混叠。

插零 LL 倍之后,镜像从 π/L\pi/L 附近开始出现。为了抗镜像,截止频率不能超过

πL\frac{\pi}{L}

接下来还要抽取 MM 倍,为了防混叠,中间序列在抽取前也得限制在

πM\frac{\pi}{M}

以内。

两个条件都要满足,截止频率取较小的那个:

ωc=min(πL,πM)\omega_c = \min\left(\frac{\pi}{L},\frac{\pi}{M}\right)

用 MATLAB 的 fir1 时,截止频率按 Nyquist 归一化,写法是

cutoff=min(1L,1M)\text{cutoff} = \min\left(\frac{1}{L},\frac{1}{M}\right)

升采样低通的通带增益还要乘以 LL

约束来源限制含义
插零 LL截止频率不高于 π/L\pi/L去除升采样镜像
抽取 MM截止频率不高于 π/M\pi/M防止降采样混叠
二者合并ωc=min(π/L,π/M)\omega_c=\min(\pi/L,\pi/M)同时满足抗镜像和抗混叠

先用小比例把流程走一遍。假设要把采样率变成原来的 3/23/2 倍,即 L=3,M=2L=3, M=2。输入采样率为 100 Hz,输出就是

100×32=150 Hz100\times\frac{3}{2}=150\text{ Hz}

完整流程:先插零 3 倍,把 100 Hz 的样本放到 300 Hz 的中间时刻上;低通滤波;再每 2 个样本取 1 个,得到 150 Hz。

L = 3;
M = 2;
x_up = zeros(1, L*length(x));
x_up(1:L:end) = x;
h = fir1(60, min(1/L, 1/M));
h = L * h;
v = conv(x_up, h, 'same');
y = v(1:M:end);

代码里 x_up(1:L:end) = x 是插零,fir1(60, min(1/L, 1/M)) 设计合并后的低通滤波器,h = L * h 补偿插零带来的幅度稀释,最后 v(1:M:end) 完成抽取。

图B.3-3:3/2 倍采样率转换
图B.3-3:3/2 倍采样率转换

回到音频转换。44.1 kHz 到 48 kHz 的比例是

4800044100=160147\frac{48000}{44100}=\frac{160}{147}

所以取

L=160,M=147L=160,\qquad M=147

系统流程如图B.3-4。

图B.3-4:44.1 kHz 到 48 kHz
图B.3-4:44.1 kHz 到 48 kHz

低通滤波器的归一化截止频率是

min(1160,1147)=1160\min\left(\frac{1}{160},\frac{1}{147}\right)=\frac{1}{160}

1/1601/160,是因为插零 160 倍后镜像间隔更窄,抗镜像的约束更严。滤波器通带增益还要乘以 160。

这个例子插了 159 个零,计算量很大。工程上不会真把所有零都算出来,而是用多相滤波器等结构减少计算。本节只要掌握原理流程:先升到更密的中间时刻,低通保留输入和输出都能表达的频带,再抽取到目标采样率。

L/ML/M 转换里一般先升采样,再滤波,再降采样。要是先降采样,原信号中高于降采样后 Nyquist 边界的部分可能已经混叠;再升采样,只是把已经混叠的结果搬到更密的位置上,折回的高频信息回不来了。

以 44.1 kHz 到 48 kHz 为例:先升到更密的中间时刻不会丢信息;低通再决定保留哪些频率;最后抽取只是在已限带的信号上取目标样本。

在 MATLAB 里,resample(x, L, M) 可以做同样的事。看懂手写流程之后,就不会把 resample 当黑箱了:它内部做的还是升采样、低通滤波和降采样,只是实现更高效。