前言
- 本篇主要介绍如何读取edf脑电数据
一、什么是EDF?
- EDF: 全称是 European Data Format(欧洲数据格式),是一种标准文件格式,用于交换和存储医疗时间序列,其能够存储多通道的数据,允许每个信号拥有不同的采样频率。所以,EDF 也是多导睡眠图(PSG)录音的流行格式。
- EDF的扩展名为EDF +,与EDF基本兼容:所有现有的EDF阅读器也显示EDF +信号;
- EDF +: 可存储任何医疗记录,如肌电图,诱发电位,心电图,以及自动和手动分析结果,如δ图,QRS参数和睡眠阶段。
脑电其它常用格式:心理学MATLAB初学者教程 – 脑电数据读取
二、处理EDF文件
1. 软件读取EDF
常见的读取 EDF 文件的软件有以下几种:
使用EDFbrowser示例(效果如下图所示,还能像视频一样播放):
2. Python 读写EDF
2.1 使用MNE
- 内容详见:MNE-python读取.edf文件
2.2 使用Pyedflib
- 源码: 官网下载示例
- 解析:
- 读取文件示例:
import numpy as np
import pyedflib
def read_edf(file):
f = pyedflib.EdfReader(file)
print("\nlibrary version: %s" % pyedflib.version.version)
print("\ngeneral header:\n")
print("edfsignals: %i" % f.signals_in_file)
print("file duration: %i seconds" % f.file_duration)
print("startdate: %i-%i-%i" %
(f.getStartdatetime().day, f.getStartdatetime().month,
f.getStartdatetime().year))
print("starttime: %i:%02i:%02i" %
(f.getStartdatetime().hour, f.getStartdatetime().minute,
f.getStartdatetime().second))
print("recording: %s" % f.getPatientAdditional())
print("patientcode: %s" % f.getPatientCode())
print("gender: %s" % f.getGender())
print("birthdate: %s" % f.getBirthdate())
print("patient_name: %s" % f.getPatientName().encode('ascii').decode('unicode_escape'))
print("patient_additional: %s" % f.getPatientAdditional())
print("admincode: %s" % f.getAdmincode())
print("technician: %s" % f.getTechnician())
print("equipment: %s" % f.getEquipment())
print("recording_additional: %s" % f.getRecordingAdditional())
print("datarecord duration: %f seconds" % f.getFileDuration())
print("number of datarecords in the file: %i" % f.datarecords_in_file)
print("number of annotations in the file: %i" % f.annotations_in_file)
channel = 3
print("\nsignal parameters for the %d.channel:\n\n" % channel)
print("label: %s" % f.getLabel(channel))
print("samples in file: %i" % f.getNSamples()[channel])
# print("samples in datarecord: %i" % f.get
print("physical maximum: %f" % f.getPhysicalMaximum(channel))
print("physical minimum: %f" % f.getPhysicalMinimum(channel))
print("digital maximum: %i" % f.getDigitalMaximum(channel))
print("digital minimum: %i" % f.getDigitalMinimum(channel))
print("physical dimension: %s" % f.getPhysicalDimension(channel))
print("prefilter: %s" % f.getPrefilter(channel))
print("transducer: %s" % f.getTransducer(channel))
print("samplefrequency: %f" % f.getSampleFrequency(channel))
annotations = f.readAnnotations()
for n in np.arange(f