本文简要介绍 python 语言中 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]
.- x: array_like
要过滤的数据数组。
- axis: 整数,可选
应用过滤器的 x 轴。默认值为 -1。
- padtype: str 或无,可选
必须是‘odd’, ‘even’, ‘constant’,或无。这决定了用于应用滤波器的填充信号的扩展类型。如果 padtype 为 None,则不使用填充。默认值为‘odd’。
- padlen: int 或无,可选
要扩展的元素数x在两端轴在应用过滤器之前。该值必须小于
x.shape[axis] - 1
.padlen=0
意味着没有填充。默认值为3 * max(len(a), len(b))
.- method: str,可选
确定处理信号边沿的方法,“pad” 或“gust”。当method为“pad”时,信号被填充; padding的类型由padtype和padlen决定,irlen被忽略。当method为“gust”时,使用Gustafsson的方法,忽略padtype和padlen。
- irlen: int 或无,可选
当method为“gust”时,irlen指定滤波器的脉冲响应长度。如果 irlen 为 None,则不会忽略任何部分的脉冲响应。对于长信号,指定 irlen 可以显著提高滤波器的性能。
- y: ndarray
与 x 形状相同的过滤输出。
参数 ::
返回 ::
注意:
什么时候方法是“pad”,该函数以三种方式之一沿给定轴填充数据:奇数、偶数或常数。奇数和偶数扩展关于数据的端点具有相应的对称性。常量扩展使用端点处的值扩展数据。在前向和后向传播中,通过使用找到过滤器的初始条件scipy.signal.lfilter_zi并通过扩展数据的端点对其进行缩放。
什么时候方法是“gust”,Gustafsson 的方法[1]用来。为前向和后向传递选择初始条件,以便forward-backward 过滤器给出与backward-forward 过滤器相同的结果。
在 scipy 版本 0.16.0 中添加了使用 Gustaffson 方法的选项。
参考:
[1]F. Gustaffson,“确定forward-backward 过滤中的初始状态”,信号处理事务,卷。 46,第 988-992 页,1996 年。
例子:
这些示例将使用
scipy.signal
中的几个函数。>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt
首先,我们创建一个一秒信号,它是两个纯正弦波的总和,频率为 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 倍(即 125 Hz)的低通巴特沃斯滤波器,并将其应用于
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(4000) >>> 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))) 2.875334415008979e-10
相关用法
- Python SciPy signal.firls用法及代码示例
- Python SciPy signal.find_peaks用法及代码示例
- Python SciPy signal.firwin用法及代码示例
- Python SciPy signal.firwin2用法及代码示例
- Python SciPy signal.findfreqs用法及代码示例
- Python SciPy signal.find_peaks_cwt用法及代码示例
- Python SciPy signal.freqs用法及代码示例
- Python SciPy signal.freqs_zpk用法及代码示例
- Python SciPy signal.freqz用法及代码示例
- Python SciPy signal.freqresp用法及代码示例
- Python SciPy signal.fftconvolve用法及代码示例
- Python SciPy signal.freqz_zpk用法及代码示例
- Python SciPy signal.czt_points用法及代码示例
- Python SciPy signal.chirp用法及代码示例
- Python SciPy signal.residue用法及代码示例
- Python SciPy signal.iirdesign用法及代码示例
- Python SciPy signal.max_len_seq用法及代码示例
- Python SciPy signal.kaiser_atten用法及代码示例
- Python SciPy signal.oaconvolve用法及代码示例
- Python SciPy signal.hilbert用法及代码示例
- Python SciPy signal.ricker用法及代码示例
- Python SciPy signal.group_delay用法及代码示例
- Python SciPy signal.cheb2ord用法及代码示例
- Python SciPy signal.get_window用法及代码示例
- Python SciPy signal.lfilter用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.filtfilt。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。