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

  • Post category:Python

数字低通巴特沃斯滤波器是一种用于滤除数字信号中高频成分的数字滤波器。该滤波器具有平滑响应特性,能够有效去除信号中高频噪声以及其他干扰成分。Python语言提供了多种数字信号处理的工具包,其中Scipy库提供了数字信号滤波器的实现。接下来,将介绍Python中数字低通巴特沃斯滤波器的实现流程。

一、Python中数字低通巴特沃斯滤波器的实现流程

Python中数字低通巴特沃斯滤波器的实现流程如下:

  1. 导入必要的库
from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt
  1. 定义数字低通巴特沃斯滤波器函数
def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='lowpass', analog=False)
    return b, a
  1. 定义滤波函数
def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

其中,butter_lowpass函数用来计算巴特沃斯滤波器的系数,butter_lowpass_filter函数用来对输入信号进行滤波处理。

  1. 读取输入信号
data = np.loadtxt('input_signal.txt')
  1. 定义滤波器参数
fs = 500      # 采样频率
cutoff = 50  # 截止频率
order = 6    # 滤波器阶数
  1. 对输入信号进行滤波处理
filtered_data = butter_lowpass_filter(data, cutoff, fs, order)
  1. 绘制滤波后的信号
plt.figure(figsize=(10, 5))
plt.plot(data, 'b-', label='input signal')
plt.plot(filtered_data, 'g-', linewidth=2, label='filtered signal')
plt.xlabel('Time(s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()

二、示例说明

接下来通过两个示例说明数字低通巴特沃斯滤波器的使用。

示例一:在心电信号上应用数字低通巴特沃斯滤波器

首先下载心电信号数据集,并将信号数据保存为文本格式(如ecg_signal.txt)。然后读取信号数据,绘制原始信号和滤波后的信号。

from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='lowpass', analog=False)
    return b, a

def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

# 读取心电信号
signal = np.loadtxt('ecg_signal.txt')

# 设置滤波器参数
fs=1000           # 采样频率
cutoff = 50       # 截止频率
order = 6         # 滤波器阶数

# 应用数字低通巴特沃斯滤波器
filtered_signal = butter_lowpass_filter(signal, cutoff, fs, order)

# 绘制滤波前后信号
plt.figure(figsize=(10, 5))
plt.plot(signal, 'b-', label='raw signal')
plt.plot(filtered_signal, 'g-', linewidth=2, label='filtered signal')
plt.xlabel('Time(s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()

示例二:在声音信号上应用数字低通巴特沃斯滤波器

首先,从音频文件中读取音频信号,并将音频信号保存为文本格式(如audio_signal.txt)。然后,读取音频信号数据,绘制原始信号和滤波后的信号。

from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='lowpass', analog=False)
    return b, a

def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

# 读取音频信号
signal = np.loadtxt('audio_signal.txt')

# 设置滤波器参数
fs=8000           # 采样频率
cutoff = 1000     # 截止频率
order = 6         # 滤波器阶数

# 应用数字低通巴特沃斯滤波器
filtered_signal = butter_lowpass_filter(signal, cutoff, fs, order)

# 绘制滤波前后信号
plt.figure(figsize=(10, 5))
plt.plot(signal, 'b-', label='raw signal')
plt.plot(filtered_signal, 'g-', linewidth=2, label='filtered signal')
plt.xlabel('Time(s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()