深入浅出 EDF+ 文件协议 —— 医疗信号数据的标准语言
一、EDF+ 是什么?
EDF+(European Data Format Plus)是 EDF 文件协议的扩展版,由 Kemp 等人于 2003 年提出。
它在 EDF 的基础上,增加了对以下能力的支持:
| 功能 | EDF | EDF+ |
|---|---|---|
| 连续信号记录 | ✅ 支持 | ✅ 支持 |
| 不连续信号(多段) | ❌ 不支持 | ✅ 支持 |
| 注释(事件标记) | ❌ 不支持 | ✅ 支持 |
| 丢包/暂停标识 | ❌ 不支持 | ✅ 支持 |
| 病人/记录信息结构化 | 简单文本 | 结构化字段 |
| 时间戳精度 | 秒级 | 毫秒级(可通过注释通道) |
EDF+ 是目前医疗信号归档和交换的事实标准之一,广泛用于:
- EEG/ECG/EMG 研究
- 睡眠呼吸暂停检测(PSG)
- 呼吸机数据记录与分析
二、EDF+ 文件结构总览
EDF+ 文件与 EDF 文件的结构保持兼容:
+------------------------+
| Header (文本描述段) |
+------------------------+
| Data Records (信号段) |
+------------------------+
不同的是:
- EDF+ 的 Header 中会明确标识版本号
"EDF+C"或"EDF+D" - EDF+ 的 Data Records 中包含一个特殊通道
"EDF Annotations"
用来记录事件、注释、暂停时间段等信息
三、EDF+ Header 结构详解
EDF+ 保留 EDF 的 ASCII 定长字段结构,但在语义上做了扩展。
1️⃣ Header 固定段(前 256 字节)
| 字节偏移 | 长度 | 字段 | 示例 | 说明 |
|---|---|---|---|---|
| 0–7 | 8 | 版本号 | 0 或 EDF+C / EDF+D | EDF+ 版本标识 |
| 8–87 | 80 | 病人信息 | Startdate X ID 1234 M 42y | 结构化字段 |
| 88–167 | 80 | 记录信息 | Starttime Study1 TechnicianA | 支持多部分记录 |
| 168–175 | 8 | 开始日期 | 12.11.25 | dd.mm.yy |
| 176–183 | 8 | 开始时间 | 14.23.05 | hh.mm.ss |
| 184–191 | 8 | Header 长度 | 6144 | 以字节计 |
| 208–215 | 8 | 记录数 | -1 | 若不连续记录,可为 -1 |
| 216–223 | 8 | 每记录持续时间 | 1.000000 | 秒 |
| 224–231 | 4–8 | 信号数 | 4 | 含注释信号 |
版本号字段是区分 EDF 与 EDF+ 的关键:
"EDF+C"→ 连续记录(Continuous)"EDF+D"→ 不连续记录(Discontinuous)
2️⃣ 信号头部(每个通道 256 字节)
EDF+ 在 EDF 的每个信号描述段基础上,新增或调整了部分字段语义。
其中最重要的区别是存在一个特殊通道:
Label = "EDF Annotations"
此通道不存储物理信号,而是记录文本注释,结构如下:
| 字段 | 示例 | 说明 |
|---|---|---|
+<onset> | +12.3456 | 事件相对于记录起始的秒数(浮点数) |
<duration> | (5.0) | 持续时间,可省略 |
<annotation> | Hypopnea event | 注释文本,可包含空格 |
<separator> | \x14 (ASCII 20) | 注释间分隔符 |
<terminator> | \x00 | 记录结束标志 |
示例原始内容:
+12.3456\x14(5.0)\x14Hypopnea event\x14\x00
表示:
- 事件在第 12.3456 秒发生
- 持续 5 秒
- 注释内容为 “Hypopnea event”(低通气事件)
四、EDF+ 中的“不连续记录”
在 EDF 中,所有记录必须是连续采样的。
而 EDF+ 支持 非连续记录(Discontinuous)模式,例如:
- 设备暂停工作
- 采集过程分多次进行
- 仅保存关键事件片段
在 Header 的版本号中使用 "EDF+D" 即表示这种模式。
文件的“每记录持续时间”仍固定,但 EDF+ 会通过注释信号标识跳变或间隔。
示例注释:
+0.0000\x14(Paused)\x14
+600.0000\x14(Resume)\x14
代表中间有 10 分钟未采样的数据。
五、EDF+ 的时间系统
EDF 的时间戳精度只有到秒,而 EDF+ 可以通过注释信号在毫秒级标记事件。
EDF+ 的时间体系是相对时间(从文件起始算起),而不是绝对时间戳。
常见策略:
- Header 记录采集开始的绝对时间
- 注释信号标识相对偏移(可小数秒)
在分析工具中,可以轻松恢复绝对时间序列。
六、EDF 与 EDF+ 的对比总结
| 特性 | EDF | EDF+ |
|---|---|---|
| 文件头版本 | 0 | EDF+C / EDF+D |
| 注释通道 | ❌ | ✅(EDF Annotations) |
| 不连续数据支持 | ❌ | ✅ |
| 时间精度 | 秒 | 毫秒(注释) |
| 病人信息格式 | 任意字符串 | 标准化格式 |
| 向后兼容 | — | ✅ 可被 EDF 解析器读取(部分功能降级) |
七、实际案例:睡眠呼吸暂停 EDF+ 文件
假设你在做睡眠呼吸监测系统,可定义如下 EDF+ 文件:
| 通道 | 单位 | 描述 |
|---|---|---|
| Flow | L/min | 气流量信号 |
| Pressure | cmH₂O | 呼吸压力信号 |
| SpO2 | % | 血氧饱和度 |
| EDF Annotations | — | 事件注释通道 |
注释示例:
+0.0000\x14(Start Recording)\x14
+123.4567\x14(10.0)\x14Apnea\x14
+300.0000\x14(5.0)\x14Hypopnea\x14
+3600.0000\x14(End Recording)\x14
这些注释能让软件(如 EDFbrowser、SleepStage、MNE 等)自动识别事件片段。
八、用 Python 生成 EDF+ 文件示例
Python 的 pyedflib 支持 EDF+ 文件写入:
import pyedflib
import numpy as np
n_channels = 3
signal_labels = ['Flow', 'Pressure', 'SpO2']
file = pyedflib.EdfWriter('output.edf', n_channels=n_channels, file_type=pyedflib.FILETYPE_EDFPLUS)
fs = 100 # 采样率
duration = 10 # 秒
signals = [np.random.randn(fs * duration) for _ in range(n_channels)]
# 写入信号通道
for i in range(n_channels):
file.setSignalHeader(i, {
'label': signal_labels[i],
'dimension': 'a.u.',
'sample_rate': fs,
'physical_min': -1.0,
'physical_max': 1.0,
'digital_min': -32768,
'digital_max': 32767
})
file.writeSamples(signals)
# 写入注释(EDF+)
file.writeAnnotation(1.23, 10.0, 'Apnea event')
file.writeAnnotation(5.67, -1, 'Hypopnea')
file.close()
生成的文件可以直接用 EDFbrowser 打开,注释会出现在事件轨道上。
九、常用 EDF+ 查看与解析工具
| 工具 | 用途 | 支持平台 |
|---|---|---|
| EDFbrowser | 可视化、注释、事件标记 | Windows / macOS / Linux |
| MNE-Python | EEG/ECG 分析与可视化 | Python |
| pyedflib | 读写 EDF/EDF+ 文件 | Python |
| BioSig | MATLAB EDF+ 解析 | MATLAB / Octave |
🔚 十、总结
| 特点 | EDF+ 意义 |
|---|---|
| 向后兼容 | 旧 EDF 软件仍可打开 EDF+ |
| 结构可扩展 | 支持注释、事件、暂停 |
| 适合多模态信号 | EEG、ECG、SpO₂、呼吸机、睡眠监测 |
| 工业标准 | 被 EU/ISO/PhysioNet 广泛采用 |
📘 延伸阅读
- Kemp, B., et al. “A simple format for exchange of digitized polygraphic recordings”, 2003.
- EDF+ Specification (Official Site)
- PhysioNet EDF Database Examples
- EDFbrowser 下载地址
3020

被折叠的 条评论
为什么被折叠?



