Python 中 MNE 讀取EEG競賽數據繪圖和提取epoch(gdf格式)

上一篇文章中介紹了研究讀取gdf格式數據的心路歷程,繞了半天竟然直接操作就可以。本來以爲會很容易,畢竟數據都已經成功讀入了,可是我又錯了,弄了好久讀取的數據繪圖都不對(打印看數據是對的),感覺是mne的一個bug,在Github上提issue可是網絡不給力,圖片死活傳不上,最後給開發團隊發了封郵件,也不知道能不能回我。。。。好在經過不懈努力,試了多種方法,總算有一種方法可以成功繪製數據圖像了。

問題描述,讀取數據繪圖,可以明顯看出EEG數據繪製的圖像有問題。

rawDataGDF = mne.io.read_raw_gdf("B0101T.gdf",preload=True,eog=['EOG:ch01', 'EOG:ch02', 'EOG:ch03'])

rawDataGDF.plot()

打印輸出數據查看,並沒有發現異常。

又嘗試了N多的方法,也沒有定位到問題的根本原因,雖然嚴重懷疑是描述信息(info)有問題,可是比對了好久也沒有發現異常。最後沒辦法了嘗試自己構造RawArray數據結構,雖然麻煩一些,也是最後的辦法了,好在這個方法可行。

sfreq = 250 

data = np.squeeze(np.array([rawDataGDF['EEG:Cz'][0], rawDataGDF['EEG:C3'][0], rawDataGDF['EEG:C4'][0]]))

ch_types = ['eeg', 'eeg', 'eeg']

ch_names = ['EEG:Cz', 'EEG:C3', 'EEG:C4',]

info = mne.create_info(ch_names=ch_names,sfreq=sfreq,ch_types=ch_types)

raw = mne.io.RawArray(data, info)

raw.plot(n_channels=3,show=True)

最後將代碼整理了下,用於處理EEG競賽的數據,嗯嗯,真香~~

import mne
import matplotlib.pyplot as plt
import numpy as np
%matplotlib auto
#文件路徑和文件名稱
path = "F:\\BaiduNetdiskDownload\\BCICompetition\\BCICIV_2b_gdf\\"
fileName = "B0101T"
#事件的對應關係
eventDescription = {'276': "eyesOpen", '277': "eyesClosed", '768': "startTrail", '769':"cueLeft", '770':"cueRight", '781':"feedback", '783':"cueUnknown",
            '1023': "rejected", '1077': 'horizonEyeMove', '1078': "verticalEyeMove", '1079':"eyeRotation",'1081':"eyeBlinks",'32766':"startRun"}
# 讀取原始數據
rawDataGDF = mne.io.read_raw_gdf(path+fileName+".gdf",preload=True,eog=['EOG:ch01', 'EOG:ch02', 'EOG:ch03'])
# 定義數據通道和通道類型
ch_types = ['eeg', 'eeg', 'eeg','eog','eog','eog']
ch_names = ['EEG:Cz', 'EEG:C3', 'EEG:C4','EOG:ch01', 'EOG:ch02', 'EOG:ch03']
# 創建數據的描述信息
info = mne.create_info(ch_names=ch_names, sfreq=rawDataGDF.info['sfreq'], ch_types=ch_types)
# 創建數據結構體
data = np.squeeze(np.array([rawDataGDF['EEG:Cz'][0], rawDataGDF['EEG:C3'][0], rawDataGDF['EEG:C4'][0], rawDataGDF['EOG:ch01'][0] , rawDataGDF['EOG:ch02'][0] ,rawDataGDF['EOG:ch03'][0]]))
# 創建RawArray類型的數據
rawData = mne.io.RawArray(data, info)
rawData.plot()
# 獲取事件
event,_= mne.events_from_annotations(rawDataGDF)
print(event)
event_id = {}
for i in _:#整理event_id
    event_id[eventDescription[i]] = _[i]
# 提取epoch
epochs = mne.Epochs(rawData,event,event_id, tmax=1.5 ,event_repeated = 'merge')
epochs.plot()
ev_left = epochs['cueLeft']
ev_left.plot()

原始數據圖像 

epochs數據圖像

左手對應得epoch

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章