Skip to content

B.5 插零、滤波与统一框架

上一讲把 ZOH、线性插值和 FIR 低通插值并排比较。时域上,它们分别输出阶梯、折线和平滑曲线;频域上,差别变成了镜像压制程度和通带损伤的差别。

我们现在换一个角度看这件事,先把“中间点怎么算”放一边,改看“插零以后接了一个什么滤波器”。这样三种插值就能放到同一条处理链里。

先看 2 倍插值。原序列是 x[k]x[k],插零以后得到 x[n]x_\uparrow[n]

x[2k]=x[k],x[2k+1]=0x_\uparrow[2k]=x[k],\qquad x_\uparrow[2k+1]=0

偶数位置保留原样本,奇数位置先放 0。插值规则只负责把这些 0 变成合理的中间值。

如果让 x[n]x_\uparrow[n] 经过滤波器 h[n]h[n]

y[n]=x[n]h[n]y[n]=x_\uparrow[n]*h[n]

那么不同插值方法就对应不同的 h[n]h[n]

下面几张频率响应图只比较滤波器形状,所以把直流增益归一化到了 1。实际做 2 倍插值时,滤波器的通带增益仍要对应 2,理想低通公式里也要保留这个增益。

ZOH 的规则是重复前一个样本。它可以用一个很短的滤波器写出来:

hZOH[n]=δ[n]+δ[n1]h_{\mathrm{ZOH}}[n]=\delta[n]+\delta[n-1]

代入卷积式:

y[n]=x[n]+x[n1]y[n]=x_\uparrow[n]+x_\uparrow[n-1]

于是

y[2k]=x[2k]+x[2k1]=x[k]y[2k]=x_\uparrow[2k]+x_\uparrow[2k-1]=x[k] y[2k+1]=x[2k+1]+x[2k]=x[k]y[2k+1]=x_\uparrow[2k+1]+x_\uparrow[2k]=x[k]

这正好是

[x[0],x[1],x[2],][x[0],x[0],x[1],x[1],x[2],x[2],][x[0],x[1],x[2],\cdots]\quad\longrightarrow\quad [x[0],x[0],x[1],x[1],x[2],x[2],\cdots]

ZOH 可以写成“先插零,再经过 [1,1][1,1] 这个短滤波器”。

图B.5-1a:ZOH 频率响应
图B.5-1a:ZOH 频率响应

图里这条曲线和上一讲的 ZOH 频谱图是同一件事的两面:一个看滤波器本身,一个看它作用到插零序列之后留下了什么。

图B.4-2:零阶保持的频谱
图B.4-2:零阶保持的频谱

把这两张图放在一起,ZOH 的通带下垂和两侧镜像残余就能对上了。

线性插值也一样。2 倍线性插值要求旧样本保持不变,中间点取相邻两个旧样本的平均:

y[2k]=x[k],y[2k+1]=x[k]+x[k+1]2y[2k]=x[k],\qquad y[2k+1]=\frac{x[k]+x[k+1]}{2}

取滤波器

hlin[n]=12δ[n+1]+δ[n]+12δ[n1]h_{\mathrm{lin}}[n]=\frac12\delta[n+1]+\delta[n]+\frac12\delta[n-1]

y[n]=12x[n+1]+x[n]+12x[n1]y[n]=\frac12x_\uparrow[n+1]+x_\uparrow[n]+\frac12x_\uparrow[n-1]

在偶数位置:

y[2k]=12x[2k+1]+x[2k]+12x[2k1]=x[k]y[2k]=\frac12x_\uparrow[2k+1]+x_\uparrow[2k]+\frac12x_\uparrow[2k-1]=x[k]

在奇数位置:

y[2k+1]=12x[2k+2]+x[2k+1]+12x[2k]=x[k+1]+x[k]2y[2k+1]=\frac12x_\uparrow[2k+2]+x_\uparrow[2k+1]+\frac12x_\uparrow[2k] =\frac{x[k+1]+x[k]}{2}

