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,则两者都是 a 和 b 被归一化为a[0]
。- xarray_like
要筛选的数据数组。
- axis整型,可选
的轴线 x “过滤”的适用范围。默认值为-1。
- padtype字符串或无,可选
必须是“奇数”、“偶数”、“常量”或“无”。这确定要用于应用过滤的填充信号的分机类型。如果 padtype 为NONE,则不使用填充。默认值为“ODD”。
- padlen整型或无型,可选
要扩展的元素数 x 在的两端 axis 在使用过滤之前。该值必须小于
x.shape[axis] - 1
。padlen=0
表示没有填充。默认值为3 * max(len(a), len(b))
。- method字符串,可选
确定处理信号边缘的方法,“PAD”或“GRASS”。什么时候 method 为“PAD”,则信号被填充;填充的类型由 padtype 和 padlen ,以及 irlen 被忽略。什么时候 method 是“阵风”,则使用Gustafsson的方法,并且 padtype 和 padlen 都被忽略了。
- 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()
应用
filtfilt
至 sig ,一次使用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()
这个 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 论点。两者之间的区别 y1 和 y2 很小。对于长信号,使用 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