极其有限的硬件的插值技术

信息处理 过滤器 插值
2022-01-30 19:51:24

我正在尝试在复古计算机上播放样本。硬件非常有限,所以我不得不使用软件 PWM 作为我的主要播放方法。平台的限制意味着我不能使用特别高的 PWM 频率,因此产生的样本分辨率不太可能超过 5 或 6 位。为了明确起见,让我们说我的 PWM 频率约为 20 kHz。

现在,我的硬件在内存方面也非常有限。以 20 kHz 录制的样本并不实用。作为一种妥协方式,我尝试使用以 5 或 10 kHz 记录的样本,即在比我的 PWM 频率低 2 或 4 倍的频率上。我需要插值,但复杂的处理基本上是不可能的。我尝试了简单的“上采样”(即在现有样本之间插入零),它产生了很多振铃伪影。我还尝试了“零阶保持”和“一阶保持”,如各种上采样方案的相对优点是什么?坦率地说,我不能轻易地在后两者之间做出选择。两种方式都比简单地插入零要好,但是两种情况下的振铃仍然很大。

显然,需要更复杂的过滤。我的问题是软件 PWM 很贵而且我的电脑很弱。所有计算都必须在 8 位寄存器中进行。没有硬件乘法/除法(通过移位完成的乘法/除法除外)。FIR 滤波器可能可以通过使用查找表来实现,但我认为 3-5 个滤波器抽头是合理的。

所以,问题是,对于我非常有限的平台,哪些过滤方法可能会给我带来最大的收益和最少的振铃?我应该尝试使用经过调整的 FIR 滤波器来获得 8 位友好数字,还是应该做一些完全不同的事情?您认为哪些过滤策略可能在有限的计算环境中最有效?

就我的功课而言,我确实阅读了上面引用的帖子以及与之相关的其他几篇帖子。我在谷歌上做了一些阅读。我了解如何构建移动平均线,包括多项式(=“higher order hold”),但讨论似乎表明它们不是最佳选择。FFT 是不可能的。我目前正在使用各种 3-5 抽头 FIR 滤波器,它们似乎可以工作,但大约是我可以通过计算完成的最大值。我尝试实现 CIC 过滤器(但未能获得不错的结果)。我还没有看过 IIR 滤波器。所以,基本上,我问这个问题是希望你能帮助我专注于更具体的事情,也许是对我来说更有可能有用的过滤器系列,甚至可能是特定的过滤器。

2个回答

对于复古硬件,PWM 之后的低通滤波器可能是扬声器锥体和/或您耳朵内部的惯性。因此,首先确保振铃在全 PWM 采样率下或由于量化(使用一些微小的 20kHz 采样率波形循环进行测试)不超出您的要求。

对于上采样,我可能会尝试零阶或一阶保持,然后选择 IIR 滤波器(一阶或双二阶低通),以便它在二进制系数中只有少量“1”,允许移位-并添加具有确定延迟的递归过滤。如果您可以找到总共具有足够少的“1”的系数,则级联双二阶 IIR 也是可能的。

在数据准备方面,您可以在更强大的系统上对样本进行预噪声过滤,而不仅仅是依赖于 Retro-CPU 的量化。您还可以模拟复古系统的输出滤波器,并调整噪声过滤以将一些噪声移出通带。

我认为线性插值就足够了,因为否则质量规格太低了。零阶保持和线性插值的不良图像抑制甚至可以被认为是一个好处,因为这样至少会有一些高频内容。这是一个品味问题。

对于因子 2,我建议使用有限脉冲响应 (FIR) 滤波器,其系数{-1/16, 0, 9/16, 1, 9/16, 0, -1/16}( Filter 1 ) 在 10 kHz 采样信号上以 20 kHz 运行,采样频率通过零填充加倍。在具有系数的 FIR 滤波器家族中{b, 0, a, 1, a, 0, b}a = 9/16, b = -1/16具有最大数量的幅频响应消失导数的滤波器|2bcos(3ω)+2acos(ω)+1|ω=0,使通带和阻带都平坦,同时具有 2 的 0 Hz 增益,用于补偿 1/2 的零填充的有效增益。还要注意优化9/16 = 1/2 + 1/16

对于 4 倍,您可以执行上述操作,将采样频率从 5 kHz 变为 10 kHz,然后通过取连续样本的平均值来线性插值到 20 kHz,以获得中间样本。组合操作等效于滤波器{b/2, b, b/2, 0, a/2, a, (1+a)/2, 1, (1+a)/2, a, a/2 0, b/2, b, b/2}滤波器 2),其幅度频率响应为|bcos(7ω)+ 2bcos(6ω)+ bcos(5ω)+ acos(3ω)+ 2acos(2ω)+ (1+a)cos(ω)+1|.幅度频率响应不再具有相同数量的消失导数,可以通过使用a = 37/64, b = -5/64( Filter 3 ) 恢复,但如果硬件乘法不可用,差异将是微不足道的,不值得额外成本。

幅度频率响应
图 1. 滤波器 1(红色)、滤波器 2(蓝色)、滤波器 3(紫色)的幅度频率响应。

这些方法相对于零阶保持和线性插值的一个缺点是它们可能会过冲,超出原始信号的范围|a|+|b|在最坏的情况下。

对于 4 倍,如果您负担得起,您可以使用滤波器 1 两次,首先从 5 kHz 变为 10 kHz,然后从 10 kHz 变为 20 kHz(滤波器 4):

滤波器频率响应
图 2. 滤波器 2(蓝色)和滤波器 4(红色)的频率响应。滤波器 4 具有更平坦的通带和更好的图像衰减。

您应该为时间变量的每个可能的小数部分硬编码乘以系数,并利用除法的分布特性(由右移实现)而不是加法和减法,例如a/4 + b/4 = (a + b)/4这提供了比以数字方式存储系数更有效的代码。

您可以通过近似等波纹或最小二乘设计进一步改善图像衰减,但这需要使用更复杂的系数。

顺便说一句,存储连续样本之间的差异通常比存储样本所需的比特少。