使用 Python 实现高通滤波器

Vaibhav Vaibhav 2024年2月15日
使用 Python 实现高通滤波器

高通滤波器是限制低于预定义阈值频率或截止频率的信号移动的滤波器。频率大于或等于阈值的信号畅通无阻地通过滤波器。此动作会衰减低频信号。高通滤波器过滤掉不需要的噪音,例如声音。

在本文中,我们将学习如何使用 Python 实现高通滤波器。

使用 Python 实现高通滤波器

高通滤波器的实现使用了 4 个 Python 模块,即 numpypandasscipymatplotlib

numpy 模块是一个强大的 Python 模块,具有丰富的实用程序,可用于处理大型多维矩阵和数组。这些实用程序有助于无缝地对矩阵执行复杂和直接的数学运算。这些实用程序针对输入进行了优化和高度动态化。

要安装最新版本的 numpy 模块,请使用以下 pip 命令之一。

pip install numpy
pip3 install numpy

pandas 模块是一个功能强大且灵活的开源数据分析和数据操作模块,用 Python 编写。

要安装 pandas 模块,请使用以下 pip 命令之一。

pip install pandas
pip3 install pandas

scipy 模块是用于科学和技术计算的开源 Python 模块。

要安装 scipy 模块,请使用以下 pip 命令之一。

pip install scipy
pip3 install scipy

而且,matplotlib 模块是一个全面且优化的 Python 库,用于数据的图形可视化。

要安装最新版本的 matplotlib 模块,请使用以下 pip 命令之一。

pip install matplotlib
pip3 install matplotlib

现在我们已经完成了关于库的简要介绍,让我们看看高通滤波器的 Python 代码。

import numpy as np
import pandas as pd
from scipy import signal
import matplotlib.pyplot as plt


def sine_generator(fs, sinefreq, duration):
    T = duration
    n = fs * T
    w = 2.0 * np.pi * sinefreq
    t_sine = np.linspace(0, T, n, endpoint=False)
    y_sine = np.sin(w * t_sine)
    result = pd.DataFrame({"data": y_sine}, index=t_sine)
    return result


def butter_highpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = signal.butter(order, normal_cutoff, btype="high", analog=False)
    return b, a


def butter_highpass_filter(data, cutoff, fs, order=5):
    b, a = butter_highpass(cutoff, fs, order=order)
    y = signal.filtfilt(b, a, data)
    return y


fps = 30
sine_fq = 10
duration = 10
sine_5Hz = sine_generator(fps, sine_fq, duration)
sine_fq = 1
duration = 10
sine_1Hz = sine_generator(fps, sine_fq, duration)
sine = sine_5Hz + sine_1Hz
filtered_sine = butter_highpass_filter(sine.data, 10, fps)
plt.figure(figsize=(20, 10))
plt.subplot(211)
plt.plot(range(len(sine)), sine)
plt.title("Generated Signal")
plt.subplot(212)
plt.plot(range(len(filtered_sine)), filtered_sine)
plt.title("Filtered Signal")
plt.show()

python 高通滤波器

在上面的代码中,正弦频率或 sine_fq 值应以赫兹或 Hz 为单位,持续时间或 duration 应以秒或 sec 为单位。生成的信号是原始信号,滤波后的信号是高通滤波器形成的信号。生成的图表显示了两者之间的差异。

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.