lfilter#
- scipy.signal.lfilter(b, a, x, axis=-1, zi=None)[source]#
使用 IIR 或 FIR 滤波器沿一个维度过滤数据。
使用数字滤波器过滤数据序列 x。 这适用于许多基本数据类型(包括对象类型)。 滤波器是标准差分方程的直接形式 II 转置实现(参见注释)。
对于大多数过滤任务,应优先使用
sosfilt
(以及使用output='sos'
进行滤波器设计)而不是lfilter
,因为二阶段具有更少的数值问题。- 参数::
- barray_like
一维序列中的分子系数向量。
- aarray_like
一维序列中的分母系数向量。 如果
a[0]
不是 1,则 a 和 b 都将被a[0]
归一化。- xarray_like
N 维输入数组。
- axisint, 可选
输入数据数组应用线性滤波器的轴。 滤波器将应用于沿此轴的每个子数组。 默认为 -1。
- ziarray_like, 可选
滤波器延迟的初始条件。 它是一个向量(或 N 维输入的向量数组),长度为
max(len(a), len(b)) - 1
。 如果 zi 为 None 或未给出,则假定初始静止状态。 有关更多信息,请参见lfiltic
。
- 返回::
- yarray
数字滤波器的输出。
- zfarray, 可选
如果 zi 为 None,则不返回,否则,zf 包含最终的滤波器延迟值。
参见
lfiltic
为
lfilter
构造初始条件。lfilter_zi
为
lfilter
计算初始状态(阶跃响应的稳态)。filtfilt
一个前向后向滤波器,用于获得零相位滤波器。
savgol_filter
一个 Savitzky-Golay 滤波器。
sosfilt
使用级联二阶段过滤数据。
sosfiltfilt
一个使用二阶段的前向后向滤波器。
注释
滤波器函数实现为直接 II 转置结构。 这意味着滤波器实现
a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M] - a[1]*y[n-1] - ... - a[N]*y[n-N]
其中 M 是分子的次数,N 是分母的次数,n 是样本号。 它使用以下差分方程实现(假设 M = N)
a[0]*y[n] = b[0] * x[n] + d[0][n-1] d[0][n] = b[1] * x[n] - a[1] * y[n] + d[1][n-1] d[1][n] = b[2] * x[n] - a[2] * y[n] + d[2][n-1] ... d[N-2][n] = b[N-1]*x[n] - a[N-1]*y[n] + d[N-1][n-1] d[N-1][n] = b[N] * x[n] - a[N] * y[n]
其中 d 是状态变量。
描述此滤波器的 z 变换域中的有理传递函数为
-1 -M b[0] + b[1]z + ... + b[M] z Y(z) = -------------------------------- X(z) -1 -N a[0] + a[1]z + ... + a[N] z
例子
生成需要滤波的噪声信号
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng() >>> t = np.linspace(-1, 1, 201) >>> x = (np.sin(2*np.pi*0.75*t*(1-t) + 2.1) + ... 0.1*np.sin(2*np.pi*1.25*t + 1) + ... 0.18*np.cos(2*np.pi*3.85*t)) >>> xn = x + rng.standard_normal(len(t)) * 0.08
创建一个 3 阶低通巴特沃斯滤波器
>>> b, a = signal.butter(3, 0.05)
将滤波器应用于 xn。 使用 lfilter_zi 选择滤波器的初始条件
>>> zi = signal.lfilter_zi(b, a) >>> z, _ = signal.lfilter(b, a, xn, zi=zi*xn[0])
再次应用滤波器,使结果的阶数与 filtfilt 相同
>>> z2, _ = signal.lfilter(b, a, z, zi=zi*z[0])
使用 filtfilt 应用滤波器
>>> y = signal.filtfilt(b, a, xn)
绘制原始信号和各种滤波版本
>>> plt.figure >>> plt.plot(t, xn, 'b', alpha=0.75) >>> plt.plot(t, z, 'r--', t, z2, 'r', t, y, 'k') >>> plt.legend(('noisy signal', 'lfilter, once', 'lfilter, twice', ... 'filtfilt'), loc='best') >>> plt.grid(True) >>> plt.show()