这一篇文章主要介绍如何读取eeglab示例文件.set以及.locs文件
(1).set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等
(2).locs文件记录的是电极位置信息
知识点:
mne中使用mne.io.read_raw_eeglab()读取.set文件
利用mne.channels.read_custom_montage()读取.locs文件
read_raw_eeglab()函数介绍:
mne.io.read_raw_eeglab(input_fname,
montage='deprecated',
eog=(),
preload=False,
uint16_codec=None,
verbose=None)
参数解读:
input_fname: .set文件的存放路径
montage=‘deprecated’:该参数已经舍弃了,在0.19版本中,它的功能可以通过set_montage方法来实现;
eog:指定eog通道的通道名称或索引,如果设置为auto,则使用包含eog和eye的通道名称。默认情况为空元祖;
preload:类型为str或bool,如果为True,则数据将预加载到内存中,以满足更快速的索引;
uint16_codec:类型str或None,允许指定读取字符数组时应用的编解码器(比如,‘latin1’或者‘utf-8’)
下面来看一个案例
import mne
import matplotlib.pyplot as plt
'''
通过mne.io.read_raw_eeglab来读取.set文件
得到原始数据对象
'''
raw=mne.io.read_raw_eeglab('Eeglab_data.set',preload=False)
2.绘制从第5s开始,5s时间窗口长的原始数据
start:指定开始绘制的时间
duration:要绘制的时间窗口
raw.plot(start=5,duration=5)
plt.show()
从该图中可以看出每个通道的数据波动情况
可以通过设置duration的大小来放大或缩小
这个有点类似于eeglab中,放大缩小功能,这里相同大小的窗口显示更短时间的数据,相当于eeglab的选中数据进行放大,反之,即缩小
'''
设置duration=1,相当于放大
'''
raw.plot(start=5,duration=1)
plt.show()
3.通常raw的数据访问方式如下:
data,times=raw[picks,time_slice]
picks:根据条件挑选出来的索引
time_slice:时间切片
想要获取raw中所有数据,以下两种方式均可:
data,times=raw[:]
data,times=raw[:,:]
'''
获取1-3秒内的EEG数据
获取前5条,时间从1秒开始到3秒为止的数据
raw[:5,int(sfreq*1):int(sfreq*3)]
'''
sfreq=raw.info['sfreq']
data,times=raw[:5,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title('Sample channels')
4.读取.locs文件
"""
打印通道名
"""
print(raw.info['ch_names'])
从上述打印的结果可以看到,原始数据中通道名称并非电极位置的命名,因此需要将其映射成电极位置名称。
mapping = {
'EEG 000': 'FPz', 'EEG 001': 'EOG1', 'EEG 002': 'F3', 'EEG 003': 'Fz',
'EEG 004': 'F4', 'EEG 005': 'EOG2', 'EEG 006': 'FC5', 'EEG 007': 'FC1',
'EEG 008': 'FC2', 'EEG 009': 'FC6', 'EEG 010': 'T7', 'EEG 011': 'C3',
'EEG 012': 'C4', 'EEG 013': 'Cz', 'EEG 014': 'T8', 'EEG 015': 'CP5',
'EEG 016': 'CP1', 'EEG 017': 'CP2', 'EEG 018': 'CP6', 'EEG 019': 'P7',
'EEG 020': 'P3', 'EEG 021': 'Pz', 'EEG 022': 'P4', 'EEG 023': 'P8',
'EEG 024': 'PO7', 'EEG 025': 'PO3', 'EEG 026': 'POz', 'EEG 027': 'PO4',
'EEG 028': 'PO8', 'EEG 029': 'O1', 'EEG 030': 'Oz', 'EEG 031': 'O2'
}
# 根据映射名对原始数据中的通道名进行重命名
raw.rename_channels(mapping)
"""
读取.locs文件,.locs文件记录的是电极头皮位置
"""
montage=mne.channels.read_custom_montage("eeglab_chan32.locs")
"""
设置脑电图中传感器配置(电极位置配置)
"""
raw.set_montage(montage,raise_if_subset=False)
"""
打印设置电极位置后的通道名
"""
print(raw.info['ch_names'])
5.绘制电极位置
# 绘制电极位置
raw.plot_sensors()
plt.show()
"""
绘制通道位置图,并对应位置上显示通道名称
"""
layout_from_raw = mne.channels.make_eeg_layout(raw.info)
layout_from_raw.plot()
plt.show()
"""
上述效果也可通过
mne.channels.find_layout(raw.info, ch_type='eeg')
来读取
"""
layout_from_raw =mne.channels.find_layout(raw.info, ch_type='eeg')
layout_from_raw.plot()
plt.show()
6.绘制各通道的功率谱密度
"""
绘制各通道的功率谱密度
"""
raw.plot_psd()
plt.show()
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,spatial_colors=True)
plt.show()
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的平均PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,average=True)
plt.show()
因为我没有下载EEGLAB,所以也没有示例数据,只是敲了一遍代码,文中的图均来自于脑机接口公众号