📌  相关文章
📜  在 Scipy 中使用双线性变换方法设计 IIR 高通巴特沃斯滤波器 – Python(1)

📅  最后修改于: 2023-12-03 14:51:10.319000             🧑  作者: Mango

在 Scipy 中使用双线性变换方法设计 IIR 高通巴特沃斯滤波器 – Python

简介

滤波器是信号处理中常用的一种技术,它可以对信号进行频率选择性的处理。巴特沃斯滤波器是一种常见的滤波器类型,用于实现低通、高通、带通或带阻滤波等功能。本文将介绍如何使用 Scipy 库中的双线性变换方法设计 IIR 高通巴特沃斯滤波器。

环境准备

在运行本示例代码之前,请确保已经安装了以下库:

  • Python 3.x
  • Scipy

你可以使用以下命令来安装 Scipy:

pip install scipy
设计 IIR 高通巴特沃斯滤波器

IIR(Infinite Impulse Response)滤波器是一种递归滤波器,它的输出取决于当前和过去的输入值。巴特沃斯滤波器是一种常用的 IIR 滤波器类型。高通巴特沃斯滤波器可以用于滤除低频信号,保留高频信号。

下面是使用 Scipy 中的双线性变换方法设计高通巴特沃斯滤波器的示例代码:

import numpy as np
from scipy.signal import butter, filtfilt

def highpass_butterworth_filter(data, cutoff_freq, sample_rate, order=5):
    # 计算归一化的截止频率
    nyquist_freq = 0.5 * sample_rate
    cutoff_freq_normalized = cutoff_freq / nyquist_freq

    # 使用 Butterworth 滤波器设计函数计算滤波器系数
    b, a = butter(order, cutoff_freq_normalized, btype='high', analog=False, output='ba')

    # 对数据进行滤波
    filtered_data = filtfilt(b, a, data)

    return filtered_data
使用示例

下面是使用上述高通巴特沃斯滤波器的示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 生成带噪声的输入信号
sample_rate = 1000
t = np.linspace(0, 1, sample_rate, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t)  # 50 Hz 正弦信号
noise = 0.2 * np.random.randn(sample_rate)  # 高斯白噪声
input_signal = signal + noise

# 设计高通巴特沃斯滤波器,截止频率为 30 Hz
cutoff_freq = 30
filtered_signal = highpass_butterworth_filter(input_signal, cutoff_freq, sample_rate)

# 绘制原始信号和滤波后的信号
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(t, input_signal, 'b', label='Input Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal, 'r', label='Filtered Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.legend()

plt.show()

运行上述代码,将显示包含原始信号和滤波后信号的绘图。

总结

本文介绍了如何使用 Scipy 中的双线性变换方法设计高通巴特沃斯滤波器。你可以根据自己的需求调整滤波器的截止频率、阶数等参数来实现不同的滤波效果。希望本文能帮助你更好地理解和应用滤波器技术。