scipy.signal.
sosfiltfilt#
- scipy.signal.sosfiltfilt(sos, x, axis=-1, padtype='odd', padlen=None)[源代码][源代码]#
使用级联二阶部分的正反向数字滤波器。
关于此方法的更多完整信息,请参见
filtfilt
。- 参数:
- sosarray_like
二阶滤波器系数的数组,形状必须为
(n_sections, 6)
。每一行对应一个二阶部分,前三个列提供分子系数,后三个列提供分母系数。- xarray_like
要过滤的数据数组。
- 轴int, 可选
应用过滤器的 x 轴。默认值为 -1。
- padtypestr 或 None, 可选
必须是 ‘odd’, ‘even’, ‘constant’, 或 None。这决定了应用于填充信号的滤波器使用的扩展类型。如果 padtype 是 None,则不使用填充。默认值是 ‘odd’。
- padlenint 或 None, 可选
在应用滤波器之前,在 axis 的两侧扩展 x 的元素数量。此值必须小于
x.shape[axis] - 1
。padlen=0
表示没有填充。默认值为:3 * (2 * len(sos) + 1 - min((sos[:, 2] == 0).sum(), (sos[:, 5] == 0).sum()))
在末尾的额外减法试图补偿原点处的极点和零点(例如,对于奇数阶滤波器),以产生与使用
scipy.signal
函数构建的二阶节滤波器的filtfilt
相当的 padlen 估计值。
- 返回:
- yndarray
与 x 形状相同的过滤输出。
参见
注释
Added in version 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)
创建一个低通Butterworth滤波器,并用它来过滤 x。
>>> sos = butter(4, 0.125, output='sos') >>> y = sosfiltfilt(sos, x)
作为比较,使用
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()