scipy.signal.

sosfilt#

scipy.signal.sosfilt(sos, x, axis=-1, zi=None)[source]#

使用串级二阶部分沿一个维度对数据进行滤波。

应用 sos 定义的数字 IIR 滤波器,对数据序列x 进行滤波。

参数:
sos类似于数组

二阶滤波器系数数组,形状必须为 (n_sections, 6)。每行对应一个二阶部分,前三列提供分子系数,后三列提供分母系数。

x类似于数组

N 维输入数组。

axisint,可选

将线性滤波器应用到的输入数据数组的轴。滤波器将被应用于沿此轴的每个子数组。默认值为 -1。

zi类似于数组,可选

级联滤波器延迟的初始条件。它是一个矢量(至少是 2D),形状为 (n_sections, ..., 2, ...),其中 ..., 2, ...表示x 的形状,但用 2 替换 x.shape[axis]。如果 zi 为 None 或未给出,则假设为初始休息状态(即所有为零)。请注意,这些初始条件并非lfilticlfilter_zi 给出的初始条件相同。

返回:
yndarray

数字滤波的输出。

zfndarray,可选

如果 zi 为 None,则不返回此项;否则,zf 保存最终的滤波延迟值。

注释

滤波器函数作为一系列采用传递形式 II 转置结构的二阶滤波器实现。其设计用于最大程度地减少高阶滤波器的数值精度误差。

添加于 0.16.0 版。

範例

使用 lfiltersosfilt 绘制 13 阶滤波器的脉冲响应,其中显示尝试在单一阶段执行 13 阶滤波器时产生的不稳定性(数值错误将一些极点推到单位圆外)

>>> import matplotlib.pyplot as plt
>>> from scipy import signal
>>> b, a = signal.ellip(13, 0.009, 80, 0.05, output='ba')
>>> sos = signal.ellip(13, 0.009, 80, 0.05, output='sos')
>>> x = signal.unit_impulse(700)
>>> y_tf = signal.lfilter(b, a, x)
>>> y_sos = signal.sosfilt(sos, x)
>>> plt.plot(y_tf, 'r', label='TF')
>>> plt.plot(y_sos, 'k', label='SOS')
>>> plt.legend(loc='best')
>>> plt.show()
../../_images/scipy-signal-sosfilt-1.png