Python中的数字低通巴特沃斯滤波器

  • Post category:Python

数字低通巴特沃斯滤波器是一种常见的数字信号处理技术,可以用于降低数字信号中的高频成分,滤除噪声和干扰信号,从而得到更加清晰的信号。在Python中,可以使用scipy库中的butter函数实现数字低通巴特沃斯滤波器,具体步骤如下:

  1. 导入scipy库中的相关函数。
from scipy.signal import butter, lfilter
  1. 定义一个函数,用于生成数字低通巴特沃斯滤波器的系数。
def butter_lowpass_filter(cutoff, fs, order = 5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype = 'low', analog = False)
    return b, a

在上述函数中,cutoff参数表示低通滤波器的截止频率(单位为Hz),fs参数表示采样频率,order参数表示滤波器的阶数(默认为5阶)。函数内部首先计算出Nyquist频率,然后将截止频率转换为归一化频率,最后使用butter函数生成滤波器系数。

  1. 使用生成的滤波器系数对信号进行滤波。
def lowpass_filter(data, cutoff, fs, order = 5):
    b, a = butter_lowpass_filter(cutoff, fs, order = 5)
    y = lfilter(b, a, data)
    return y

在上述函数中,data参数表示需要滤波的数字信号,cutofffsorder参数与前面的函数相同,ba数组分别代表滤波器系数,lfilter函数将输入信号进行滤波,返回滤波后的信号y

下面给出两个示例说明:

  1. 使用数字低通巴特沃斯滤波器对心电图信号进行滤波。
import numpy as np
import matplotlib.pyplot as plt

# 生成模拟心电图数据
fs = 1000   # 采样频率为1000Hz
t = np.arange(0, 2, 1/fs)
x = np.sin(2 * np.pi * 60 * t) + 0.5 * np.sin(2 * np.pi * 120 * t)
noise = 0.2 * np.random.randn(len(t))
ecg = x + noise

# 对心电图信号进行滤波
cutoff = 100   # 截止频率为100Hz
y = lowpass_filter(ecg, cutoff, fs, order = 5)

# 绘制滤波前后的心电图信号
fig, ax = plt.subplots(2, 1, figsize = (15, 6))
ax[0].plot(t, ecg)
ax[0].set_xlabel('Time (s)')
ax[0].set_ylabel('Amplitude')
ax[0].set_title('Original ECG')
ax[1].plot(t, y)
ax[1].set_xlabel('Time (s)')
ax[1].set_ylabel('Amplitude')
ax[1].set_title('Filtered ECG')
plt.show()

上述代码首先生成了一个模拟心电图信号,然后使用lowpass_filter函数对信号进行滤波,截止频率设置为100Hz。最后使用Matplotlib库将滤波前后的心电图信号画在同一张图上。

  1. 使用数字低通巴特沃斯滤波器对声音信号进行滤波。
from scipy.io import wavfile

# 读取音频文件
fs, data = wavfile.read('example.wav')

# 将音频信号转化为单声道信号
if len(data.shape) > 1:
    data = np.mean(data, axis = 1)

# 对音频信号进行滤波
cutoff = 1000   # 截止频率为1000Hz
y = lowpass_filter(data, cutoff, fs, order = 5)

# 将滤波后的音频信号保存为新文件
wavfile.write('example_filtered.wav', fs, y.astype(np.int16))

上述代码使用wavfile函数从音频文件中读取声音信号,并使用lowpass_filter函数对信号进行滤波,截止频率设置为1000Hz。最后将滤波后的音频信号保存为新文件。