目前对于脑电信号预处理的研究已经较为成熟,如: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()