这就得到线性插值。它背后的滤波器换成了一个三点的三角形核。

图B.5-1b:线性插值频率响应
图B.5-1b:线性插值频率响应

这条响应比 ZOH 更平缓,对高频的压制也更强。上一讲线性插值后的频谱更干净,原因就在这里。

图B.4-4:线性插值的频谱
图B.4-4:线性插值的频谱

FIR 低通插值更直观。它本来就是先插零,再用按频域指标设计出来的低通滤波器:

y[n]=x[n]hLPF[n]y[n]=x_\uparrow[n]*h_{\mathrm{LPF}}[n]

ZOH、线性插值和 FIR 低通插值都能放进滤波器模型里,差别在滤波器形状。ZOH 的核很短,计算最省,但通带下垂和镜像残余都比较明显;线性插值多看一个相邻样本,镜像残余少一些,高频细节也会被削弱;FIR 低通插值可以按通带、阻带和过渡带设计,代价是计算量和延迟更高。

图B.5-1c:FIR 低通频率响应
图B.5-1c:FIR 低通频率响应

把这张图和第四讲的三张频谱图放在一起:滤波器越接近理想低通,输出频谱越接近只保留基带的样子。

图B.4-6:低通插值的频谱
图B.4-6:低通插值的频谱

这张图能看清楚:低通插值会把镜像压掉,平滑只是时域上看到的结果。

前面把 ZOH 和线性插值写成了“插零后卷积一个短滤波器”。理想低通也可以这样看,只是它的滤波器不再是有限长的短核。

先把频域和时域的关系接上。序列经过滤波器时,频域里是相乘:

Y(ejω)=X(ejω)H(ejω)Y(e^{j\omega}) = X_\uparrow(e^{j\omega})H(e^{j\omega})

对应时域里,是卷积:

y[n]=x[n]h[n]y[n] = x_\uparrow[n] * h[n]

所以,频域里“用矩形低通切掉镜像”,时域里一定对应“用某个 h[n]h[n] 和插零序列做卷积”。这个 h[n]h[n] 长什么样?

对 2 倍升采样,理想插值低通可以写成

