python脑电信号数据预处理 小波去噪
时间: 2025-05-10 10:26:51 浏览: 28
### Python 实现脑电信号的小波去噪
Python 提供了多种库用于信号处理,其中 `PyWavelets` 是一个小波分析的强大工具包。它能够执行离散小波变换 (DWT),这对于去除脑电信号中的噪声非常有效[^1]。
以下是基于 PyWavelets 的脑电信号小波去噪的具体方法:
#### 安装依赖
为了实现小波去噪功能,需安装以下库:
```bash
pip install pywt matplotlib numpy scipy
```
#### 小波去噪的核心原理
小波去噪的主要思想是利用小波分解将信号分为不同频率分量,在这些分量中阈值化系数以减少噪声的影响。具体过程包括以下几个方面:
- 使用合适的小波基函数对信号进行多尺度分解。
- 对每一层的高频细节部分设置合适的阈值,从而保留主要特征而抑制噪声。
- 进行重构操作得到去噪后的信号[^2]。
#### 示例代码
以下是一个完整的 Python 代码示例,展示如何使用 PyWavelets 库对脑电信号进行小波去噪:
```python
import numpy as np
import pywt
import matplotlib.pyplot as plt
def wavelet_denoise(signal, wavelet='db4', level=3, threshold_mode='soft'):
"""
基于小波变换的信号去噪
参数:
signal: 输入的一维时间序列信号
wavelet: 所选的小波基名称,默认为 'db4'
level: 分解层数,默认为 3 层
threshold_mode: 阈值模式 ('soft' 或 'hard')
返回:
denoised_signal: 去噪后的信号
"""
# 计算最佳阈值
coefficients = pywt.wavedec(signal, wavelet, mode='per', level=level)
sigma = np.median(np.abs(coefficients[-1])) / 0.6745
threshold = sigma * np.sqrt(2 * np.log(len(signal)))
# 阈值化处理
new_coefficients = [
pywt.threshold(c, value=threshold, mode=threshold_mode) if i != 0 else c
for i, c in enumerate(coefficients)
]
# 重构信号
denoised_signal = pywt.waverec(new_coefficients, wavelet, mode='per')
return denoised_signal
# 模拟带有噪声的脑电信号
np.random.seed(42)
clean_signal = np.sin(2 * np.pi * 0.1 * np.arange(1000))
noise = np.random.normal(scale=0.5, size=len(clean_signal))
noisy_signal = clean_signal + noise
# 去噪处理
denoised_signal = wavelet_denoise(noisy_signal)
# 可视化结果
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(clean_signal, label="Clean Signal", color="green")
plt.legend()
plt.subplot(3, 1, 2)
plt.plot(noisy_signal, label="Noisy Signal", color="red")
plt.legend()
plt.subplot(3, 1, 3)
plt.plot(denoised_signal, label="Denoised Signal", color="blue")
plt.legend()
plt.tight_layout()
plt.show()
```
上述代码实现了以下功能:
1. **输入信号**:模拟了一个干净的正弦波信号,并加入高斯白噪声形成含噪信号。
2. **小波分解与重构**:采用 Daubechies 4 (`db4`) 小波基对信号进行三层分解,随后通过软阈值法消除噪声影响。
3. **可视化对比**:分别展示了原始清洁信号、含噪信号以及最终去噪效果。
#### 关键参数说明
- `wavelet`: 表示所选用的小波基函数,常见的有 `haar`, `dbN`(Daubechies),`symN`(Symlets)等。
- `level`: 控制小波分解的层次数,通常建议不超过 $\log_2(N)$,其中 $N$ 是信号长度。
- `threshold_mode`: 设置为 `'soft'` 或 `'hard'` 来决定阈值化的策略。
---
###
阅读全文
相关推荐




















