📌  相关文章
📜  在 Scipy 中使用低通数字巴特沃斯滤波器去除噪声 – Python(1)

📅  最后修改于: 2023-12-03 15:23:18.942000             🧑  作者: Mango

在 Scipy 中使用低通数字巴特沃斯滤波器去除噪声 – Python

在数字信号处理中,滤波器是一种用于去除不需要的频带或增强需要的频带的系统。数字滤波器是一种数字信号处理系统,可对数字信号执行各种滤波操作。在本文中,我们将学习使用低通数字巴特沃斯滤波器来去除信号中的噪声。

Scipy中的巴特沃斯滤波器

巴特沃斯滤波器是一种常见的滤波器类型,可被用于数字信号处理中的任意阶低通/高通/带通/带阻类型的滤波器。Scipy是一个用于科学计算的Python库,提供了一些用于数字信号处理的函数。Scipy库中的 signal 模块中就提供了巴特沃斯滤波器的函数。

# 导入必要库
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 生成信号
t = np.linspace(0, 1, 1000, False)
s1 = np.sin(2 * np.pi * 10 * t)  # 10 Hz正弦波
s2 = np.sin(2 * np.pi * 20 * t)  # 20 Hz正弦波
s3 = np.sin(2 * np.pi * 30 * t)  # 30 Hz正弦波
s = s1 + s2 + s3  # 合并所有信号作为一个整体信号

# 添加噪声
noise = 0.5 * np.random.randn(len(t))
s = s + noise

# 绘制信号和噪声
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t, s)
ax1.set_title('Original signal')
ax2.plot(t, noise)
ax2.set_title('Noise')
plt.show()

以上代码将生成一个带有噪声的三个正弦波的信号。接下来,我们将使用低通巴特沃斯滤波器去除这些噪声。我们将使用 scipy.signal.butter 函数来将滤波器设计为一个数字滤波器。

# 设计滤波器
nyquist_rate = 0.5 * 1000  # 采样频率的一半
lowcut_rate = 15  # 截止频率为15 Hz
lowcut = lowcut_rate / nyquist_rate
order = 5  # 选择5次滤波器

b, a = signal.butter(order, lowcut, btype='lowpass', analog=False)

# 使用滤波器
filtered_signal = signal.filtfilt(b, a, s)

# 绘制滤波后的信号
plt.plot(t, filtered_signal, 'r-', linewidth=2)
plt.title('Filtered signal')
plt.xlabel('Time [seconds]')
plt.show()

现在可以看到,经过滤波后,信号已被去噪,但正弦波仍然保留。

结论

Python和Scipy为我们提供了在数字信号处理中使用滤波器的简单而强大的选择。使用低通数字巴特沃斯滤波器可以成功地去除信号中的噪声,同时保留关键信号。