H(ejω)={2,ωπ/20,π/2<ωπH(e^{j\omega}) = \begin{cases} 2, & |\omega| \leq \pi/2 \\ 0, & \pi/2 < |\omega| \leq \pi \end{cases}

通带增益为 2,用来补偿插零造成的幅度稀释。对这个矩形频率响应做反变换:

h[n]=12ππ/2π/22ejωndωh[n] = \frac{1}{2\pi}\int_{-\pi/2}^{\pi/2}2e^{j\omega n}\,d\omega

n0n\neq 0 时,

h[n]=1π[ejωnjn]π/2π/2=2sin(πn/2)πnh[n] = \frac{1}{\pi}\left[\frac{e^{j\omega n}}{jn}\right]_{-\pi/2}^{\pi/2} = \frac{2\sin(\pi n/2)}{\pi n}

n=0n=0 时,积分结果为 1。把 n=0n=0 的情况合进去,可以写成

h[n]=sinc(n2)h[n]=\operatorname{sinc}\left(\frac{n}{2}\right)

这里采用 sinc(x)=sin(πx)πx\operatorname{sinc}(x)=\frac{\sin(\pi x)}{\pi x} 的定义。理想低通滤波器在时域里就是一个无限长的 sinc 核。

图B.5-2:理想低通与 sinc 插值
图B.5-2:理想低通与 sinc 插值

图 B.5-2 左边是频域里的矩形低通,右边是时域里的 sinc 卷积示意。每个输入样本都对应一条移位的 sinc 曲线,这些曲线在每个时刻相加,得到插值后的连续轨迹。原来的样本位置仍然穿过原样本;中间位置的值来自周围 sinc 曲线的共同贡献。

图B.5-3:sinc 插值验算
图B.5-3:sinc 插值验算

图 B.5-3 给出一个具体例子:一个 1 Hz 正弦经 4 Hz 采样后,再用 sinc 插值重建到 8 Hz。原信号为

x(t)=sin(2πt)x(t)=\sin(2\pi t)

4 Hz 采样得到

x[n]=sin(πn2)x[n]=\sin\left(\frac{\pi n}{2}\right)

也就是 ,0,1,0,1,0,\cdots,0,1,0,-1,0,\cdots 这样的样本序列。重建公式把每个样本配上一条移位 sinc,再叠加:

xr(t)=n=x[n]sinc(4tn)x_r(t)=\sum_{n=-\infty}^{\infty}x[n]\operatorname{sinc}(4t-n)

以第一个新增点 t=0.125st=0.125\,\mathrm{s} 为例,此时 4t=0.54t=0.5,所以

xr(0.125)=n=sin(πn2)sinc(0.5n)=0.70710678\begin{aligned} x_r(0.125) &=\sum_{n=-\infty}^{\infty}\sin\left(\frac{\pi n}{2}\right)\operatorname{sinc}(0.5-n) \\ &=0.70710678 \end{aligned}

直接用原来的正弦函数计算同一时刻:

x(0.125)=sin(2π0.125)=sin(π4)=0.70710678x(0.125)=\sin(2\pi\cdot 0.125)=\sin\left(\frac{\pi}{4}\right)=0.70710678

两个数一致。图中的橙色点就是这个新增样本。

原采样点也不会被改掉。比如 t=0.25st=0.25\,\mathrm{s} 时,

xr(0.25)=n=x[n]sinc(1n)=x[1]=1x_r(0.25)=\sum_{n=-\infty}^{\infty}x[n]\operatorname{sinc}(1-n)=x[1]=1

因为 n=1n=1 这一项的 sinc 自变量为 0,权重为 1;其他整数位置的 sinc 权重为 0。它正好对应真实正弦

x(0.25)=sin(2π0.25)=sin(π2)=1x(0.25)=\sin(2\pi\cdot 0.25)=\sin\left(\frac{\pi}{2}\right)=1

这就是 sinc 插值的来源。它来自理想低通滤波器的时域写法,不是靠经验猜中间点。

实际系统不能使用无限长 sinc。工程中会把 sinc 截断、加窗,或者用更短的 FIR 滤波器近似。这样会引入过渡带、通带波动、阻带残留、群延迟和可能的振铃。

图B.5-4:有限长 sinc
图B.5-4:有限长 sinc

图 B.5-4 左边把无限长 sinc 和有限窗口近似放在一起。窗口越宽,用到的邻近样本越多,越接近理想 sinc,但计算量和延迟也会上升。右边用阶跃信号提示另一个代价:有限长近似在突变附近可能出现过冲和振铃。

升采样也可以从频域角度实现。时域插零加低通是一种处理方式;频域里,也可以把频谱中间补零,再做 IFFT 得到更密的时域样本。

这个做法我在本科打电赛,在单片机里面做数字信号处理的时候,经常玩。十分有意思,学完数字信号处理后,自己想出来的插值方法,当时可自豪了哈哈哈。

对长度为 NN 的序列,频谱是 X[k]X[k],要做 2 倍理想插值,可以把频谱扩展到 2N2N 点,并在高频中间区域补零。IFFT 后得到的时域序列就是更密的采样结果。

X = fft(x);
N = length(x);
X_pad = [X(1:N/2), zeros(1, N), X(N/2+1:end)];
y = real(ifft(X_pad)) * 2;

这段代码只是展示等价关系。实际使用时要处理奇偶长度、频谱排列和边界细节。时域“补中间值”和频域“保留基带、去掉镜像”,是同一件事的两个视角。

图B.5-5:频域补零与时域插值
图B.5-5:频域补零与时域插值