scipy.signal.

sosfiltfilt#

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

基于串联二次部分的正向-反向数字滤波器。

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

参数:
sos类数组

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

x类数组

要过滤的数据数组。

axis整数,可选

应用滤波器的 x 的轴。默认为 -1。

padtype字符串或 None,可选

必须为“odd”、“even”、“constant”或 None。这决定了用以应用滤波器的填充信号的扩展类型。如果 padtype 为 None,则不使用填充。默认值为“odd”。

padlen整数或 None,可选

在对滤波器应用之前,扩展元素的数量以xaxis的两端扩展前面元素。该值必须小于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具有相同形状的滤波输出。

另请参阅

filtfiltsosfiltsosfilt_zisosfreqz

注意

已添加到 0.18.0 版中。

示例

>>> import numpy as np
>>> 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)

为了进行比较,使用sosfilt应用一个 8 阶滤波器。该滤波器使用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