数值稳定的 IIR 滤波器

信息处理 过滤器 过滤器设计 无限脉冲响应 数字滤波器 带通
2022-02-12 20:09:43

我正在制作一个 IIR 滤波器,但我遇到了更高阶的稳定性问题。一旦开始,值就会变为无穷大。

到目前为止,我一直在使用 MATLAB 生成过滤器,然后在嵌入式系统中运行它们。我正在使用带通滤波器、状态空间表示和单精度值。如果我理解正确,问题的发生是因为极点离单位圆太近,所以我的系数或状态空间的舍入误差失控了。

我可以减少阶数,但是当我有计算能力来运行更高阶的滤波器时,这感觉很浪费。有没有一种滤波器设计可以在更高阶改进同时给极点一个良好的余量?

或者,我可以使用另一个技巧来缓解这个问题吗?

2个回答

首先,您的 IIR 滤波器的顺序是什么?我用过的最高阶是用于控制回路应用的 10 阶 IIR 滤波器。我觉得你不太可能需要更多这个。

其次,最好将过滤器拆分为二阶部分 (SOS) 并级联它们,这通常可以解决大多数问题。

https://www.dsprelated.com/showarticle/1137.php

您还可以将过滤器拆分为二阶部分并将它们并行放置并添加它们的输出。

鉴于您在评论中提到的硬件限制,您最好的办法可能是作为并行二阶部分执行此操作。由于平行部分彼此独立,因此矢量化非常简单,而且成本也更低:每个部分都有一个复共轭极对,但只有一个实零。

如果您在同一位置有真正的极点或多个极点,事情会变得有点棘手:这仍然可以完成,但它会使代码更加尴尬。

为了计算平行部分的系数,您需要进行部分分数展开。好消息:Matlab 有一个功能,它被称为residuez(). 坏消息:这不是一个很好的实现,并且经常会在过滤时遇到类似的数值问题而失败。您可以在您的过滤器上尝试它并发布另一个问题,如果对于您的特定示例,residualz() 失败。