我有一段应用贝塞尔滤波器的代码:
一次性版本:
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.)
1条答案
按热度按时间t40tm48m1#
我不完全确定这是否正确;这是我第一次在SciPy的这个领域工作,但我认为这不起作用,因为
lfilter()
与lfilter_zi()
的初始条件不同。lfilter_zi()
的文档说为阶跃响应稳态的lfilter构造初始条件。
即假设输入中刚刚发生了大的阶跃。
lfilter()
的文档说如果zi为None或未给出,则假定初始静止。有关更多信息,请参见lfiltic。
通过阅读
lfiltic()
的文档,您可以构造一个过滤器状态,它假设初始静止,如下所示:字符串
这个
z
值使迭代解决方案与一次性解决方案完全匹配。检查
z
,它只是零,所以你可以简化为:型
我不能评论是否应该使用阶跃响应初始状态或静止初始状态,但这会导致两种解决方案给予相同的输出。