通过改变双二阶系数来避免点击

信息处理 过滤器 声音的 双二阶
2022-02-21 03:09:05

我有一个 DSP 应用程序,它使用五个级联双二阶过滤信号,其系数由 Audio EQ Cookbook 公式确定(感谢 Bristow-Johnson 先生的这项工作)。每个滤波器的系数可以通过 RS232 从 matlab 应用程序单独更改,但是这样做会产生可听见的咔嗒声。

为了防止点击,我的第一个想法是对各个系数进行低通滤波以平滑过渡。我的一个朋友告诉我,这可能会导致不稳定。他在该领域比我更有经验,而且我仍然缺乏证明/反驳他的主张或找出在这种情况下哪些情况会导致不稳定的能力,所以我认为他的话是理所当然的。

但是,他的解决方案(而不是平滑参数,然后计算正确的系数)对我不起作用。由于带宽限制,在 Matlab 中计算中间值并传输它们不是一种选择,由于 CPU 时间有限,在 DSP 上计算它们不是一种选择。

一种解决方案是使用两个并行过滤器并在它们之间交叉淡入淡出。但我不是特别喜欢它,因为它使我的计算负载加倍,而且快速连续的两次变化无论如何都会导致听到咔哒声。

我的下一个想法是使用 Gold-Rader 结构(见下文)作为双二分母。由于这个结构使用了极点半径,它总是保持在 1 以下(只要我用一个不会过冲的滤波器过滤它......),它不会变得不稳定......除了半径在信号流图中引入之前,相乘。因此,如果我正在传输计算的产品,我再次不确定过滤这些系数将如何影响稳定性。 sin(ϕ)cos(ϕ)rsin(ϕ)rcos(ϕ)Gold&Rader递归部分框图 五个双二阶中的每一个都必须在 20 Hz 至 20 kHz、-18 至 +18dB 增益(如适用)和峰值的 0.5 至 10 范围内可调。但是滤波器的类型保持不变(即高通将始终保持旁路,峰值滤波器将始终是峰值滤波器......)。

所以我的问题是:在不冒过滤器不稳定风险的同时避免点击的最有效方法是什么?

4个回答

另一种可能性是将系数作为极点和零点发送,并在 z 平面而不是系数域中内插/平滑。这始终保证是稳定的。您可以在实数/虚数表示中进行插值,或者,如果您想获得幻想,可以在幅度和相位中进行插值。第一个要容易得多,因为相位插值必须处理环绕。

从实部和虚部计算系数是直接的,适用于实时。唯一的例外可能是您有一个双实极点/零点而不是复共轭对。

我认为你问题的基本前提是不正确的。插值系数不会导致双二阶滤波器不稳定;而且,它很容易证明。只需绘制 a1 与 a2,您就会看到分母中系数三元组的稳定区域是一个凸空间。因此,插值系数(只要使用相同的插值方法)总是会产生稳定的滤波器......但是,这并不意味着滤波器的内部状态不会出现不连续性。因此,这不是避免稳定性的问题,而是使用不会产生不连续性的拓扑。一般来说,SVF TPT 似乎是在这种情况下要走的路。

我添加了一个快速图来显示稳定区域的凸度(漂亮的大三角形:))

在此处输入图像描述

插值系数会导致不稳定的原因是中间的一组系数值可能会在单位圆之外产生极点,从而使您的滤波器不稳定。此外,系数的值与滤波器的参数不是线性相关的,这意味着它甚至无法避免点击。

另一种方法是查找不同频率的系数表,然后使用您朋友的方法在 2 个滤波器之间进行插值。

如果它是经典的虚拟模拟滤波器,您还可以使用具有“零反馈延迟”拓扑的 SVF 滤波器,其优点是每个滤波器的参数只有一个系数可以更改(例如,如果您更改 Q,您只需必须计算 1 个单一系数)。这与查找表相结合也许可以解决您的问题。

最后,还有其他拓扑和方法可以对虚拟模拟 VCF 进行建模,它们可能更适合您的问题。

您可以将发送系数变化的速率限制为交叉渐变持续时间的速率。但在每个持续时间滴答声中发送最新设置(例如,每 16 毫秒视频帧或等效帧)。

您可以在每次设置更改时发送两组系数更改。一个到极点在单位圆内的位置,然后另一个返回到目标过滤器设置。然后在微弱的DSP上进行插值。