scipy.signal.
sosfilt#
- scipy.signal.sosfilt(sos, x, axis=-1, zi=None)[源代码][源代码]#
使用级联的二阶部分沿一个维度过滤数据。
使用由 sos 定义的数字 IIR 滤波器对数据序列 x 进行滤波。
- 参数:
- sosarray_like
二阶滤波器系数的数组,形状必须为
(n_sections, 6)
。每一行对应一个二阶部分,前三个列提供分子系数,后三个列提供分母系数。- xarray_like
一个N维的输入数组。
- 轴int, 可选
输入数据数组的轴,沿着该轴应用线性滤波器。滤波器沿着此轴应用于每个子数组。默认值为 -1。
- zi类似数组, 可选
级联滤波器延迟的初始条件。它是一个形状为
(n_sections, ..., 2, ...)
的(至少2D)向量,其中..., 2, ...
表示 x 的形状,但将x.shape[axis]
替换为2。如果 zi 为 None 或未给出,则假设初始静止状态(即所有零)。请注意,这些初始条件与lfiltic
或lfilter_zi
给出的初始条件不同。
- 返回:
- yndarray
数字滤波器的输出。
- zfndarray,可选
如果 zi 为 None,则不返回此项,否则,zf 保存最终的滤波器延迟值。
参见
注释
滤波器函数采用直接形式II转置结构的二阶滤波器序列实现。其设计旨在最小化高阶滤波器的数值精度误差。
Added in version 0.16.0.
示例
使用
lfilter
和sosfilt
绘制一个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()