上一讲把 ZOH、线性插值和 FIR 低通插值并排比较。时域上,它们分别输出阶梯、折线和平滑曲线;频域上,差别变成了镜像压制程度和通带损伤的差别。
我们现在换一个角度看这件事,先把“中间点怎么算”放一边,改看“插零以后接了一个什么滤波器”。这样三种插值就能放到同一条处理链里。
先看 2 倍插值。原序列是 x[k],插零以后得到 x↑[n]:
x↑[2k]=x[k],x↑[2k+1]=0
偶数位置保留原样本,奇数位置先放 0。插值规则只负责把这些 0 变成合理的中间值。
如果让 x↑[n] 经过滤波器 h[n],
y[n]=x↑[n]∗h[n]
那么不同插值方法就对应不同的 h[n]。
下面几张频率响应图只比较滤波器形状,所以把直流增益归一化到了 1。实际做 2 倍插值时,滤波器的通带增益仍要对应 2,理想低通公式里也要保留这个增益。
ZOH 的规则是重复前一个样本。它可以用一个很短的滤波器写出来:
hZOH[n]=δ[n]+δ[n−1]
代入卷积式:
y[n]=x↑[n]+x↑[n−1]
于是
y[2k]=x↑[2k]+x↑[2k−1]=x[k]
y[2k+1]=x↑[2k+1]+x↑[2k]=x[k]
这正好是
[x[0],x[1],x[2],⋯]⟶[x[0],x[0],x[1],x[1],x[2],x[2],⋯]
ZOH 可以写成“先插零,再经过 [1,1] 这个短滤波器”。
图B.5-1a:ZOH 频率响应
图里这条曲线和上一讲的 ZOH 频谱图是同一件事的两面:一个看滤波器本身,一个看它作用到插零序列之后留下了什么。
图B.4-2:零阶保持的频谱
把这两张图放在一起,ZOH 的通带下垂和两侧镜像残余就能对上了。
线性插值也一样。2 倍线性插值要求旧样本保持不变,中间点取相邻两个旧样本的平均:
y[2k]=x[k],y[2k+1]=2x[k]+x[k+1]
取滤波器
hlin[n]=21δ[n+1]+δ[n]+21δ[n−1]
则
y[n]=21x↑[n+1]+x↑[n]+21x↑[n−1]
在偶数位置:
y[2k]=21x↑[2k+1]+x↑[2k]+21x↑[2k−1]=x[k]
在奇数位置:
y[2k+1]=21x↑[2k+2]+x↑[2k+1]+21x↑[2k]=2x[k+1]+x[k]
这就得到线性插值。它背后的滤波器换成了一个三点的三角形核。
图B.5-1b:线性插值频率响应
这条响应比 ZOH 更平缓,对高频的压制也更强。上一讲线性插值后的频谱更干净,原因就在这里。
图B.4-4:线性插值的频谱
FIR 低通插值更直观。它本来就是先插零,再用按频域指标设计出来的低通滤波器:
y[n]=x↑[n]∗hLPF[n]
ZOH、线性插值和 FIR 低通插值都能放进滤波器模型里,差别在滤波器形状。ZOH 的核很短,计算最省,但通带下垂和镜像残余都比较明显;线性插值多看一个相邻样本,镜像残余少一些,高频细节也会被削弱;FIR 低通插值可以按通带、阻带和过渡带设计,代价是计算量和延迟更高。
图B.5-1c:FIR 低通频率响应
把这张图和第四讲的三张频谱图放在一起:滤波器越接近理想低通,输出频谱越接近只保留基带的样子。
图B.4-6:低通插值的频谱
这张图能看清楚:低通插值会把镜像压掉,平滑只是时域上看到的结果。
前面把 ZOH 和线性插值写成了“插零后卷积一个短滤波器”。理想低通也可以这样看,只是它的滤波器不再是有限长的短核。
先把频域和时域的关系接上。序列经过滤波器时,频域里是相乘:
Y(ejω)=X↑(ejω)H(ejω)
对应时域里,是卷积:
y[n]=x↑[n]∗h[n]
所以,频域里“用矩形低通切掉镜像”,时域里一定对应“用某个 h[n] 和插零序列做卷积”。这个 h[n] 长什么样?
对 2 倍升采样,理想插值低通可以写成
H(ejω)={2,0,∣ω∣≤π/2π/2<∣ω∣≤π
通带增益为 2,用来补偿插零造成的幅度稀释。对这个矩形频率响应做反变换:
h[n]=2π1∫−π/2π/22ejωndω
当 n=0 时,
h[n]=π1[jnejωn]−π/2π/2=πn2sin(πn/2)
当 n=0 时,积分结果为 1。把 n=0 的情况合进去,可以写成
h[n]=sinc(2n)
这里采用 sinc(x)=πxsin(πx) 的定义。理想低通滤波器在时域里就是一个无限长的 sinc 核。
图B.5-2:理想低通与 sinc 插值
图 B.5-2 左边是频域里的矩形低通,右边是时域里的 sinc 卷积示意。每个输入样本都对应一条移位的 sinc 曲线,这些曲线在每个时刻相加,得到插值后的连续轨迹。原来的样本位置仍然穿过原样本;中间位置的值来自周围 sinc 曲线的共同贡献。
图B.5-3:sinc 插值验算
图 B.5-3 给出一个具体例子:一个 1 Hz 正弦经 4 Hz 采样后,再用 sinc 插值重建到 8 Hz。原信号为
x(t)=sin(2πt)
4 Hz 采样得到
x[n]=sin(2πn)
也就是 ⋯,0,1,0,−1,0,⋯ 这样的样本序列。重建公式把每个样本配上一条移位 sinc,再叠加:
xr(t)=n=−∞∑∞x[n]sinc(4t−n)
以第一个新增点 t=0.125s 为例,此时 4t=0.5,所以
xr(0.125)=n=−∞∑∞sin(2πn)sinc(0.5−n)=0.70710678
直接用原来的正弦函数计算同一时刻:
x(0.125)=sin(2π⋅0.125)=sin(4π)=0.70710678
两个数一致。图中的橙色点就是这个新增样本。
原采样点也不会被改掉。比如 t=0.25s 时,
xr(0.25)=n=−∞∑∞x[n]sinc(1−n)=x[1]=1
因为 n=1 这一项的 sinc 自变量为 0,权重为 1;其他整数位置的 sinc 权重为 0。它正好对应真实正弦
x(0.25)=sin(2π⋅0.25)=sin(2π)=1
这就是 sinc 插值的来源。它来自理想低通滤波器的时域写法,不是靠经验猜中间点。
实际系统不能使用无限长 sinc。工程中会把 sinc 截断、加窗,或者用更短的 FIR 滤波器近似。这样会引入过渡带、通带波动、阻带残留、群延迟和可能的振铃。
图B.5-4:有限长 sinc
图 B.5-4 左边把无限长 sinc 和有限窗口近似放在一起。窗口越宽,用到的邻近样本越多,越接近理想 sinc,但计算量和延迟也会上升。右边用阶跃信号提示另一个代价:有限长近似在突变附近可能出现过冲和振铃。
升采样也可以从频域角度实现。时域插零加低通是一种处理方式;频域里,也可以把频谱中间补零,再做 IFFT 得到更密的时域样本。
这个做法我在本科打电赛,在单片机里面做数字信号处理的时候,经常玩。十分有意思,学完数字信号处理后,自己想出来的插值方法,当时可自豪了哈哈哈。
对长度为 N 的序列,频谱是 X[k],要做 2 倍理想插值,可以把频谱扩展到 2N 点,并在高频中间区域补零。IFFT 后得到的时域序列就是更密的采样结果。
X_pad = [X(1:N/2), zeros(1, N), X(N/2+1:end)];
y = real(ifft(X_pad)) * 2;
这段代码只是展示等价关系。实际使用时要处理奇偶长度、频谱排列和边界细节。时域“补中间值”和频域“保留基带、去掉镜像”,是同一件事的两个视角。
图B.5-5:频域补零与时域插值