你认识这个过滤器吗?

信息处理 过滤器 过滤器设计 低通滤波器 算法 无限脉冲响应
2022-02-03 12:20:53

我试图破译SoundBox的未注释源代码,它是一个用 javascript 编写的小音乐跟踪器。

有一个包含的合成器,它对输出样本应用过滤器。我很难理解它是如何工作的。您可以在此处(第 251 行)的源代码中找到应用过滤器的位置。然而,它没有被评论。

这是我对其定义的解释。一、过滤器参数:

a = cutoff/samplerate
f = 1.5 * sin(PI * a)
q = 1.0 - resonance

cutoff以赫兹为单位。samplerate固定为 44100

然后是过滤过程

low[i] += f * band[i-1]
high[i] = q * (x[i] - band[i-1]) - low[i]
band[i] += f * high[i]

y[i] = low[i]

x输入样本数组、y输出和//low其他一些我还没有完全理解其用途的变量在哪里highband

对我来说,这看起来像是某种 IIR 滤波器。你认得吗?你能帮我分解一下吗?给我解释?

这是低通滤波器版本。一个应该能够通过将输出更改为y[i] = high[i](或)来获得高通滤波器(或带通band[i])。

我做了一些实验,效果很好,但是实际的截止值有点偏移,并不完全等于cutoff. 我已经能够通过更改 to 的定义来纠正f问题f = sin(2.0 * PI * a)现在截止点正是它应该在的位置,但我不知道为什么。如果你想看到漂亮的图片,你可以看到我在 GitHub 上打开的问题,但还没有回复。

谢谢。

1个回答

这是一个数字状态变量滤波器请注意,您的过滤过程伪代码不正确。+=将原始代码中的所有内容替换为=,这导致过滤器无法按预期工作。

代码实现的实际递归方程是

(1)l[n]=l[n1]+fb[n1]h[n]=q(x[n]b[n1])l[n]b[n]=fh[n]+b[n1]

在哪里l[n],h[n], 和b[n]分别是低通、高通和带通输出。方程(1)实现一个二阶 IIR 滤波器(实际上是三个)。