C代码中低通滤波器的典型实现实际上不是典型的低通滤波器吗?

信息处理 过滤器
2022-02-14 06:01:12

在 C 代码中,您经常会看到以下内容:

y=(1a)yprev+inputa

..在哪里a是一个很小的数字。然后,该等式以循环速率以离散间隔运行。

让我们假设a=0.1.

如果我将此差分方程转换为 z 域,我会得到以下结果:

Y(z)=0.1/(10.9z1)=0.1z/(z0.9)

这个函数有一个可怕的相位响应: 相位响应

如果我改为从连续时间低通滤波器开始并将其转换为差分方程,我会得到一个稍微不同的滤波器。

H(s)=1/(s+1)

我使用双线性变换将其转换为 z 域:

H(z)=(0.04762+0.04762z1)/(10.9048z1)

然后我将其转换为差分方程:

yn=0.04762xn+0.04762xn1+0.9048yn1

结果与“简单”过滤器相比:

新过滤器

“正确”的 C 实现的结果看起来更像是一个低通滤波器,而不是“简单”的实现。简单的实现更像是一个滞后调节器(我在写这篇文章时意识到了这一点,所以我几乎已经回答了我自己的问题)。而“正确”的 lpf 更像是一个模拟 LPF。显然,如果不考虑不同的行为,这会对系统的性能产生负面影响。是否存在其中任何一个比另一个更适合的情况?

2个回答

您在上面引用的“简单”实现通常称为泄漏积分器,这是一阶 IIR 低通滤波器的特例。在前面的几个问题中更详细地讨论了它们:

要具体回答您的问题,是的,它是一个低通滤波器。您当然可以构建具有更好低通频率响应的更复杂的滤波器。泄漏积分器构造的主要优点是它的实现非常简单,而且您可以通过简单地改变它的值来调整它的截止频率。a(作为a0,滤波器的截止值减小)。

在实践中,并没有太大的区别。差异主要在较高频率,大多数应用程序将考虑“阻带”或“不是感兴趣的区域”。“适当的”低通滤波器的主要好处是您在 Nyquist 处有一个零,并且您在非常接近 Nyquist 时获得更多衰减。

如果你关心的话,C 代码几乎是相同的,而且很容易编写。使用你的符号看起来像

y[n]=(1a)y[n1]+a(x[n]+x[n1])/2

唯一的区别是,不是只添加当前输入样本,而是添加最后两个输入的平均值。