人体睡眠分期-预处理(Ⅱ 小波阈值去噪)

该博客介绍了如何利用Python的MNE库和PyWavelets库对脑电信号(EEG)进行预处理,特别是通过小波阈值法去除噪声。代码示例展示了从EDF文件读取数据,转换信号单位,处理标签,以及应用db4小波进行五层分解和重构来实现去噪的过程。最后,通过绘制原始信号和去噪后的信号对比展示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前对于脑电信号预处理的研究已经较为成熟,如:Eeglab中的带通滤波、陷波滤波,巴特沃斯滤波器以及小波阈值法等。实验室目前主要使用小波阈值法对EEG信号进行预处理,代码如下:

import mne                                       # 导入脑机处理库
from mne import label                            
import scipy.io as scio                
import numpy as np
import matplotlib.pyplot as plt
import pywt
import math
from collections import Counter

raw_data_path='C:\\Users\\Administrator\\Desktop\\EEG signal process\\EEG Dataset\\exercise\\SC4001E0-PSG.edf'
data_label_path='C:\\Users\\Administrator\\Desktop\\EEG signal process\\Pretreatment\\label\\label(.txt)\\SC4001E0_label.txt'

raw_data=mne.io.read_raw_edf(raw_data_path)      # 六个通道的PSG文件
eeg_data,time=raw_data[:2,:]                     # eeg_data为PSG中前两通道(Fpz-oz&Pz-oz)数据,time为时间
eeg_data[0:2]*=1000000                           # EEG信号较为微弱,将其单位转换为微伏

# 标签处理
f=open(data_label_path)
line=f.readline()                                # 读取标签文件的每一行
label_list=[]
while line:                                         
    num=list(map(int,line.split()))              # 对分隔后的line中的每个元素更改为int格式
    label_list.append(num[0])                    # 将标签值加入标签列表中
    line=f.readline()                            # 读取下一行
f.close()
label_1=np.array(label_list[:])                  # 转置标签列表,label_1.shape=(2650,)

index=[]                                         # 时间索引
data=[]                                                     

eeg_data_Fpz=eeg_data[0,:]                       # 选取EEG中Fpz-oz通道信号  

for i in range(len(eeg_data_Fpz)-1):             
    X=float(i)                                   
    Y=float(eeg_data_Fpz[i])
    index.append(X/100)                          # 采样频率100Hz
    data.append(Y)

# 小波阈值去噪
w=pywt.Wavelet('db4')                            # 小波基为db4
maxlev=pywt.dwt_max_level(len(data),w.dec_len)
threshold=0.35                                   # 小波阈值

coeffs=pywt.wavedec(data,'db4',level=5)          # 使用五层小波分解

for i in range(1,len(coeffs)):
    coeffs[i]=pywt.threshold(coeffs[i],threshold)*max(coeffs[i])   # 对噪声进行滤波

datarec=pywt.waverec(coeffs,'db4')               # 小波重构

mintime=0
maxtime=mintime+len(data)+1

# 绘制信号去噪前后图
plt.figure()
plt.subplot(2,1,1)
plt.plot(index[mintime:maxtime], data[mintime:maxtime])
plt.xlabel('time (s)')
plt.ylabel('microvolts (uV)')
plt.title("Raw signal")

plt.subplot(2, 1, 2)
plt.plot(index[mintime:maxtime], datarec[mintime:maxtime-1])
plt.xlabel('time (s)')
plt.ylabel('microvolts (uV)')
plt.title("De-noised signal using wavelet techniques")

plt.tight_layout()
#plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值