4. 整数倍内插:内插原理、时域与频域解释、内插器的结构、镜像抑制滤波

好,咱们接着聊多速率系统的另一个核心操作——整数倍内插。

如果说抽取是把采样率降下来,那内插正好反过来,是把采样率升上去。你可能会问:采样率已经够用了,为什么还要升?我当年也有这个疑问。后来在做一个高精度音频DAC的项目时,发现原始信号的采样率太低,DAC后面的模拟滤波器根本做不出来——要么阶数太高,要么过渡带太陡。嗯,这时候内插就派上用场了。

4.1 内插的基本原理

整数倍内插,说白了就是在两个原始采样点之间插入若干个零值点。假设原始序列是 x(n),我们要做 L 倍内插,那就在每两个点之间插入 L-1 个零。

数学上很简单:

x_I(m) = x(m/L), 当 m 是 L 的整数倍
x_I(m) = 0,       其他情况

举个例子,原始序列是 [a, b, c, d],做3倍内插后变成:

[a, 0, 0, b, 0, 0, c, 0, 0, d, 0, 0]

你看,数据量一下子变成了原来的3倍。但这里有个问题——这些零值点并不是真正的信号值,它们只是占位符。后面需要通过滤波把这些零变成合理的插值。

核心要点:内插 = 插零 + 滤波。插零是第一步,滤波才是关键。

4.2 时域与频域解释

咱们先看时域。插零之后,信号在时域上被拉伸了。原来两个采样点之间的时间间隔是 T,现在变成了 T/L。但问题是,这些零值点破坏了信号的平滑性。你想想看,一个连续信号突然跳变到零,再跳回来,这显然不是我们想要的。

再看频域,这里就有意思了。

原始信号 x(n) 的频谱是 X(e^jω),它的周期是 2π。插零之后,新序列 x_I(m) 的频谱会变成什么?我直接告诉你结论:

X_I(e^jω) = X(e^(jωL))

什么意思?原始频谱被压缩了 L 倍!原来在 [0, 2π] 范围内的频谱,现在被压缩到了 [0, 2π/L] 范围内。然后呢?在 [2π/L, 2π] 这个区间内,会出现 L-1 个镜像频谱。

为什么会这样?

我习惯用一个简单的类比来理解:你拿一个弹簧,原始信号是弹簧上的一个波形。插零相当于把弹簧拉长了 L 倍,波形自然就被压缩了。但弹簧拉长后,原来的一段波形会重复出现——这就是镜像。

个人经验:我在做多速率滤波器设计时,经常用这个弹簧类比来跟团队成员解释。大家一听就懂了,比看公式快得多。

4.3 内插器的结构

内插器的标准结构其实很简单,就两步:

  1. 插零器:在原始序列中插入 L-1 个零
  2. 镜像抑制滤波器:滤除镜像频谱,恢复平滑信号

这个滤波器是个低通滤波器,它的截止频率是 π/L。为什么是这个值?因为镜像频谱从 π/L 开始出现,我们要把它们全部干掉。

实际实现时,我们不会真的先插零再滤波——那样太浪费了。你想啊,插零之后大部分数据都是零,跟零相乘的结果也是零,何必算呢?

所以,工程上常用的是多相结构。这个结构把滤波器拆成 L 个分支,每个分支只处理非零的输入数据。计算量直接从 O(NL) 降到了 O(N),效率提升非常明显。

避坑指南:我曾经在一个项目中直接用了插零+滤波的朴素实现,结果处理速度跟不上实时要求。后来改成多相结构,问题立刻解决了。所以,如果你做实时系统,千万别偷懒,直接用多相结构。

4.4 镜像抑制滤波

镜像抑制滤波器是内插器的灵魂。它的设计好坏,直接决定了内插后的信号质量。

设计这个滤波器时,有几个关键参数:

参数 含义 我的建议
通带截止频率 原始信号的最高频率 一般取 π/L 的 0.8~0.9 倍
阻带起始频率 第一个镜像的起始位置 就是 π/L,不能含糊
阻带衰减 对镜像的抑制程度 至少 60dB,高精度应用要 80dB 以上
过渡带宽度 通带到阻带的过渡区域 越窄越好,但滤波器阶数会变高

滤波器设计可以用 FIR 或者 IIR。我个人更倾向于 FIR,原因很简单:FIR 是线性相位的,不会造成群延迟失真。在音频、通信这些对相位敏感的应用中,这一点特别重要。

我记得有一次做图像缩放的内插,用了 IIR 滤波器,结果图像边缘出现了明显的振铃效应。换成 FIR 之后,效果立竿见影。嗯,从那以后,只要不是对延迟特别敏感的应用,我都用 FIR。

注意:镜像抑制滤波器的阶数不能太低。阶数低了,过渡带太宽,会影响到原始信号的高频分量。但阶数太高,计算量又上去了。这是个 trade-off,需要根据实际需求来平衡。

4.5 知识体系总览

下面这张图把整数倍内插的核心逻辑串起来了,你可以对照着看:

整数倍内插知识体系 原始序列 x(n) 插零器 (↑L) 镜像抑制滤波器 内插序列 y(m) 时域解释 • 插零:每两点间插入 L-1 个零 • 滤波:用低通滤波器平滑零值点 • 效果:采样率提升 L 倍 • 注意:插零后信号不连续 频域解释 • 频谱压缩:X(e^jω) → X(e^(jωL)) • 镜像产生:出现 L-1 个镜像频谱 • 滤波目标:滤除所有镜像 • 滤波器截止频率:π/L 工程实现:多相结构 → 计算量从 O(NL) 降到 O(N)

这张图把内插的流程、时域频域解释、工程实现都串起来了。你对照着看,应该能对整个知识体系有个清晰的把握。

一个小技巧:如果你刚开始接触内插,可以先从 L=2 的情况入手。2倍内插是最简单的,镜像只有一个,滤波器设计也最直观。搞懂了2倍,再推广到任意整数倍就水到渠成了。

好了,整数倍内插的核心内容就这些。记住:插零是手段,滤波是灵魂。搞懂了镜像抑制滤波器,你就掌握了内插的精髓。


公众号:蓝海资料掘金营,微信deep3321