深入浅出 EDF+ 文件协议 —— 医疗信号数据的标准语言

ModelEngine·创作计划征文活动 10w+人浏览 1.4k人参与

深入浅出 EDF+ 文件协议 —— 医疗信号数据的标准语言

一、EDF+ 是什么?

EDF+(European Data Format Plus)是 EDF 文件协议的扩展版,由 Kemp 等人于 2003 年提出。
它在 EDF 的基础上,增加了对以下能力的支持:

功能EDFEDF+
连续信号记录✅ 支持✅ 支持
不连续信号(多段)❌ 不支持✅ 支持
注释(事件标记)❌ 不支持✅ 支持
丢包/暂停标识❌ 不支持✅ 支持
病人/记录信息结构化简单文本结构化字段
时间戳精度秒级毫秒级(可通过注释通道)

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–78版本号0EDF+C / EDF+DEDF+ 版本标识
8–8780病人信息Startdate X ID 1234 M 42y结构化字段
88–16780记录信息Starttime Study1 TechnicianA支持多部分记录
168–1758开始日期12.11.25dd.mm.yy
176–1838开始时间14.23.05hh.mm.ss
184–1918Header 长度6144以字节计
208–2158记录数-1若不连续记录,可为 -1
216–2238每记录持续时间1.000000
224–2314–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+ 的对比总结

特性EDFEDF+
文件头版本0EDF+C / EDF+D
注释通道✅(EDF Annotations
不连续数据支持
时间精度毫秒(注释)
病人信息格式任意字符串标准化格式
向后兼容✅ 可被 EDF 解析器读取(部分功能降级)

七、实际案例:睡眠呼吸暂停 EDF+ 文件

假设你在做睡眠呼吸监测系统,可定义如下 EDF+ 文件:

通道单位描述
FlowL/min气流量信号
PressurecmH₂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-PythonEEG/ECG 分析与可视化Python
pyedflib读写 EDF/EDF+ 文件Python
BioSigMATLAB EDF+ 解析MATLAB / Octave

🔚 十、总结

特点EDF+ 意义
向后兼容旧 EDF 软件仍可打开 EDF+
结构可扩展支持注释、事件、暂停
适合多模态信号EEG、ECG、SpO₂、呼吸机、睡眠监测
工业标准被 EU/ISO/PhysioNet 广泛采用

📘 延伸阅读

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值