scipy.signal.lfilter_zi

scipy.signal.lfilter_zi(b, a)[源代码]

构造lfilter阶跃响应稳态的初始条件。

计算初始状态 zi 对于 lfilter 与阶跃响应的稳态相对应的函数。

此功能的典型用法是设置初始状态,以便过滤的输出从与要过滤的信号的第一个元素相同的值开始。

参数
b, aARRAY_LIKE(一维)

过滤的IIR系数。看见 lfilter 了解更多信息。

退货
zi一维ndarray

过滤的初始状态。

注意事项

阶为m的线性过滤具有状态空间表示(A,B,C,D),对于该状态空间表示,过滤的输出y可以表示为:

z(n+1) = A*z(n) + B*x(n)
y(n)   = C*z(n) + D*x(n)

其中z(N)是长度为m的向量,A具有形状(m,m),B具有形状(m,1),C具有形状(1,m),D具有形状(1,1)(假设x(N)是标量)。lfilter_zi解算::

zi = A*zi + B

换句话说,它找出对所有1的输入的响应为常数的初始条件。

给定过滤系数 ab ,scipy.signal.lfilter使用的线性过滤的转置直接形式II实现的状态空间矩阵是:

A = scipy.linalg.companion(a).T
B = b[1:] - a[1:]*b[0]

假设 a[0] 为1.0;如果 a[0] 不是1, ab 首先被一个 [0] 。

示例

下面的代码创建一个低通巴特沃斯过滤。然后,它将该过滤应用于一个值都为1.0的数组;输出也都是1.0,这与低通过滤的预期不谋而合。如果 zi 论证 lfilter 如果没有给出,输出就会显示瞬态信号。

>>> from numpy import array, ones
>>> from scipy.signal import lfilter, lfilter_zi, butter
>>> b, a = butter(5, 0.25)
>>> zi = lfilter_zi(b, a)
>>> y, zo = lfilter(b, a, ones(10), zi=zi)
>>> y
array([1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

另一个示例:

>>> x = array([0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0])
>>> y, zf = lfilter(b, a, x, zi=zi*x[0])
>>> y
array([ 0.5       ,  0.5       ,  0.5       ,  0.49836039,  0.48610528,
    0.44399389,  0.35505241])

请注意, zi 参数为 lfilter 是使用以下方法计算的 lfilter_zi 并按以下比例进行缩放 x[0] 。然后输出 y 在输入从0.5下降到0.0之前没有瞬变。