一、scipy.signal
模块简介
scipy.signal
模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中butter()
和filtfilt()
是两个常用的函数。
二、butter()
函数
butter()
函数用于设计巴特沃斯(Butterworth)滤波器。巴特沃斯滤波器是一种低通、高通、带通或带阻滤波器,其特点是在通带内具有平坦的幅度响应,在阻带内具有快速的衰减。
1. 函数签名
scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba', fs=None)
N
:滤波器的阶数,一个正整数。Wn
:归一化截止频率,对于低通和高通滤波器,它是一个单一的浮点数;对于带通和带阻滤波器,它是一个包含两个浮点数的元组。btype
:滤波器类型,可以是'low'(低通)、'high'(高通)、'band'(带通)或'stop'(带阻)。analog
:如果为True,则返回模拟滤波器系数,否则返回数字滤波器系数。output
:输出类型,可以是'ba'(分子和分母系数)、'zpk'(零点、极点和增益)或'sos'(二阶节)。fs
:采样频率,仅当analog=False
且output='ba'
时有效。
2. 代码示例
import numpy as np
from scipy.signal import butter, lfilter
import matplotlib.pyplot as plt
# 采样频率和信号时长
fs = 1000 # Hz
t = np.arange(0, 1, 1/fs) # 1秒的信号
# 原始信号:正弦波 + 噪声
f0 = 50 # Hz
x = np.sin(2 * np.pi * f0 * t) + 0.5 * np.random.randn(len(t))
# 设计一个4阶的低通巴特沃斯滤波器,截止频率为80Hz
N = 4
Wn = 80 / (fs / 2) # 归一化截止频率
b, a = butter(N, Wn, btype='low')
# 滤波后的信号
y = lfilter(b, a, x)
# 绘制原始信号和滤波后的信号
plt.figure(figsize=(10, 6))
plt.plot(t, x, label='Original signal')
plt.plot(t, y, label='Filtered signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid(True)
plt.show()
三、filtfilt()
函数
filtfilt()
函数使用线性滤波器对信号进行零相位滤波。与传统的lfilter()
函数相比,filtfilt()
函数在滤波过程中会先对信号进行前向滤波,然后对结果进行反向滤波,从而消除相位失真。
1. 函数签名
scipy.signal.filtfilt(b, a, x, axis=-1, padtype='odd', padlen=None, method='pad', irlen=None)
b
、a
:滤波器的分子和分母系数。x
:要滤波的信号。axis
:沿哪个轴进行滤波。padtype
、padlen
:用于确定填充类型和长度的参数。method
:填充方法,可以是'pad'(默认)或'gust'。irlen
:用于计算滤波器的脉冲响应的长度。
2. 代码示例
由于filtfilt()
函数使用与butter()
函数相同的滤波器系数,我们可以直接使用上面的b
和a
来滤波信号。
```python
使用filtfilt()进行零相位滤波
y_filtfilt = filtfilt(b, a, x)
绘制原始信号和filtfilt滤波后的信号
plt.figure(figsize=(10, 6))
plt.plot(t, x, label='Original signal')
plt.plot
处理结果:
一、scipy.signal
模块简介
scipy.signal
模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中butter()
和filtfilt()
是两个常用的函数。
二、butter()
函数
butter()
函数用于设计巴特沃斯(Butterworth)滤波器。巴特沃斯滤波器是一种低通、高通、带通或带阻滤波器,其特点是在通带内具有平坦的幅度响应,在阻带内具有快速的衰减。
1. 函数签名
```python
2. 代码示例
```python
采样频率和信号时长
原始信号:正弦波 + 噪声
设计一个4阶的低通巴特沃斯滤波器,截止频率为80Hz
滤波后的信号
绘制原始信号和滤波后的信号
filtfilt()
函数使用线性滤波器对信号进行零相位滤波。与传统的lfilter()
函数相比,filtfilt()
函数在滤波过程中会先对信号进行前向滤波,然后对结果进行反向滤波,从而消除相位失真。
1. 函数签名
```python
2. 代码示例
由于filtfilt()
函数使用与butter()
函数相同的滤波器系数,我们可以直接使用上面的b
和a
来滤波信号。
```python