EDF数据集解析为指定.MAT结构时cnt与mrk字段对应数据定位
EDF数据集与目标MAT结构字段对应关系
cnt字段(连续EEG信号)
EDF加载到MNE的raw对象后,连续脑电信号直接通过raw.get_data()方法提取即可。
- 该方法默认返回数组维度为
[通道数 × 时间点],按照要求做一次转置就能得到[时间点 × 通道数]的目标格式,转成int16类型后和参考样例结构完全匹配。
对应实现代码:
# 提取连续EEG信号,转置匹配cnt字段维度要求 cnt = raw.get_data().T.astype("int16") # 维度校验:输出格式应为(总采样点数, 通道数) print(cnt.shape)
mrk字段(事件标记结构体)
EDF中的事件标记全部存储在raw.annotations属性中,直接提取即可得到mrk需要的两个核心变量:
event_onsets:事件对应的采样点索引。先从raw.annotations.onset拿到事件的秒级时间戳,乘以采样率后取整,转成int32类型、调整形状为(1, 事件总数)即可,和参考数据格式一致。event_codes:事件对应的类别标签。从raw.annotations.description拿到每个事件的文本描述后,按照定义的类别映射规则转成数值(比如left对应1、right对应-1),转成int16类型、调整形状和event_onsets对齐即可。
对应实现代码:
# 提取事件起始采样点 event_onsets = (raw.annotations.onset * sample_rate).round().astype("int32").reshape(1, -1) # 映射事件编码,可根据实际EDF里的事件描述调整映射规则 event_codes = np.array( [1 if desc == "left" else -1 for desc in raw.annotations.description], dtype="int16" ).reshape(1, -1) # 组装为Matlab兼容的mrk结构体,保存时用scipy.io.savemat即可正常识别 mrk = np.array([[(event_onsets, event_codes)]], dtype=[("pos", "O"), ("y", "O")])
注意:如果EDF文件事件没有写在标准Annotations段,而是存在单独的标记通道,先用
mne.find_events(raw)针对标记通道检测事件,返回结果的第一列就是采样点索引、第三列就是事件编码,后续处理逻辑和上面完全一致。
内容的提问来源于stack exchange,提问作者Iuri Sampaio
相关产品推荐
相关产品推荐

