scipy.signal.sosfiltfilt

scipy.signal.sosfiltfilt(sos, x, axis=- 1, padtype='odd', padlen=None)[源代码]

一种采用级联二阶段级联的前后向数字过滤。

看见 filtfilt 有关此方法的更完整信息,请参见。

参数
sosarray_like

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

xarray_like

要筛选的数据数组。

axis整型,可选

的轴线 x “过滤”的适用范围。默认值为-1。

padtype字符串或无,可选

必须是“奇数”、“偶数”、“常量”或“无”。这确定要用于应用过滤的填充信号的分机类型。如果 padtype 为NONE,则不使用填充。默认值为“ODD”。

padlen整型或无型,可选

要扩展的元素数 x 在的两端 axis 在使用过滤之前。该值必须小于 x.shape[axis] - 1padlen=0 表示没有填充。默认值为::

3 * (2 * len(sos) + 1 - min((sos[:, 2] == 0).sum(),
                            (sos[:, 5] == 0).sum()))

末尾的额外减法试图补偿原点处的极点和零点(例如,对于奇数阶滤波器),以产生 padlen 对于那些 filtfilt 生成的二阶部分筛选器的 scipy.signal 功能。

退货
yndarray

具有与相同形状的过滤输出 x

注意事项

0.18.0 新版功能.

示例

>>> from scipy.signal import sosfiltfilt, butter
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

向过滤发出有趣的信号。

>>> n = 201
>>> t = np.linspace(0, 1, n)
>>> x = 1 + (t < 0.5) - 0.25*t**2 + 0.05*rng.standard_normal(n)

创建低通巴特沃斯过滤,并将其用于过滤 x

>>> sos = butter(4, 0.125, output='sos')
>>> y = sosfiltfilt(sos, x)

要进行比较,请使用以下方式申请8个订单:过滤 sosfilt 。过滤使用的前四个值的平均值进行初始化 x

>>> from scipy.signal import sosfilt, sosfilt_zi
>>> sos8 = butter(8, 0.125, output='sos')
>>> zi = x[:4].mean() * sosfilt_zi(sos8)
>>> y2, zo = sosfilt(sos8, x, zi=zi)

绘制结果图。请注意, y 匹配输入,而 y2 具有显著的相位延迟。

>>> plt.plot(t, x, alpha=0.5, label='x(t)')
>>> plt.plot(t, y, label='y(t)')
>>> plt.plot(t, y2, label='y2(t)')
>>> plt.legend(framealpha=1, shadow=True)
>>> plt.grid(alpha=0.25)
>>> plt.xlabel('t')
>>> plt.show()
../../_images/scipy-signal-sosfiltfilt-1.png