scipy.signal.

lfilter_zi#

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

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

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

此函数的典型用途是设置初始状态,以便滤波器的输出与要滤波的信号的第一个元素的值相同。

参数:
b, aarray_like (1-D)

IIR 滤波器系数。有关更多信息,请参见 lfilter

返回:
zi1-D ndarray

滤波器的初始状态。

另请参见

lfilter, lfiltic, filtfilt

注释

具有 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,线性滤波器的转置直接 II 型实现的状态空间矩阵(这是 scipy.signal.lfilter 使用的实现)为

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

假设 a[0] 为 1.0;如果 a[0] 不为 1,则首先将 ab 除以 a[0]。

示例

以下代码创建一个低通巴特沃斯滤波器。然后,它将该滤波器应用于一个值全部为 1.0 的数组;输出也全部为 1.0,正如低通滤波器所期望的那样。如果未给出 lfilterzi 参数,则输出将显示瞬态信号。

>>> 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])

请注意,使用 lfilter_zi 计算了 lfilterzi 参数,并按 x[0] 进行了缩放。然后,输出 y 在输入从 0.5 降至 0.0 之前没有瞬态。