C中的零相位滤波器实现与python scipy库中的'filtfilt'函数相同

问题描述

我有一个Biquad过滤器的C实现。我想做零相位滤波。为此,我先沿正向传递信号,然后时间使信号反向,然后再次将其传递通过滤波器。但是我没有得到正确的输出

在python的filtfilt函数中。它们还具有一些使用lfilter_zi(b,a)计算的初始条件,该条件作为参数在fwd和bwd方向两次传递给lfilter函数,并且进行了一些填充。

在用C实现时,是否还需要为过滤器状态做填充和初始条件? 谢谢

解决方法

是的,您需要正确设置biquad的初始状态以复制scipy的过滤器。否则,您可能会在信号边缘附近得到奇怪的输出。 scipy.signal.filtfilt documentation提到了本文,它在method="gust"时使用:

F。 Gustaffson,“Determining the initial states in forward-backward filtering”,《信号处理事务》,第1卷。 46页,第988-992页,1996年。

或者您可以查看scipy's implementation来了解他们的工作方式。