Scipy:贝塞尔迭代滤波不同于单次滤波

u4vypkhs  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(55)

我有一段应用贝塞尔滤波器的代码:

一次性版本:

import scipy.signal

fc_bessel = 0.14  # [Hz]
ordre_bessel = 3

b,a = scipy.signal.bessel(ordre_bessel, fc_bessel, 'low', analog=False, output='ba', fs=300)

filter_once = scipy.signal.lfilter(b, a, input_data)

字符串
由于我最终将实时接收我的数据,我需要修改这段代码以动态地接收每个input_data,因此我需要在zi变量中维护过滤器状态。所以我写道:

迭代版本:

import scipy.signal

fc_bessel = 0.14  # [Hz]
ordre_bessel = 3

b,a = scipy.signal.bessel(ordre_bessel, fc_bessel, 'low', analog=False, output='ba', fs=300)
z = scipy.signal.lfilter_zi(b, a)

filter_iter = []
for input_value in input_data:
    filtered_value, z = scipy.signal.lfilter(b, a, [input_value], zi=z)
    filter_iter.append(filtered_value[0])


然而,输出是完全不同的(如果第一个值是0,filter_once[0]0,但filter_iter[0]是0.999.)

t40tm48m

t40tm48m1#

我不完全确定这是否正确;这是我第一次在SciPy的这个领域工作,但我认为这不起作用,因为lfilter()lfilter_zi()的初始条件不同。
lfilter_zi()的文档说
为阶跃响应稳态的lfilter构造初始条件。
即假设输入中刚刚发生了大的阶跃。
lfilter()的文档说
如果zi为None或未给出,则假定初始静止。有关更多信息,请参见lfiltic。
通过阅读lfiltic()的文档,您可以构造一个过滤器状态,它假设初始静止,如下所示:

z = scipy.signal.lfiltic(b, a, 0)

字符串
这个z值使迭代解决方案与一次性解决方案完全匹配。
检查z,它只是零,所以你可以简化为:

z = np.zeros(3)


我不能评论是否应该使用阶跃响应初始状态或静止初始状态,但这会导致两种解决方案给予相同的输出。

相关问题