scipy.signal.
lfilter_zi#
- scipy.signal.lfilter_zi(b, a)[源代码][源代码]#
为步进响应稳态构建 lfilter 的初始条件。
为
lfilter
函数计算一个初始状态 zi,该状态对应于阶跃响应的稳态。此函数的典型用法是设置初始状态,以便过滤器的输出从要过滤的信号的第一个元素的值开始。
- 参数:
- b, a类数组 (1-D)
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的响应是一个常数。
给定滤波器系数 a 和 b,线性滤波器的转置直接形式 II 实现的系统状态矩阵,这是 scipy.signal.lfilter 使用的实现方式,如下所示:
A = scipy.linalg.companion(a).T B = b[1:] - a[1:]*b[0]
假设 a[0] 为 1.0;如果 a[0] 不是 1,则 a 和 b 首先被 a[0] 除。
示例
以下代码创建了一个低通巴特沃斯滤波器。然后它将该滤波器应用于一个值全为1.0的数组;正如低通滤波器所预期的那样,输出也全为1.0。如果`lfilter`的`zi`参数没有被给出,输出将显示瞬态信号。
>>> 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 参数是通过lfilter_zi
计算并按 x[0] 缩放的。然后,输出 y 在输入从 0.5 降到 0.0 之前没有瞬态。