我可以使用 IIR 或 FIR 来获得滑动均值吗?

信息处理 离散信号 过滤器设计 低通滤波器 无限脉冲响应 有限脉冲响应
2022-02-16 15:29:44

我的输出信号应由(元代码)计算:

o = 0  # or some arbitrary initial value
for i in input:
    o = (o * 99 + i) / 100
    print o

我称之为“滑动平均值”,但也许为此建立了另一个术语。(如果是这样,提到这一点可以帮助我更好地研究这个 ;-)

有没有办法使用IIR 或 FIR的a / b系数数组来实现这一点?他们会是什么样子?

我的目标是 Python / 中的解决方案scipy.signal

或者是否有另一种既定的方法来实现这一点,我可以在 , , 等库中numpy找到scipypandas

4个回答

它对应于的指数加权移动平均(EWMA) 滤波器α=0.01

差分方程可以表示为:

y(n)(1α)y(n1)=αx(n)
y(n)0.99y(n1)=0.01x(n)

因此,它是一个 IIR 滤波器。您可以轻松地从差分方程中获得系数。

Y(z)0.99z1Y(z)=0.01X(z)
Y(z)X(z)=0.0110.99z1

因此,a = [1 ; -0.99]b = 0.01

由于过去值的贡献以指数速率衰减,因此也称为指数平滑。

当它应用于正弦曲线时,数学很有趣,因为正弦曲线也是指数的。当应用于纯音时,滤波器会引入与频率相关的相位滞后。

一个聪明的技巧是还对反向的数据进行指数平滑,并对结果进行平均。前向滞后消除了后向滞后,您将获得原始信号的平滑版本,所有相位均完好无损。纯音的幅度由频率相关公式衰减。因此,您可以应用分析技术,例如使用 DFT,并获得更好的结果,因为平滑作为一种降噪技术。

我在一篇名为“Exponential Smoothing with a Wrinkle”的博客文章中介绍了这方面的数学

希望这可以帮助。

赛德

我认为它被称为指数平均器。它也是一个order-1 IIR。

你的系数是 a0 = 1, a1 = -0.99, b0 = 0.01, b1 =0

既然您将其称为“滑动平均”,我认为这就是您真正想要的功能——是的,这实际上是一个 FIR 滤波器,我们将其称为“移动平均”。

一个简单的实现是[ 1.0 / L ] * L,因此,一个L长移动平均线实现为 FIR 抽头:

 fir_taps = [ 1.0 / L ] * L
 signal_out = numpy.convolve(signal_in, fir_taps)

对于 small L,这是一个非常足够的方法;对于更长的平均值,仅添加最新值并减去最旧值的版本可能会表现更好。

请注意,您的 IIR 形式(我们称为 EWMA 或单极 IIR 积分器)都是低通滤波器。如果您确实需要抑制高速信号分量的行为,那么平均滤波器并不是您能做的最好的!