以下是一个使用 Python 进行带通滤波去除噪声的示例代码,并附带详细解释和可视化结果:

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

# 生成一个包含噪声的正弦波信号
time = np.linspace(0, 10, 1000)
signal_noise = np.sin(2*np.pi*5*time) + np.random.normal(0, 0.5, 1000)

# 设计带通滤波器,通带频率为 (4, 6) Hz
b, a = signal.butter(4, [4/50, 6/50], 'bandpass')

# 对信号进行滤波
signal_filtered = signal.filtfilt(b, a, signal_noise)

# 绘制原始信号、带通滤波后的信号和滤波器的频率响应曲线
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True)
ax1.plot(time, signal_noise)
ax1.set_title('Noisy Signal')
ax2.plot(time, signal_filtered)
ax2.set_title('Filtered Signal')
ax3.plot(*signal.freqz(b, a))
ax3.set_title('Filter Frequency Response')
plt.show()

该代码生成一个包含噪声的正弦波信号,然后使用 scipy.signal 模块的 butter() 函数设计一个 4 阶带通滤波器,通带频率为 (4, 6) Hz,再使用 filtfilt() 函数对信号进行滤波。最后,绘制原始信号、带通滤波后的信号和滤波器的频率响应曲线。

运行该代码后可以得到以下结果:

Bandpass Filter Example

代码详解:

  • signal_noise = np.sin(2*np.pi*5*time) + np.random.normal(0, 0.5, 1000): 生成一个包含噪声的正弦波信号。np.sin(2*np.pi*5*time) 生成一个频率为 5 Hz 的正弦波,np.random.normal(0, 0.5, 1000) 生成一个均值为 0、标准差为 0.5 的正态分布随机噪声,两者相加得到包含噪声的信号。
  • b, a = signal.butter(4, [4/50, 6/50], 'bandpass'): 使用 butter() 函数设计一个 4 阶带通滤波器,通带频率为 (4, 6) Hz。参数解释:
    • 4: 滤波器阶数,阶数越高,滤波器越陡峭,但计算量也会更大。
    • [4/50, 6/50]: 通带频率,以归一化频率表示,即频率除以采样频率 (50 Hz)。
    • 'bandpass': 滤波器类型,指定为带通滤波器。
  • signal_filtered = signal.filtfilt(b, a, signal_noise): 使用 filtfilt() 函数对信号进行滤波。filtfilt() 函数是双向滤波器,可以减少滤波器的相位延迟,得到更精确的结果。
  • fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True): 创建一个包含三个子图的图形,用来绘制原始信号、带通滤波后的信号和滤波器的频率响应曲线。
  • ax1.plot(time, signal_noise): 绘制原始信号。
  • ax2.plot(time, signal_filtered): 绘制带通滤波后的信号。
  • ax3.plot(*signal.freqz(b, a)): 绘制滤波器的频率响应曲线。freqz() 函数计算滤波器的频率响应。
  • plt.show(): 显示图形。

总结:

该代码演示了如何使用 Python 的 scipy.signal 模块进行带通滤波去除噪声。通过设计一个带通滤波器,并使用 filtfilt() 函数对信号进行滤波,可以有效地去除信号中的噪声。此外,代码还提供了可视化的结果,方便理解滤波器的效果。

Python 带通滤波去除噪声实例:代码详解及可视化

原文地址: http://www.cveoy.top/t/topic/mJHP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录