scipy.signal.lfilter

scipy.signal.lfilter(b, a, x, axis=- 1, zi=None)[源代码]

过滤数据沿着一维的IIR或FIR过滤。

过滤一个数据序列, x ,使用数字过滤。这适用于许多基本数据类型(包括对象类型)。过滤是标准差分方程的直接第二代转置实现(参见注释)。

该函数 sosfilt (和过滤设计使用 output='sos' )应该优先于 lfilter 对于大多数过滤任务,由于二阶截面的数值问题较少。

参数
barray_like

一维序列中的分子系数矢量。

aarray_like

一维序列中的分母系数向量。如果 a[0] 不是1,则两者都是 ab 被归一化为 a[0]

xarray_like

N维输入数组。

axis整型,可选

要沿其应用线性过滤的输入数据数组的轴。过滤沿此轴应用于每个子阵列。默认值为-1。

ziARRAY_LIKE,可选

过滤延误的初始条件。它是长度的向量(或N维输入的向量数组 max(len(a), len(b)) - 1 。如果 zi 为None或未给出,则假定为首字母睡觉。看见 lfiltic 了解更多信息。

退货
y阵列

数字过滤的输出。

zf数组,可选

如果 zi 为NONE,则不返回,否则, zf 保存最终的过滤延迟值。

参见

lfiltic

为…构造初始条件 lfilter

lfilter_zi

计算初始状态(阶跃响应的稳态) lfilter

filtfilt

一个前后向的过滤,得到一个线性相位的过滤。

savgol_filter

一杯萨维茨基-格雷过滤。

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

示例

生成要过滤的噪声信号:

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

创建Order 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()
../../_images/scipy-signal-lfilter-1.png