scipy.signal.filtfilt

scipy.signal.filtfilt(b, a, x, axis=- 1, padtype='odd', padlen=None, method='pad', irlen=None)[源代码]

将数字过滤向前和向后应用于信号。

此功能将线性数字过滤应用两次,一次向前,一次向后。合并后的过滤零期,过滤订单量是原来的两倍。

该功能提供处理信号边缘的选项。

该函数 sosfiltfilt (和过滤设计使用 output='sos' )应该优先于 filtfilt 对于大多数过滤任务,由于二阶截面的数值问题较少。

参数
b(n,)类似数组

过滤的分子系数向量。

a(n,)类似数组

过滤的分母系数向量。如果 a[0] 不是1,则两者都是 ab 被归一化为 a[0]

xarray_like

要筛选的数据数组。

axis整型,可选

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

padtype字符串或无,可选

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

padlen整型或无型,可选

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

method字符串,可选

确定处理信号边缘的方法,“PAD”或“GRASS”。什么时候 method 为“PAD”,则信号被填充;填充的类型由 padtypepadlen ,以及 irlen 被忽略。什么时候 method 是“阵风”,则使用Gustafsson的方法,并且 padtypepadlen 都被忽略了。

irlen整型或无型,可选

什么时候 method 是“阵风”, irlen 指定过滤的脉冲响应长度。如果 irlen 为NONE,则脉冲响应的任何部分都不会被忽略。对于长信号,请指定 irlen 可以显著提升过滤的性能。

退货
yndarray

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

注意事项

什么时候 method 为“PAD”时,该函数以三种方式之一沿给定轴填充数据:奇数、偶数或常量。奇数和偶数扩展具有关于数据终点的对应对称性。常量扩展使用端点上的值扩展数据。在向前和向后两次传球中,过滤的初始条件都是通过以下公式求出的 lfilter_zi 并通过扩展数据的端点对其进行缩放。

什么时候 method 是“阵风”,古斯塔夫松的方法 [1] 是使用的。为向前和向后传球选择初始条件,使向前向后的过滤给出与向后向前的过滤相同的结果。

在Scipy版本0.16.0中添加了使用GuStason方法的选项。

参考文献

1

古斯塔夫森,“确定前向后向滤波的初始状态”,“信号处理学报”,第46卷,第988-992页,1996年。

示例

这些示例将使用中的几个函数 scipy.signal

>>> from scipy import signal
>>> import matplotlib.pyplot as plt

首先,我们创建一个1秒的信号,它是频率为5 Hz和250 Hz的两个纯正弦波的总和,采样频率为2000 Hz。

>>> t = np.linspace(0, 1.0, 2001)
>>> xlow = np.sin(2 * np.pi * 5 * t)
>>> xhigh = np.sin(2 * np.pi * 250 * t)
>>> x = xlow + xhigh

现在创建一个截止频率为奈奎斯特频率0.125倍的低通巴特沃斯过滤,并将其应用于 x 使用 filtfilt 。结果应该大致为 xlow ,没有相移。

>>> b, a = signal.butter(8, 0.125)
>>> y = signal.filtfilt(b, a, x, padlen=150)
>>> np.abs(y - xlow).max()
9.1086182074789912e-06

对于这个人工示例,我们得到了一个相当干净的结果,因为奇怪的扩展是准确的,并且使用中等长度的填充,过滤的瞬变在到达实际数据时已经消散了。一般来说,边缘的瞬态效应是不可避免的。

以下示例演示了该选项 method="gust"

一是打造过滤。

>>> b, a = signal.ellip(4, 0.01, 120, 0.125)  # Filter to be applied.

sig 是要过滤的随机输入信号。

>>> rng = np.random.default_rng()
>>> n = 60
>>> sig = rng.standard_normal(n)**3 + 3*rng.standard_normal(n).cumsum()

应用 filtfiltsig ,一次使用Gustafsson方法,一次使用填充,并绘制结果以进行比较。

>>> fgust = signal.filtfilt(b, a, sig, method="gust")
>>> fpad = signal.filtfilt(b, a, sig, padlen=50)
>>> plt.plot(sig, 'k-', label='input')
>>> plt.plot(fgust, 'b-', linewidth=4, label='gust')
>>> plt.plot(fpad, 'c-', linewidth=1.5, label='pad')
>>> plt.legend(loc='best')
>>> plt.show()
../../_images/scipy-signal-filtfilt-1_00_00.png

这个 irlen 参数可以用来改进Gustafsson方法的性能。

估计过滤的冲激响应长度。

>>> z, p, k = signal.tf2zpk(b, a)
>>> eps = 1e-9
>>> r = np.max(np.abs(p))
>>> approx_impulse_len = int(np.ceil(np.log(eps) / np.log(r)))
>>> approx_impulse_len
137

将过滤应用于更长的信号,使用和不使用 irlen 论点。两者之间的区别 y1y2 很小。对于长信号,使用 irlen 显著提高了性能。

>>> x = rng.standard_normal(5000)
>>> y1 = signal.filtfilt(b, a, x, method='gust')
>>> y2 = signal.filtfilt(b, a, x, method='gust', irlen=approx_impulse_len)
>>> print(np.max(np.abs(y1 - y2)))
1.80056858312e-10