MNE是用于探索、可视化和分析人类神经生理学数据的开源 Python 包
这里使用的数据集为BCI CompetitionIV(2008)中的数据集2a。数据集文件如下图:
使用mne.io.read_raw_gdf()读取,具体参数设置见官网:https://mne.tools/stable/generated/mne.io.read_raw_gdf.html#examples-using-mne-io-read-raw-gdf
1.读取数据
import mne
import matplotlib.pyplot as plt
input_fname = 'BCI_data/BCICIV_2a_gdf/A01E.gdf' # 选取01E文档
# 通道名称映射
mapping = {
'EEG-Fz': 'eeg',
'EEG-0': 'eeg',
'EEG-1': 'eeg',
'EEG-2': 'eeg',
'EEG-3': 'eeg',
'EEG-4': 'eeg',
'EEG-5': 'eeg',
'EEG-C3': 'eeg',
'EEG-6': 'eeg',
'EEG-Cz': 'eeg',
'EEG-7': 'eeg',
'EEG-C4': 'eeg',
'EEG-8': 'eeg',
'EEG-9': 'eeg',
'EEG-10': 'eeg',
'EEG-11': 'eeg',
'EEG-12': 'eeg',
'EEG-13': 'eeg',
'EEG-14': 'eeg',
'EEG-Pz': 'eeg',
'EEG-15': 'eeg',
'EEG-16': 'eeg',
'EOG-left': 'eog',
'EOG-central': 'eog',
'EOG-right': 'eog'
}
raw = mne.io.read_raw_gdf(input_fname)
raw.set_channel_types(mapping) # 这里我进行了一步映射,如果不映射会显示无法将EEG与EOG区分开
显示脑电数据的信息
print(raw)
print(raw.info)
如果不进行映射,打印的结果如下:
<RawGDF | A01E.gdf, 25 x 687000 (2748.0 s), ~29 kB, data not loaded>
<Info | 7 non-empty values
bads: []
ch_names: EEG-Fz, EEG-0, EEG-1, EEG-2, EEG-3, EEG-4, EEG-5, EEG-C3, EEG-6, ...
chs: 25 EEG
custom_ref_applied: False
highpass: 0.5 Hz
lowpass: 100.0 Hz
meas_date: 2005-01-19 12:00:00 UTC
nchan: 25
projs: []
sfreq: 250.0 Hz
可以看到chs那里把EOG通道也归到EEG通道中了,正确结果应为下面打印的:
<RawGDF | A01E.gdf, 25 x 687000 (2748.0 s), ~29 kB, data not loaded>
<Info | 7 non-empty values
bads: []
ch_names: EEG-Fz, EEG-0, EEG-1, EEG-2, EEG-3, EEG-4, EEG-5, EEG-C3, EEG-6, ...
chs: 22 EEG, 3 EOG
custom_ref_applied: False
highpass: 0.5 Hz
lowpass: 100.0 Hz
meas_date: 2005-01-19 12:00:00 UTC
nchan: 25
projs: []
sfreq: 250.0 Hz
>
显示前10秒所有的脑电信号
plt.figure(figsize=(10, 8))
raw.plot(duration=10, n_channels=25, scalings='auto')
plt.show()
结果如图:
60HZ下的psd
raw.plot_psd(fmax=60)
plt.show()
结果如下图:(我觉得这个绘制的有点问题,通道数不明显,有懂得可以讨论一下)
获取10-20秒内良好的eog数据
# 方法一
picks = mne.pick_types(raw.info, eog=True, exclude='bads') # 换成eeg即可显示eeg数据
t_idx = raw.time_as_index([10., 20.])
data, times = raw[picks, t_idx[0]:t_idx[1]]
plt.plot(times, data.T)
plt.title("Sample channels")
plt.show()
# 方法二
sfreq = raw.info['sfreq']
data, times = raw[22:25, int(sfreq*10):int(sfreq*20)]
plt.plot(times, data.T)
plt.title("Sample channels")
plt.show()
结果如下图所示:
方法一:
方法二: