信息速览
一台手环在跑步时报出的心率,和一台心电贴片在同一时刻报出的心率,经常不是同一个数。差别可能来自算法——峰值检测的阈值、RR 序列的平滑窗口、丢搏后的插值策略;也可能来自物理层——电极材质、贴放位置、导线在摆臂时的牵拉。麻烦在于,如果没有第三台设备同时测着同一个人,你永远分不清差异出在哪一层。而可穿戴设备 validation 研究里最常见的做法恰恰是"先用 A 设备测一遍,再换 B 设备测一遍",两次之间隔着换衣服、重新贴电极、体位变化与几分钟的时间差,任何不一致都可以被合理地归因到受试者状态上去。
2017 年 12 月,德国多特蒙德工业大学的莱布尼茨劳动研究所里,13 名健康志愿者被同时挂上五台设备:三台临床认证设备 NeXus-10 MKII、eMotion Faros 360°、SOMNOtouch NIBP,加两台消费级产品 Hexoskin Hx1 与 Polar RS800 Multi。他们站上跑步机,依次完成五分钟静立基线、五分钟以 1.2 m/s 平地步行、五分钟站立不动的听觉 2-back 认知任务、五分钟 15% 坡度上坡行走。五台设备全程同时开着,记录同一颗心脏、同一段呼吸、同一次摆臂。
它的价值不在规模——13 个人、四段五分钟、处理后数据合计 427.80 分钟。价值全在"同步"两个字带来的对照能力:同一时刻的五路心电可以直接比形态,同一时刻的三轴加速度可以直接解释某一路信号为什么脏,8000 Hz 的 NeXus 通道可以给 256 Hz 的通道当 R 峰基准。它回答的不是"哪个设备准",而是"在什么条件下、以什么口径、准到什么程度"。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Simultaneous physiological measurements with five devices at different cognitive and physical loads |
| 发布方 | PhysioNet(数据由德国格赖夫斯瓦尔德大学、多特蒙德工业大学劳动研究所、耶拿大学医院团队贡献) |
| 首次发布 | 2020 年 6 月 16 日,版本 1.0.0 |
| 最近改动 | 2023 年 1 月 18 日,版本 1.0.2,补充并引用原始论文 |
| 采集时间地点 | 2017 年 12 月,德国多特蒙德工业大学莱布尼茨劳动研究所 |
| 受试者数 | 13 名健康成年人,7 女 6 男 |
| 设备数 | 5 台:NeXus-10 MKII / eMotion Faros 360° / SOMNOtouch NIBP / Hexoskin Hx1 / Polar RS800 Multi |
| 实验相位 | 4 段各 5 分钟:静立基线 / 平地步行 1.2 m/s / 听觉 2-back 认知 / 上坡步行 15% 坡度 1.2 m/s |
| 原始信号 | 心电、光电容积描记、加速度、血氧饱和度、呼吸、呼吸率、心率、心率变异性、RR 间期、活动量、体位、踏板频率 |
| 原始采样率 | 1 Hz 到 8000 Hz 之间(各设备各通道不同,存于 EDF 头内) |
| 处理后规格 | 每条记录 46 条信号,统一重采样到 256 Hz |
| 处理后总时长 | 427.80 分钟,单条 29.18 分钟到 39.62 分钟 |
| 标注规模 | 42413 条 R 峰参考标注,单条 2377 到 4256 条 |
| 标注方式 | 人工逐条审阅对齐后的心电生成 R 峰参考;相位起点由 Faros 触发标记人工校正 |
| 文件格式 | 原始:EDF+C 与 Polar .hrm;处理后:WFDB(.dat / .hea / .atr / .aux) |
| 体量 | 未压缩 1.7 GB,ZIP 压缩包 771.4 MB |
| 许可 | Creative Commons Attribution 4.0 International(CC BY 4.0),开放访问无需注册 |
| 典型用途 | 可穿戴心电一致性比对、噪声下的心搏检测、低采样率 R 峰校正、设备间心率与 HRV 差异、从心电或光电容积间接估呼吸 |
§1 它要解决的具体麻烦
1.1 可穿戴验证里那道过不去的归因墙
可穿戴设备的精度研究有一个结构性缺陷:自变量和因变量缠在一起。你想知道"设备 B 的心率算法在运动条件下差多少",做法通常是让受试者戴着 B 运动,同时用一台金标准设备做对照。但"运动条件下"这件事本身会同时劣化两端的信号——金标准设备的电极也在被牵拉,受试者的心律本身也在变。于是观测到的误差是三部分之和:B 的算法误差、B 的物理层误差、以及运动本身带来的生理波动。三者不可分。
要拆开这三者,唯一办法是让多台设备在同一时刻、同一体位、同一生理状态下测同一个人,并且让它们共享一个时间基准。这时某台设备出现偏差,就可以问:其它四台有没有同时出现?如果五台里只有一台偏了,问题在这台的算法或电极;如果五台一起偏,问题是生理或运动伪迹;如果五台偏的方式各不相同,那才是设备间一致性问题。
这个库就是为这件事造的。它的实验设计里最要紧的一句不是"五个设备",而是"同时"(simultaneously)。官方摘要明确把"in contrast to other studies, were recorded simultaneously"当作它的核心卖点。
1.2 四条常见的错误期待
第一条,期待它是"可穿戴设备的排行榜"。13 个人、四段五分钟,样本量只够做方法学对照和方法验证,不够给任何一款产品下排名结论。官方论文给的是形态学噪声信号比与 Smith-Waterman 比对的方法学框架,不是产品评测报告。
第二条,期待它是"临床级的心电数据库"。三台设备有临床认证,两台是消费级,受试者全是健康年轻人,实验里没有任何病理事件。它不能用来训练心律失常分类器,也不能做疾病预测。
第三条,期待处理后数据里还留着 8000 Hz。NeXus 从 x004 起确实把采样率提到了 8000 Hz,但那是原始 EDF 里的事。处理后的 .dat 全部非线性重采样到 256 Hz,8000 Hz 只在 raw_data 里存在。要拿高采样率当 R 峰基准,必须回原始文件。
第四条,期待五台设备的心电都是同一个导联配置。官方说 NeXus、SOMNOtouch、Faros、Hexoskin 测的都是标准三导联心电,但电极材质不同——Hexoskin 用纺织电极,其余用标准 Ag/AgCl 电极;Polar 不用电极测心电,而是用导电橡胶扁平电极的胸带识别心搏,输出 RR 间期。五路"心电"在物理上并不等价。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 设备间心电形态一致性比对 | 同一时刻四路滤波心电加一路 Polar RR 指示信号 | 够,这是设计目标 |
| 噪声下的心搏检测算法评测 | 四段负荷从静立到上坡,配三轴加速度 | 够,且噪声来源可追溯到加速度通道 |
| 低采样率 R 峰位置校正 | 8000 Hz NeXus 原始通道可作基准 | 够,但要回 raw_data |
| 设备间心率与 HRV 差异 | Faros / SOT / Hexoskin / Polar 各自的心率与 HRV 通道 | 够,注意各设备 HRV 的定义口径不同 |
| 从光电容积或心电间接估呼吸 | Hexoskin 主动测呼吸(胸腹两路)作参考,SOT 有光电容积 | 够做方法学探索 |
| 日常活动长时程可穿戴分析 | 四段五分钟,实验室跑步机 | 不够,没有自由生活场景 |
| 心律失常检测训练 | 全部健康受试者 | 不够,无病理事件 |
| 疾病预测或预后建模 | 无随访、无结局、无检验值 | 不够,也不在设计范围内 |
| 大规模深度学习训练 | 13 人 / 427.80 分钟 | 不够,一两个 epoch 就能记全 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做腕式光电容积心率算法,想知道运动伪迹下掉多少 | 同一时刻有心电作真值、有加速度作协变量、有四段强度递进的负荷 | 按相位分段评估,别把静立段与步行段混在一起报一个数 |
| 你在校一台新设备的 RR 间期输出 | 五台同步,可用人工 R 峰参考标注作共同基准 | 用 .atr 作参照,注意 .atr 建在 256 Hz 对齐信号上 |
| 你想证明自己的 R 峰校正方法对低采样率有效 | NeXus 原始 8000 Hz 与处理后 256 Hz 属同一次记录 | 从 raw_data 取 8000 Hz,与 generated_data 的 256 Hz 对齐后比较 |
| 你在做呼吸率估计,缺带呼吸真值的运动数据 | Hexoskin 胸腹两路呼吸加呼吸率质量标记 | 用 breathing_rate_quality 先筛掉质量差的时段 |
| 你要写方法学论文,需要一个公开可复现的对照集 | CC BY 4.0、DOI 稳定、有 SHA256SUMS 校验 | 引用 DOI 10.13026/wce5-fj54 与原始论文 |
| 你在选型采购,想知道买哪款 | — | 不适合,13 人不足以支撑产品排名 |
1.5 一句话判断
它不是"更大的可穿戴数据集",而是"唯一能把设备差异和运动伪迹分开的那把尺子"。作为五设备同步生理库,它的全部价值都压在同一时刻五路信号互为对照这件事上——正因为有这个对照,误差才第一次有了归因的可能。
1.6 不适合谁:四条边界
不适合做产品横向评测。 13 名健康受试者、单一实验室、单一跑步机、四段固定负荷。任何"某品牌更准"的结论在这个样本量上都是过度解读。
不适合做临床算法训练。 没有病人、没有病理事件、没有用药信息、没有结局变量。想做心电诊断相关的事,这个库帮不上忙。
不适合做自由生活场景研究。 全程在跑步机上,姿势、速度、坡度都是脚本化的。真实生活里的转身、上下楼、拿杯子、睡眠翻身都不在里面。
不适合只用 generated_data 就下结论。 处理后数据已经过对齐、非线性重采样、滤波与 z 分数归一,前四路心电的头文件单位字段是空的。任何涉及绝对幅度、绝对时间间隔、原始采样率的结论,都必须回 raw_data 复核。
§2 数据构成与规格
2.1 两套数据、两层抽象
库分两个目录,理解这两者的关系是使用的前提。
raw_data 是五台设备各自的原始导出,未经对齐。SOMNOtouch、NeXus、Faros、Hexoskin 各出一份 EDF+C 文件,用 edf-anonymize 做过匿名化,包含静立期之前数分钟的完整记录;Polar 出一份设备私有的 .hrm 文件,内容是 RR 间期(毫秒)。文件名规则是 x001 到 x013 的受试者编号加设备后缀 FAROS、NEXUS、SOT、HX、POLAR,例如 x004_NEXUS.edf、x004_POLAR.hrm。
generated_data 是把五份原始文件合并之后的产物。官方说明了处理链:按 Vollmer 等人 2019 年发表的方法做时间对齐(用静息期的心搏在五台设备间找相似模式),再把不正确、不稳定的采样率通过非线性重采样统一到 256 Hz 的目标采样率;Polar 的 RR 间期被转成指示函数并经过同样的同步步骤,因此 Polar 的信息在合并文件里表现为一条独立信号。随后人工逐条审阅对齐后的全部心电,生成 R 峰参考标注。Faros 的触发按钮时间戳经过人工检查,并结合运动传感器与心率上升沿重新定位四个实验相位的起点。
两层的关系可以这么记:raw_data 保真但不对齐,generated_data 对齐但不保真。
| 维度 | raw_data | generated_data |
|---|---|---|
| 文件数 | 每受试者 5 个,合计 65 个 | 每受试者 4 个,合计 52 个 |
| 格式 | EDF+C(4 台)、Polar .hrm(1 台) |
WFDB:.dat / .hea / .atr / .aux |
| 时间对齐 | 否,各设备独立时钟与起点 | 是,统一到同一时间轴 |
| 采样率 | 各通道不同,1 Hz 到 8000 Hz | 统一 256 Hz |
| 记录范围 | 含静立期之前数分钟的完整记录 | 裁剪后的分析区段 |
| 单位保真 | 保留 EDF 内的物理单位 | 前四路心电已 z 分数归一,单位字段为空 |
| 典型体积 | 单个 EDF 2.3 MB 到 80.6 MB,.hrm 13.2 KB 到 28.5 KB |
.dat 39.3 MB 到 53.4 MB,.hea 3.1 KB |
2.2 五台设备的角色分工
| 设备 | 厂商与国别 | 定位 | 电极与测量方式 | 在合并文件中的前缀 |
|---|---|---|---|---|
| NeXus-10 MKII | Mind Media B.V.,荷兰 | 临床认证 | 标准 Ag/AgCl 电极,三导联心电 | NEXUS |
| eMotion Faros 360° | Mega Electronics Ltd.,芬兰 | 临床认证 | 标准 Ag/AgCl 电极,三导联心电 | FAROS |
| SOMNOtouch NIBP | SOMNOmedics GmbH,德国 | 临床认证 | 标准 Ag/AgCl 电极,三导联心电 | SOT |
| Hexoskin Hx1 | Carré Technologies Inc.,加拿大 | 消费级 | 纺织电极,三导联心电 | HEXOSKIN |
| Polar RS800 Multi | Polar Electro Oy,芬兰 | 消费级 | 导电橡胶扁平电极胸带,识别心搏输出 RR 间期 | POLAR |
官方在方法部分特意点明了电极差异:只有 Hexoskin 用纺织电极,其余三台测心电的用标准 Ag/AgCl 电极;Polar 不输出波形,只输出已识别心搏的 RR 间期。这个差异是后面所有"设备间不一致"研究的物理基础——同一次心搏,四路是电压随时间的波形,一路是已经过厂商内部算法处理的间期序列,两者不在同一个证据层级上。
原始 EDF 内各设备记录的通道(官方列出的通道名保留原文拼写):
| 设备 | 原始 EDF 内通道 |
|---|---|
| NeXus-10 MKII | 心电 Sensor-B:EEG / Sensor-B:EKG、心率变异性 [B] HRV Amp.、EDF Annotations |
| eMotion Faros 360° | 心电 ECG、三轴加速度 Accelerometer_X/Y/Z、按钮标记 Marker、心率变异性 HRV、设备内部温度 DEV_Temperature |
| SOMNOtouch NIBP | 电池 Akku、心电 EKG / EKG 1 / EKG2 / EKG 3 / aVL / aVR / aVF、血氧 SpO2、光电容积 Pleth、活动与加速度 Aktivitt、体位 Krperlage、脉搏 Puls、EDF Annotations |
| Hexoskin Hx1 | 心电 4113:ECG_I、心率 19:heart_rate、呼吸率 33:breathing_rat、呼吸 4129:resp_thorac / 4130:resp_abdomi、活动 49:activity、三轴加速度 4145:accel_X / 4146:accel_Y / 4147:accel_Z、踏板频率 53:cadence、EDF Annotations |
| Polar RS800 Multi | RR 间期(毫秒),存于设备私有 .hrm 文件 |
官方还留了一条容易踩坑的注记:x001 到 x003 三份 NeXus EDF 里,心电通道名叫 Sensor-B:EEG(标成了脑电),是实验过程中纠正过来的;同时 x004 到 x013 的采样率从 256 Hz 提高到 8000 Hz。所以这三份文件既不能靠通道名检索心电,也没有高采样率。
2.3 四个实验相位:一段脚本化的负荷阶梯
| 顺序 | 相位 | 时长 | 条件 | 生理含义 |
|---|---|---|---|---|
| 1 | 静立基线(Rest) | 5 分钟 | 直立站在跑步机上不动 | 静息基线,运动伪迹最小 |
| 2 | 平地步行(Walking) | 5 分钟 | 跑步机 1.2 m/s | 稳态有氧负荷,周期性步态伪迹 |
| 3 | 听觉 2-back(2-Back) | 5 分钟 | 站立不动完成听觉 n-back 任务 | 认知负荷,运动伪迹回到静息水平 |
| 4 | 上坡步行(Running) | 5 分钟 | 跑步机 15% 坡度、1.2 m/s | 更高负荷,伪迹与心率同时上升 |
相位起点的标记存在 .aux 文件里,来自 Faros 的按钮触发并经过人工校正。官方给出的用法示例读出的注释形如 FAROS_Marker/Rest、FAROS_Marker/Walking、Manual/Walking、FAROS_Marker/2-Back、Manual/Running——带 FAROS_Marker/ 前缀的是设备触发,带 Manual/ 前缀的是人工修订,两者并存时以 Manual/ 为准。注意第三相位的官方标记写作 2-Back,第四相位在标记里写作 Running 而在正文里描述为上坡步行,检索时要两个名字都认。
设计上的巧妙之处在第二与第三相位的对照:两者的运动强度一高一低,但认知负荷一低一高。如果想分离"运动伪迹"与"认知应激"对某路信号的影响,这两段是唯一的抓手。
2.4 合并记录的信号字典
处理后的一条记录声明 46 条信号、256 Hz。x001 与 x004 的头文件都给出这一规格。信号名采用"设备前缀 / 通道名"的写法,前缀即来源设备,因此不看文档也能知道每一路出自哪台。
| 设备前缀 | 信号条数 | 代表通道 | 单位(头文件字段) |
|---|---|---|---|
SOT(SOMNOtouch) |
15 | EKG_filtered、EKG / EKG 1 / EKG2 / EKG 3 / aVL / aVR / aVF、SpO2、Pleth、Puls、Aktivitt、Krperlage、Akku |
心电微伏、血氧百分比、加速度毫克、体位(position)、脉搏 bpm、电池毫伏 |
HEXOSKIN |
18 | ECG_I_filtered、ECG_I、heart_rate、breathing_rate、respiration_thoracic / respiration_abdominal、minute_ventilation、tidal_volume、cadence、activity、acceleration_X/Y/Z、heart_rate_quality、breathing_rate_quality |
心率 bpm、呼吸率、潮气量、踏板频率等,部分通道单位字段为空 |
FAROS |
8 | ECG_filtered、ECG、Accelerometer_X/Y/Z、HRV、Marker、DEV_Temperature |
心电微伏、加速度毫克、HRV 毫秒、温度摄氏度 |
NEXUS |
4 | Sensor-B:EEG_filtered、Sensor-B:EKG、[B] HRV Amp.、EDF Annotations |
心电微伏、HRV 幅值微伏 |
POLAR |
1 | RR_filtered |
单位字段为空(已转为指示函数) |
三条结构性的观察值得单独指出。
其一,文件里前四路是四台设备的预处理心电(SOT、FAROS、NEXUS、HEXOSKIN),官方明确说这四路经过了裁剪滑动平均滤波与 z 分数归一化。这解释了为什么它们的头文件单位字段是空的——它们已经不是物理量,而是无量纲的归一波形。想做幅度相关的分析,请用各自的原始通道(如 SOT/EKG、FAROS/ECG、NEXUS/Sensor-B:EKG、HEXOSKIN/ECG_I),它们的单位字段写着微伏。
其二,Polar 只有一条信号 RR_filtered,因为 Polar 本来就不输出波形。它经过与其余通道相同的同步步骤后变成指示函数。这意味着"用五台设备比心电形态"这句话在实践中只能四台参与,Polar 用来比间期。
其三,SOMNOtouch 的部分通道名丢了德文变音符号,写作 Aktivitt(应为 Aktivität)、Krperlage(应为 Körperlage)。这是 EDF 通道名在跨编码传递时的常见损伤,检索时不要按正确拼写去找。
2.5 一条记录的完整解剖
以 x004 为例。头文件第一行是 x004 46 256 468928:记录名 x004,46 条信号,256 Hz,共 468928 个采样点。468928 ÷ 256 = 1831.75 秒,约 30.5 分钟。x001 的同一行是 x001 46 256 575104,即 2246.5 秒,约 37.4 分钟。两条记录长度不同,是因为原始记录长度不同,处理后只做对齐与裁剪,不补齐到统一长度。
信号行的通用格式为"文件名 格式 增益(基线)/单位 位分辨率 块大小 ADC 零值 初始值 校验和 信号名"。以 x004 的第一路为例:
x004.dat 16 1184.0668(-15717)/ 0 0 -15356 26334 0 SOT/EKG_filtered
从右往左读:信号名 SOT/EKG_filtered;块大小 0(由工具自动按 46 条 16 位信号算帧长);校验和 26334;初始值 -15356;ADC 零值 0;块大小 0;位分辨率 0;单位为空(因为已归一);基线 -15717;增益 1184.0668;存储格式 16(16 位带符号整数);信号文件 x004.dat。
增益逐通道不同,且原始通道与滤波通道的量级差别很大。x004 里 SOT/EKG 的增益是 10.9661(微伏),而 SOT/EKG_filtered 是 1184.0668(无量纲)。这说明"直接把整数喂进模型"在这里是错的——不同列的整数根本不在同一量纲上。正确做法是按头文件换算成物理量,或至少明确知道自己用的是归一通道还是原始通道。
读取一条记录的最小代码:
import wfdb
#-- 远程直读,无需先下载;pn_dir 指向 PhysioNet 上的库名与版本目录
rec = wfdb.rdrecord('x004', pn_dir='simultaneous-measurements/1.0.2/generated_data')
ann = wfdb.rdann('x004', 'atr', pn_dir='simultaneous-measurements/1.0.2/generated_data')
print(rec.fs, rec.sig_len, len(rec.sig_name)) #-- 256 468928 46
print(rec.sig_name[:6]) #-- 前六条信号名,前四路为滤波心电
print(ann.sample[:5], ann.symbol[:5]) #-- R 峰位置与类型
#-- 按相位切段:先读 aux 拿到四段起点
aux = wfdb.rdann('x004', 'aux', pn_dir='simultaneous-measurements/1.0.2/generated_data')
for t, c in zip(aux.sample, aux.aux_note):
print(t, t / rec.fs, c)
rec.p_signal 是按增益与基线换算过的浮点物理值;rec.d_signal 是原始整数。ann.sample 是采样点序号,除以 256 得秒数。aux.aux_note 里装的就是相位名,例如 FAROS_Marker/Rest、Manual/Walking。
2.6 与同类资源的字段差异
| 维度 | 本库 | MIT-BIH 心律失常库 | 日常活动光电容积类库 |
|---|---|---|---|
| 核心价值 | 多设备同一时刻互为对照 | 心搏类型的标准基准 | 自由生活场景下的信号 |
| 受试者 | 13 名健康人 | 住院与门诊混合人群 | 一般为健康志愿者 |
| 心电通道来源 | 4 台设备各一路 | 2 通道 | 通常无心电信道 |
| 是否同时多设备 | 是,5 台 | 否 | 通常 1 到 2 台 |
| 加速度 | 3 台设备各三轴 | 无 | 一般有 |
| 呼吸真值 | Hexoskin 胸腹两路 | 无 | 少数有 |
| 标注对象 | R 峰位置 | 心搏位置与类型 | 多为参考心率 |
| 场景 | 实验室跑步机脚本化 | 临床静息 | 日常自由活动 |
差异的核心在于:别的库在比"信号与标签",这个库在比"信号与信号"。它天然不是一个分类基准,而是一个一致性基准。
这句话还有一层实操含义。用分类基准类的数据时,你的工作流是"取信号、取标签、训练、报分";用一致性基准类的数据时,工作流变成"定时间窗、取多路同源信号、定义比对口径、报告差异的构成"。后者没有现成的评测脚本,因为差异的口径要自己定:是比 R 峰位置的绝对偏差,还是比 RR 间期序列的局部比对得分,还是比形态学噪声信号比。官方原始论文选了后两种,并各自给出了定义。你完全可以选别的口径,但必须在论文里写清楚,否则结果无法与任何既有工作比较。
§3 它是谁的数据
3.1 贡献者与机构
五位作者分属四个机构,分工在官方背景段里写得很清楚。
| 作者 | 机构 | 角色 |
|---|---|---|
| Dominic Bläsing | 德国格赖夫斯瓦尔德大学心理研究所 | 主要研究者,与 Reiser 共同设计实验方案 |
| Julian Elias Reiser | 多特蒙德工业大学莱布尼茨劳动研究所(IfADo) | 共同设计实验方案,提供实验场地 |
| Marcus Vollmer | 格赖夫斯瓦尔德大学医学院生物信息学研究所;DZHK 格赖夫斯瓦尔德站点 | 负责数据处理 |
| Maria Nisser | 耶拿大学医院 | 作者 |
| Anja Buder | 耶拿大学医院物理治疗研究所 | 作者 |
这是一支典型的"人体工效学加生物信息学"组合:实验设计的know-how 来自劳动研究所与心理研究所,信号处理的 know-how 来自生物信息学研究所。这解释了库的两个特征——实验相位设计得非常规整(这正是工效学实验的传统),而预处理链写得非常工程化(对齐、非线性重采样、指示函数变换,都指向信号处理方法学)。
经费来自德国联邦教育与研究部的 Montexas4.0 项目(编号 02L15A261,资助 Bläsing),以及德国心血管研究中心 DZHK 格赖夫斯瓦尔德站点的差旅资助(资助 Vollmer)。
3.2 时间线
| 时间 | 事件 |
|---|---|
| 2017 年 11 月 30 日 | 格赖夫斯瓦尔德大学伦理委员会批准(编号 BB 171/17) |
| 2017 年 12 月 | 13 名受试者在多特蒙德完成采集 |
| 2019 年 | 对齐方法发表(Vollmer 等人,Computing in Cardiology) |
| 2020 年 4 月 | 文件与 RECORDS、ANNOTATORS、传感器布置图写入平台 |
| 2020 年 6 月 16 日 | 版本 1.0.0 发布 |
| 2022 年 | 原始论文发表(Bläsing 等人,PLoS ONE) |
| 2022 年 7 月 20 日 | 版本 1.0.1,修正 Hexoskin 通道量纲并补充伦理声明 |
| 2023 年 1 月 18 日 | 版本 1.0.2,补充并引用原始论文 |
注意一个时间错位:采集在 2017 年底,首版发布在 2020 年 6 月,而 2019 年的对齐方法论文与 2022 年的原始论文都早于或晚于发布节点。这三条时间线交叉说明数据是"边处理边发布"的,而不是一次性交付。
3.3 采集场景:一个刻意做薄的实验
实验环境控制得很紧。同一台跑步机、同一个实验室、同一套设备佩戴顺序、四段固定时长与固定参数。受试者全部健康成年人,7 女 6 男,签署书面知情同意,实验遵循赫尔辛基宣言。
“刻意做薄"是褒义。多设备同步采集的混杂因素本来就多,如果再叠加不同场地、不同操作者、不同佩戴顺序,数据就彻底没法用了。把场景压到最薄,换取的是设备间差异的可辨识度。代价是外部效度:这套数据能告诉你的东西,严格限定在"实验室跑步机上的健康年轻人”。
薄还体现在负荷的设计上。四段相位不是随意挑的,而是构成一个二乘二结构的变体:静立与步行构成运动强度的低高两档,步行与 2-back 构成认知负荷的低高两档。于是"运动伪迹"与"认知应激"两种效应可以在同一批人身上被部分分离——如果某路信号的误差只在步行段变大而 2-back 段不变,那是运动伪迹;如果只在 2-back 段变化,那是认知应激;如果两段都变,可能是心率水平本身的作用。这类归因在单设备数据里做不到,因为缺少同一时刻的参照。
3.4 数据来源的三个层次
第一层是设备厂商的导出格式。EDF+C 是欧洲数据格式带注释的变体,.hrm 是 Polar 私有格式。这一层还没有"数据集",只有五份互不相干的文件。
第二层是匿名化与对齐。edf-anonymize 抹掉了可识别信息,Polar 文件的日期字段被置为 2001-01-01、起始时间置为零点,只保留时长与 RR 序列。对齐与非线性重采样把五份文件拉到同一时间轴,这一步的处理细节写在 2019 年的方法论文里。
第三层是人工标注。R 峰参考标注是人工逐条审阅对齐后的全部心电视图生成的,不是某一台设备的算法输出——这一点很关键,它意味着标注在原则上不偏向任何一台设备。相位起点标记来自 Faros 按钮,但经过人工结合运动传感器与心率上升沿重新定位,因此同时保留了原始与修订两套标记。
§4 它最独特的东西
4.1 "同时"这两个字为什么稀缺
多设备生理数据集并不罕见,罕见的是真的同时测。绝大多数公开资源是"多设备、不同时"——每台设备各测一段,或者同一次实验里设备分批佩戴。这类数据无法支撑设备间一致性研究,因为不同时间点的生理状态本身就在变。
要做到真同步,需要解决三件麻烦事:物理上,五套电极要贴在一个人身上互不干扰,还要找得到各自的位置;时间上,五台设备各有各的时钟与起点,必须建立共同时间轴;采样上,各设备采样率从 1 Hz 到 8000 Hz 不等,且部分设备的采样率并不稳定。官方提到的"校正不正确、不稳定的采样频率"这一句,指向的正是第三件——有些设备标称采样率和实际采样率有偏差,需要非线性重采样修正。
| 层次 | 不同步的数据集 | 本库 |
|---|---|---|
| 时间对齐 | 靠实验记录或事后估计 | 心搏模式匹配加非线性重采样,对齐到 256 Hz |
| 生理状态 | 两次测量间受试者状态已变 | 同一时刻,状态共享 |
| 运动伪迹 | 无法判定是否同时发生 | 三轴加速度给出同时记录 |
| 真值 | 需要额外金标准设备 | 四路心电互为交叉验证,外加人工 R 峰参考 |
4.2 五个官方给出的用法,以及它们的含金量
官方在使用背景里列了四类用法,逐条看它们分别需要什么。
在噪声信号上研究心搏检测与分割。 这是最直接的用法:四段负荷从静立递进到上坡,加速度通道给出了伪迹的独立测量,而人工 R 峰参考标注是建立在全部可用信号基础上的可靠真值。含金量最高,因为它同时解决了"真值"和"噪声解释"两件事。
比较各设备的心率、HRV 与加速度测量。 可行,但要注意口径。各设备的 HRV 通道含义不同——Faros 的 HRV 单位是毫秒,NeXus 的 [B] HRV Amp. 单位是微伏,Hexoskin 与 SOT 给的是心率而不是 HRV 序列。把它们当成同一指标直接比,是错的。正确做法是从 RR 序列重算指标,或明确写出各设备 HRV 的定义。
研究低采样率心电的 R 峰位置校正。 这是本库最独家的用法:NeXus 从 x004 起以 8000 Hz 采样,可以给 256 Hz 通道当 R 峰基准。但如前所述,8000 Hz 只在 raw_data 里,需要自己把原始 EDF 与处理后 .dat 对齐。官方明确给了这句话:“NeXus-10 MKII ECG sensor sampled at 8000 Hz can serve as the ground truth for R peak annotations.”
研究呼吸与光电容积、心电、加速度的相互作用。 Hexoskin 主动测呼吸(胸腹两路加呼吸率与潮气量),SOT 有光电容积,四路心电可用。可以做"从光电容积或心电间接估呼吸"的方法学验证,用 Hexoskin 作参考。注意 heart_rate_quality 与 breathing_rate_quality 两个质量通道要先看。
4.3 案例:一条记录里能看到什么
以 x004 为例走一遍,可以看清数据到底长什么样。
| 观察项 | 值 | 说明 |
|---|---|---|
| 记录名 | x004 | 第 4 号受试者 |
| 信号条数 | 46 | 五台设备合并后的总通道数 |
| 统一采样率 | 256 Hz | 处理后的目标采样率 |
| 采样点数 | 468928 | 约 1831.75 秒 |
| 前四路 | SOT / FAROS / NEXUS / HEXOSKIN 的滤波心电 | 已归一,单位字段为空 |
| 第五路 | POLAR/RR_filtered |
Polar 的 RR 指示函数 |
| 心电原始通道 | SOT/EKG、FAROS/ECG、NEXUS/Sensor-B:EKG、HEXOSKIN/ECG_I |
单位微伏,可从这里取物理量 |
| 相位标记 | .aux 内 5 条注释 |
如 FAROS_Marker/Rest、Manual/Walking |
| 加速度 | FAROS 三轴、HEXOSKIN 三轴、SOT Aktivitt |
三套独立测量 |
| 呼吸 | HEXOSKIN 胸腹两路加呼吸率、潮气量、分钟通气量 | 主动测量,可作参考真值 |
一条记录里同时装着四路心电、一路间期序列、三套加速度、一路主动呼吸、光电容积、血氧、体温、体位与踏板频率,全部对齐在同一时间轴上。这就是它的全部吸引力——不是某一条通道多好,而是这些通道凑在一块,且每一条都能追溯到具体是哪台设备。
4.4 标注的粒度:R 峰清楚,其余靠推
ANNOTATORS 文件只有两行,把标注的角色定义得很干净:
| 扩展名 | 官方定义 | 内容 |
|---|---|---|
atr |
manually revised consensus beat annotations | 人工修订的一致性心搏标注,共 42413 条 |
aux |
faros markers and manually revised markers for the start of each experimental phase | Faros 按钮标记与人工修订的相位起点 |
也就是说,库里只有两类人工标注:R 峰位置,和四个相位的起点。没有心搏类型标注,没有节律标注,没有噪声段标注,没有逐通道质量标注(设备自带的质量通道除外)。
想要"运动段的噪声强度"这类标签,得自己从加速度通道或信号本身构造;想要"这一段是不是上坡",可以直接从 .aux 拿;想要"这次心搏是不是异常",这个库给不了——受试者全是健康人。
标注总量 42413 条,单条记录 2377 到 4256 条。这是官方直接给出的规模数字,也是这个库唯一可以放心引用的标注类统计量。
4.5 边界条件:什么情况下它不再适用
一旦离开跑步机就失效。 所有结论的外推范围止于实验室跑步机上的健康成年人。
一旦要求绝对精度就失效。 处理后数据经过非线性重采样与滤波,前四路心电已 z 分数归一。涉及绝对幅度与精确时间间隔的问题必须回原始数据。
一旦要求病理多样性就失效。 13 名健康受试者,没有一例病理事件。
一旦要求大样本就失效。 42413 条心搏听起来不少,但来自 13 个人,个体间方差远大于设备间方差的风险很高。任何统计推断都必须以受试者为随机效应单位,而不是以心搏为单位。
§5 怎么拿到
5.1 目录结构
simultaneous-measurements/1.0.2/
├── ANNOTATORS 136 B 2020-04-21 #-- 两个注释文件的角色定义
├── LICENSE.txt 14.5 KB 2023-01-18 #-- CC BY 4.0 全文
├── README.md 1.9 KB 2020-04-09 #-- 实验与设备速览
├── RECORDS 1.7 KB 2020-04-22 #-- 13 条处理后记录 + 65 个原始文件
├── SHA256SUMS.txt 10.5 KB 2023-01-18 #-- 全量校验和
├── sensor_placement.png 75.6 KB 2020-04-14 #-- 传感器佩戴位置示意图
├── raw_data/ #-- 65 个文件:13 人 × 5 设备
│ ├── x001_FAROS.edf / x001_HX.edf / x001_NEXUS.edf / x001_SOT.edf
│ ├── x001_POLAR.hrm
│ └── ... 直至 x013
└── generated_data/ #-- 52 个文件:13 人 × 4 类
├── x001.dat (50.5 MB) / x001.hea (3.1 KB)
├── x001.atr (7.7 KB) / x001.aux (174 B)
└── ... 直至 x013
RECORDS 同时列出两类记录:13 条 generated_data/x001 形式的处理后记录,和 65 个 raw_data/x001_FAROS.edf 形式的原始文件。用 wfdb 批量遍历时要注意它是混合清单,不能假定每一行都是一个 WFDB 记录。
根目录的 sensor_placement.png 是传感器佩戴位置示意图,做多设备电极布置复现时值得先看一眼。
5.2 批量下载
官方给出四条下载路径。全量未压缩 1.7 GB,ZIP 压缩包 771.4 MB。
#-- 方式一:PhysioNet Python 包(推荐,可只取子目录)
physionet download simultaneous-measurements --version 1.0.2
#-- 方式二:wget 递归
wget -r -N -c -np https://physionet.org/files/simultaneous-measurements/1.0.2/
#-- 方式三:AWS 命令行(免签名,适合云端直取)
aws s3 sync --no-sign-request s3://physionet-open/simultaneous-measurements/1.0.2/ DESTINATION
#-- 方式四:只取处理后数据,用 -I 限定扩展名,体积可降一个量级
wget -r -N -c -np -A "*.hea,*.atr,*.aux" \
https://physionet.org/files/simultaneous-measurements/1.0.2/generated_data/
第四种方式值得强调:.hea 3.1 KB、.atr 4.7 到 8.3 KB、.aux 168 到 276 B,13 人加起来远小于 1 MB。做相位分析或标注统计时完全不需要下 .dat。
5.3 流式读取与只取片段
.dat 单文件 39.3 到 53.4 MB,本地跑实验可以直接全读;远程跑则应按区间读。
import wfdb
import numpy as np
base = 'simultaneous-measurements/1.0.2/generated_data'
#-- 先读头文件,不下载信号本体
hdr = wfdb.rdheader('x004', pn_dir=base)
name_to_idx = {n: i for i, n in enumerate(hdr.sig_name)}
print(hdr.fs, hdr.sig_len, len(hdr.sig_name))
#-- 只取第 300 到 360 秒,四路原始心电(非滤波通道)
want = ['SOT/EKG', 'FAROS/ECG', 'NEXUS/Sensor-B:EKG', 'HEXOSKIN/ECG_I']
cols = [name_to_idx[n] for n in want]
lo, hi = 300 * hdr.fs, 360 * hdr.fs
rec = wfdb.rdrecord('x004', pn_dir=base, channels=cols,
sampfrom=lo, sampto=hi, physical=True)
print(rec.p_signal.shape, rec.units) #-- 单位应为微伏
physical=True 让 wfdb 按增益与基线换算出物理量。若省略,拿到的是 16 位整数,各通道量纲不可比。
5.4 转成通用表结构
合并记录是 46 列宽表,转成长表或直接转 DataFrame 都可以,但要保留设备前缀。
import wfdb
import pandas as pd
base = 'simultaneous-measurements/1.0.2/generated_data'
rec = wfdb.rdrecord('x004', pn_dir=base, physical=True)
df = pd.DataFrame(rec.p_signal, columns=rec.sig_name)
df.insert(0, 't_sec', np.arange(rec.sig_len) / rec.fs)
#-- 按设备前缀分组,便于批量处理
dev = pd.Series(rec.sig_name, name='signal').str.split('/').str[0].rename('device')
print(pd.concat([dev, pd.Series(rec.units, name='unit')], axis=1).to_string())
#-- 只落盘需要的列,46 列全写会非常大
df[['t_sec'] + list(df.columns[df.columns.str.startswith('FAROS/')])] \
.to_parquet('x004_faros.parquet', index=False)
转成表是有损操作:头文件里的增益、基线、单位、ADC 零值会被压进列头或丢失。如果后续还要回到原始语义,务必同时保留 .hea。
5.5 相位标记与 R 峰标注的读取
.aux 里同时有设备触发与人工修订两套标记,aux_note 字段给出名字。
import wfdb
base = 'simultaneous-measurements/1.0.2/generated_data'
rec = wfdb.rdrecord('x004', pn_dir=base)
ann = wfdb.rdann('x004', 'atr', pn_dir=base)
aux = wfdb.rdann('x004', 'aux', pn_dir=base)
#-- 相位起点:优先取 Manual/ 前缀
phases = {}
for t, note in zip(aux.sample, aux.aux_note):
tag = note.split('/')[-1]
if note.startswith('Manual/') or tag not in phases:
phases[tag] = t
print({k: round(v / rec.fs, 2) for k, v in sorted(phases.items(), key=lambda x: x[1])})
#-- R 峰:ann.sample 为采样点,符号为心搏类型
print(ann.ann_len, ann.sample[:5], ann.symbol[:5])
.atr 的 ann_len 就是这条记录的心搏标注条数,13 条加起来是官方给出的 42413 条。注意标注建在 256 Hz 的对齐信号上,因此其时间分辨率上限就是 256 Hz 的采样间隔,用来评估亚采样级精度会碰到天花板。
5.6 五个最容易出错的地方
| 坑 | 现象 | 正确处理 |
|---|---|---|
| 把滤波心电当物理量 | 前四路信号单位字段为空,数值在正负几之间 | 要物理量就取 SOT/EKG、FAROS/ECG 等原始通道,单位为微伏 |
| 直接比各设备 HRV | Faros 单位是毫秒,NeXus 是微伏,含义不同 | 从 RR 序列重算,或明确写出各设备定义 |
以为 8000 Hz 在 .dat 里 |
处理后统一 256 Hz | 回 raw_data/x004_NEXUS.edf 及之后的 NeXus 文件 |
| 按通道名找心电 | x001 到 x003 的 NeXus 通道名叫 Sensor-B:EEG |
检索时同时匹配 EKG 与 EEG |
| 把 13 人当 42413 个独立样本 | 心搏间高度相关 | 统计推断以受试者为随机效应单位 |
§6 与库内条目的关系
6.1 关系图谱
| 相关数据集 | 关系 | 分工判据 |
|---|---|---|
| ppg-dalia | 同为运动条件下的可穿戴光电容积,有加速度参考 | 要自由生活场景与更长时间,用 ppg-dalia;要多设备互比,用本库 |
| mit-bih-arrhythmia | 心搏标注的标准基准 | 要心搏类型与病理多样性,用 MIT-BIH;要设备一致性,用本库 |
| wearable-exam-stress | 同样关注可穿戴与心理应激 | 要应激场景的分析口径,看该库;要物理层对齐,用本库 |
| consumer-grade-wearables | 同为消费级可穿戴评测 | 要消费设备之间的横向对比,看该库 |
| accelerometry-walk-climb-drive | 同有三轴加速度与脚本化动作 | 要动作识别,看该库;要用加速度解释生理信号伪迹,用本库 |
| wearable-device-dataset | 同为多设备可穿戴数据 | 先看其设备构成与本库是否互补 |
| ecg-capable-smartwatches | 同为主题为心电可穿戴设备 | 要设备侧的心电能力评测,看该库 |
| pulse-transit-time-ppg | 同为光电容积派生指标 | 要脉搏波传导时间,看该库 |
| treadmill-exercise-cardioresp | 同为跑步机上的心肺数据 | 要运动生理的剂量反应关系,看该库 |
| neuro-stress-resilience-hci | 同为人因与应激的生理测量 | 要认知负荷与神经层面指标,看该库 |
6.2 检索路径
从"我想知道某台设备准不准"出发,路径是:先确认你要的是设备间一致性还是设备对真值的偏差。前者只有本库能答(多设备同步);后者需要带金标准的库。
从"我要训练一个心搏检测器"出发,路径是:本库能提供给你的只有 42413 条 R 峰位置与四路同步心电,作为小规模方法验证可以,作为训练集不够。去 MIT-BIH 心律失常库取数据与类型标签,再回本库做噪声条件下的外测。
从"我要做呼吸率估计"出发,路径是:本库有 Hexoskin 主动呼吸作参考,四段负荷提供了从静立到上坡的呼吸变化,是一个干净的方法学验证集。
6.3 与其它库的分工判据
| 判据 | 选本库 | 选其它 |
|---|---|---|
| 需要多设备同一时刻 | 是 | 否 |
| 需要病理事件 | 否 | 是 |
| 需要长时程自由生活 | 否 | 是 |
| 需要人工 R 峰真值 | 是(42413 条) | 视库而定 |
| 需要心搏类型标注 | 否 | 是 |
| 需要高采样率心电 | 是(原始 8000 Hz) | 多数库为 250 到 500 Hz |
| 需要加速度解释伪迹 | 是(三套独立三轴) | 部分库有单套 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评价这个库不能用"数据量"这把尺子。13 人、427.80 分钟、42413 条标注,在任何以规模论英雄的排行榜上都会被判为小库。但它的设计目标从来不是规模,而是可归因性。用规模标准评价它,等于用载重评价一把游标卡尺。
7.1 五维评分
| 维度 | 评价 | 依据 |
|---|---|---|
| 时间对齐质量 | 强 | 有专门方法论文支撑,非线性重采样到统一 256 Hz |
| 标注可靠性 | 强 | R 峰为人工逐条审阅,且不偏向任一设备 |
| 场景控制 | 强 | 同一跑步机、同一顺序、四段固定参数 |
| 规模 | 弱 | 13 人、四段五分钟 |
| 人群多样性 | 弱 | 全部健康成年人,单一国家、单一实验室 |
五维里两强一强两弱,结论很清楚:方法学验证用它是合适的,统计推断与泛化研究用它是不合适的。
7.2 标注质量的两层
第一层:R 峰位置。 这是人工逐条审阅对齐后全部心电视图生成的,官方措辞是"manually screening the aligned ECG in its entirety",即完整通览而非抽样。可信度最高的一层。但它建在 256 Hz 的对齐信号上,所以位置精度受 256 Hz 采样间隔限制,不能用来评估亚采样级算法。
第二层:相位起点。 来自 Faros 按钮触发,经人工结合运动传感器与心率上升沿重新定位。两套标记并存,人工修订版更可靠,但修订的判据(运动传感器加心率上升沿)本身是间接的,不是视频或事件日志。
没有第三层。库里不存在心搏类型、节律、噪声段或逐通道质量的标注。设备自带的 heart_rate_quality、breathing_rate_quality 是设备固件输出的质量位,不是人工标注。
7.3 已知的、可枚举的偏差
设备层级偏差。 四路心电不是同一物理测量:Hexoskin 走纺织电极,其余走 Ag/AgCl;Polar 根本不是心电波形而是 RR 间期。把它们当成四台等价的心电仪来比,方法上就是错的。
预处理偏差。 前四路心电经过裁剪滑动平均滤波与 z 分数归一,抹掉了绝对幅度信息。任何依赖幅度的方法(如基于幅值的质量检测)都不能直接用这四路。
采样率偏差。 8000 Hz 只覆盖 x004 到 x013 的 NeXus。x001 到 x003 是 256 Hz,且通道名错标为 Sensor-B:EEG。前三条与后十条在 NeXus 这一路上不是同一种数据。
长度偏差。 处理后单条 29.18 到 39.62 分钟不等,来源长度不同(原始总长 2577.68 分钟,处理后 427.80 分钟)。做跨受试者对比时要注意每段相位的绝对时长是否一致。
版本偏差。 1.0.0 到 1.0.1 之间修正了 Hexoskin 通道的量纲(例如 heart_rate 改为 bpm),所有 .dat 与 .hea 都随之更新。引用 1.0.0 的旧结果可能与 1.0.2 的数值不可直接比较。
7.4 外部验证矩阵
| 用途 | 本库能否承担 | 说明 |
|---|---|---|
| 心搏检测算法的噪声鲁棒性测试 | 能 | 四段负荷加人工 R 峰真值 |
| 设备间 RR 一致性评估 | 能 | 这是原始论文的用法 |
| 低采样率 R 峰校正方法验证 | 能 | 需回原始 8000 Hz 通道 |
| 呼吸率间接估计验证 | 能 | Hexoskin 主动呼吸作参考 |
| 心律失常分类训练 | 不能 | 无病理事件 |
| 人群层面的心率参考值 | 不能 | 13 人,非概率样本 |
| 产品性能排名 | 不能 | 样本量与场景都不支持 |
7.5 它为何能持续:稀缺的不是数据量,是那个组合
多设备同步这件事,做一次的成本远高于做五次单设备采集。要同时协调五套设备、找齐佩戴位置、保证互不干扰、事后还要做跨时钟对齐与非线性重采样,工程量按设备数超线性增长。而产出只有 13 个人。这笔账在任何以数据量为考核指标的项目里都算不过来。
所以这类数据的稀缺是结构性的,不是偶然的。它只在"有人真的需要回答设备间一致性问题"时才会被造出来——本库的造库动因是评估若干心电测量设备的功能、精度与可用性,这个动机决定了它的形态。也因此,短期内很难见到第二个同等设计的库。
§8 生态位与历史
8.1 版本沿革
| 版本 | 日期 | 改动 |
|---|---|---|
| 1.0.0 | 2020-06-16 | 首次发布,含 raw_data 与 generated_data |
| 1.0.1 | 2022-07-20 | 修正 Hexoskin 通道量纲(如 heart_rate 改为 bpm),更新全部 .dat 与 .hea;补充伦理声明 |
| 1.0.2 | 2023-01-18 | 补充并引用原始论文 |
1.0.1 的量纲修正值得单独记一笔:它意味着 1.0.0 时代基于 Hexoskin 通道数值得到的结论,在新版本上不能复现。写论文时务必注明版本号。
8.2 与挑战赛的关系
这个库不是挑战赛数据,也没有被改造成挑战赛任务。它的两个技术构件——2019 年的对齐方法、2022 年的形态学噪声信号比与 Smith-Waterman RR 比对——都是方法学论文,而不是竞赛基准。这决定了它的生态位偏方法验证而非竞技。
8.3 生态位:方法学的对照台
PhysioNet 上的生理信号库大致分三类:临床诊断库(给疾病标签,做预测建模)、挑战赛库(给任务与排行榜)、方法学资源库(给一个可复现的物理设定,验证方法)。本库属于第三类里的一个细分——多设备一致性方法学。
它在这个生态位上几乎没有替代。想做设备比对的人要么自己造数据(成本极高),要么用本库。
8.4 谁在用它,用来做什么
官方页面显示引用该项目的出版物为 29 篇。从引用主题看,覆盖可穿戴心电监测综述、心率变异性与心脏代谢疾病、资源受限设备上的应激监测、生物测量衣的指标级性能检验等方向。这些引用共同的特点是:把本库当作"多设备同步"这一物理设定的现成证据,而不是当作一个大规模训练语料。
项目浏览量(官方页面显示):当前版本 375 次,全部版本 498 次。这是一个典型的"小众但被反复回来取用"的访问曲线,符合方法学资源的特征。
§9 使用指引
9.1 三种角色的路径
| 角色 | 你该看什么 | 你该做什么 |
|---|---|---|
| 可穿戴算法工程师 | §2.4 信号字典、§5.3 流式读取、§5.5 相位标记 | 按相位切段评估,用加速度作协变量,逐设备报告误差 |
| 生理信号方法研究者 | §2.1 两层抽象、§4.2 官方四种用法、§5.2 只下小文件 | 先只用 .hea 与 .atr 验证思路,再决定是否下 .dat |
| 人因与工效学研究者 | §2.3 四相位设计、§3.3 采集场景 | 用第二与第三相位分离运动负荷与认知负荷 |
9.2 一条最短的可用流程
import wfdb
import numpy as np
base = 'simultaneous-measurements/1.0.2/generated_data'
sid = 'x004'
#-- 第 1 步:只下头文件与标注,先确认结构
hdr = wfdb.rdheader(sid, pn_dir=base)
ann = wfdb.rdann(sid, 'atr', pn_dir=base)
aux = wfdb.rdann(sid, 'aux', pn_dir=base)
#-- 第 2 步:拿到相位边界与设备通道索引
idx = {n: i for i, n in enumerate(hdr.sig_name)}
ecg = [idx[n] for n in ['SOT/EKG', 'FAROS/ECG',
'NEXUS/Sensor-B:EKG', 'HEXOSKIN/ECG_I'] if n in idx]
#-- 第 3 步:只在相位内取数,避免把佩戴期与静立前期算进来
starts = sorted({int(t) for t, note in zip(aux.sample, aux.aux_note)
if note.startswith('Manual/')})
lo, hi = starts[0], starts[0] + 300 * hdr.fs
#-- 第 4 步:读物理量,按通道名分组,别混用滤波与原始
rec = wfdb.rdrecord(sid, pn_dir=base, channels=ecg,
sampfrom=lo, sampto=hi, physical=True)
rr = np.diff(ann.sample[(ann.sample >= lo) & (ann.sample < hi)]) / hdr.fs * 1000.0
print(rec.sig_name, rec.units, rr.size)
这条流程的四个要点:先读头文件不下信号;相位边界优先取 Manual/;只在相位区间内取数;读物理量而不是整数。做到这四点,基本不会踩到 §5.6 里那五个坑。
9.3 引用方式
| 引用对象 | 写法 |
|---|---|
| 数据集 | Vollmer, M., Bläsing, D., Reiser, J. E., Nisser, M., & Buder, A. (2023). Simultaneous physiological measurements with five devices at different cognitive and physical loads (version 1.0.2). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/wce5-fj54 |
| 原始论文 | Bläsing, D., Buder, A., Reiser, J. E., Nisser, M., Derlien, S., & Vollmer, M. (2022). ECG performance in simultaneous recordings of five wearable devices using a new morphological noise-to-signal index and Smith-Waterman-based RR interval comparisons. PLoS ONE, 17(10), e0274994. |
| 方法论文 | Vollmer, M., Bläsing, D., & Kaderali, L. (2019). Alignment of multi-sensored data: Adjustment of sampling frequencies and time shifts. In 2019 Computing in Cardiology (CinC). IEEE. |
| 平台 | PhysioNet 平台综述论文,按官方页面 Cite 按钮生成 |
| 许可 | CC BY 4.0,署名即可,含商业使用 |
写论文时建议同时注明:使用的版本号、使用的是 raw_data 还是 generated_data、是否用到滤波心电通道、以及相位边界取的是设备标记还是人工修订标记。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方页面与文件目录 |
| 文件核验 | RECORDS、ANNOTATORS、x001.hea、x004.hea、x004.aux、generated_data 与 raw_data 目录清单经直接访问确认 |
| 不一致说明 | 官方正文描述第四相位为上坡步行,.aux 标记写作 Running;NeXus 通道名在 x001–x003 为 Sensor-B:EEG 而非 EKG,两处已在正文注明 |
| 论文信息 | 仅依据官方页面给出的题名、期刊、DOI 与卷期,未读全文 |
| 未核验内容 | 受试者具体年龄与体质参数、各原始 EDF 内通道的逐通道采样率清单、29 篇引用文献的具体结论、各相位内逐设备误差的量化结果 |
| 图像 | 无配图;封面为生成式提示词,不含真实生理波形 |
| 免责 | 本文不构成临床建议;数据使用须遵守 CC BY 4.0 署名要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是五台心电仪同时测」 | 四路心电波形加一路 Polar RR 间期序列 | 官方说明 Polar 用胸带识别心搏输出 RR 间期 |
| 「处理后数据是 8000 Hz」 | 处理后统一 256 Hz,8000 Hz 只在原始 EDF | 头文件首行 x004 46 256 468928 |
| 「8000 Hz 覆盖全部 13 人」 | 仅 x004 到 x013 的 NeXus,x001 到 x003 为 256 Hz | 官方 Notice 段 |
| 「五路心电可以直接比幅度」 | 前四路已 z 分数归一,单位字段为空 | x004.hea 前四路单位字段为空 |
| 「各设备 HRV 是同一个指标」 | Faros 单位是毫秒,NeXus 是微伏 | x004.hea 的 FAROS/HRV 与 NEXUS/[B] HRV Amp. 两行 |
| 「它有心搏类型标注」 | 只有 R 峰位置与相位起点两类人工标注 | ANNOTATORS 仅两行定义 |
| 「它可以训练心律失常分类器」 | 全部健康受试者,无病理事件 | 官方摘要写明 healthy subjects |
| 「1.0.0 与 1.0.2 数值可直接比」 | 1.0.1 修正了 Hexoskin 通道量纲 | 官方 Release Notes |
| 「按心搏数做统计推断没问题」 | 42413 条来自 13 人,个体差异远大于设备差异 | 受试者数与标注数之比 |
| 「它是自由生活场景数据」 | 全程实验室跑步机,四段脚本化负荷 | 官方 Methods 段 |
| 「NeXus 通道名都是 EKG」 | x001 到 x003 名为 Sensor-B:EEG |
官方 Notice 段与 x001.hea |
FAQ
Q1:这个库到底"同步"在哪里?别的库不也是多设备吗?
差别在是否同一时刻。多数多设备资源是分批或分段采集,两次测量之间受试者的生理状态已经改变,观测到的差异无法归因。本库让五台设备在同一时刻测同一个人,差异因此只剩下设备本身与测量原理两类来源。实现上它做了三件事:传感器布置上让五套设备互不干扰,时间上用心搏模式匹配建立共同时间轴,采样上把 1 Hz 到 8000 Hz 的各通道非线性重采样到统一的 256 Hz。这三步的方法细节写在 2019 年的 Computing in Cardiology 论文里。
Q2:8000 Hz 的 NeXus 通道该怎么用?
它只在 raw_data 里存在,而且只覆盖 x004 到 x013。处理后的 .dat 已经统一重采样到 256 Hz,8000 Hz 的细节在那里已经丢失。想做低采样率 R 峰位置校正,正确做法是从 raw_data/x004_NEXUS.edf 这样的原始文件里取 8000 Hz 心电,与 generated_data 的 256 Hz 通道对齐,把前者当基准、后者当待校正对象。另外注意 x001 到 x003 的 NeXus 是 256 Hz,且通道名错标为 Sensor-B:EEG,检索时要两个名字都匹配。
Q3:为什么前四路心电的单位字段是空的?
因为它们是预处理通道。官方说明前四路经过了裁剪滑动平均滤波与 z 分数归一化,已经不是物理量,而是无量纲的归一波形,所以头文件里单位字段为空、增益值也明显偏大。如果你的方法依赖绝对幅度——比如基于振幅的信号质量检测、跨设备的幅度一致性比较——就不能用这四路,应该取各自的原始通道:SOT/EKG、FAROS/ECG、NEXUS/Sensor-B:EKG、HEXOSKIN/ECG_I,它们的单位字段写着微伏。
Q4:13 个人、42413 条标注,够不够做统计推断?
够做方法验证,不够做人群推断。标注条数听起来不少,但它们来自 13 名受试者,同一个人的心搏之间高度相关,把它们当成 42413 个独立样本会把置信区间算得虚窄。正确的做法是以受试者为随机效应单位,用混合效应模型或按受试者做交叉验证。同样道理,任何"某设备更准"的结论在这个样本量上都是过度解读——官方原始论文给出的也是方法学框架,而不是产品排名。
Q5:四个实验相位的边界从哪里拿,会不会不准?
从 .aux 文件拿,它同时保存了 Faros 触发按钮的原始标记和人工修订后的标记,形如 FAROS_Marker/Rest 与 Manual/Walking,两者并存时以 Manual/ 前缀的为准。人工修订的判据是结合运动传感器与心率上升沿重新定位,属于间接判据,不是视频或事件日志。另外官方正文把第四相位描述为上坡步行,而标记里写作 Running,检索时两个名字都要认。想避开这些麻烦,可以把相位边界当作软边界,在边界两侧各留一段缓冲再取数。
术语表
| 术语 | 解释 |
|---|---|
| EDF / EDF+C | 欧洲数据格式及其带注释变体,生理信号的通用存储格式 |
| WFDB | PhysioNet 使用的波形数据库格式,含头文件、信号、注释三类文件 |
.hea |
纯文本头文件,声明采样率、信号条数、增益、基线、单位与信号名 |
.dat |
二进制信号文件,多路信号按采样点交错存放 |
.atr |
二进制注释文件,本库存人工 R 峰标注 |
.aux |
辅助注释文件,本库存实验相位起点标记 |
.hrm |
Polar 设备私有的心率监测文件格式,本库存 RR 间期 |
| R 峰 | 心电 QRS 波群的顶点,心搏检测与 RR 间期计算的基准点 |
| RR 间期 | 相邻两次心搏 R 峰之间的时间间隔,心率与 HRV 的计算基础 |
| HRV | 心率变异性,RR 间期序列的变异程度,不同设备的定义口径不同 |
| 光电容积描记(PPG) | 用光测量组织血容积变化的无创方法,腕式心率测量的原理 |
| 三轴加速度 | 三个正交方向上的加速度测量,用于刻画运动与伪迹 |
| 纺织电极 | 编织在衣物里的电极,与一次性 Ag/AgCl 凝胶电极的接触特性不同 |
| Ag/AgCl 电极 | 氯化银电极,临床心电测量的标准一次性电极 |
| 2-back 任务 | 工作记忆范式,要求判断当前刺激与倒数第 n 个刺激是否相同 |
| 非线性重采样 | 当实际采样率不均匀或不稳定时,按时间轴重新插值到目标采样率 |
| z 分数归一化 | 减均值除以标准差,结果无量纲,抹掉绝对幅度 |
| 指示函数 | 把离散事件序列转成随时间取 0 或 1 的信号,便于与其它通道对齐 |
| Smith-Waterman | 局部序列比对算法,原始论文用它比较 RR 间期序列 |
| CC BY 4.0 | 知识共享署名许可,允许商用,条件仅为署名 |
| PhysioNet | 由 MIT 计算生理学实验室维护的生物医学信号数据平台 |
附录 A:核心数字核对表
| 项 | 值 | 来源 |
|---|---|---|
| 受试者数 | 13 | 官方页面摘要与方法段 |
| 性别构成 | 7 女 6 男 | 官方页面方法段 |
| 设备数 | 5 | 官方页面摘要与背景段 |
| 实验相位 | 4 段各 5 分钟 | 官方页面摘要与方法段 |
| 跑步机速度 | 1.2 m/s | 官方页面方法段 |
| 上坡坡度 | 15% | 官方页面方法段 |
| 原始采样率区间 | 1 Hz 到 8000 Hz | 官方页面摘要 |
| NeXus 高采样率覆盖范围 | x004 到 x013,8000 Hz | 官方页面 Data Description 的 Notice |
| 处理后信号条数 | 46 | x001.hea 与 x004.hea 首行 |
| 处理后采样率 | 256 Hz | x001.hea 与 x004.hea 首行 |
| x004 采样点数 | 468928 | x004.hea 首行 |
| x001 采样点数 | 575104 | x001.hea 首行 |
| 处理后总时长 | 427.80 分钟 | 官方页面 Data Description |
| 处理后单条时长 | 29.18 到 39.62 分钟 | 官方页面 Data Description |
| 原始总时长 | 2577.68 分钟 | 官方页面 Data Description |
| 原始各设备总时长 | Faros 564.58’ / Hexoskin 526.60’ / NeXus 429.84’ / SOT 557.17’ / Polar 499.49’ | 官方页面记录长度表 |
| 心搏标注总数 | 42413 | 官方页面 Data Description |
| 单条标注数 | 2377 到 4256 | 官方页面 Data Description |
| 文件总数 | 原始 65 个、处理后 52 个 | RECORDS 清单 |
| 未压缩体积 | 1.7 GB | 官方页面文件区 |
| ZIP 体积 | 771.4 MB | 官方页面文件区 |
| 伦理批准号 | BB 171/17 | 官方页面伦理段与 README.md |
| 版本日期 | 1.0.0 / 2020-06-16,1.0.1 / 2022-07-20,1.0.2 / 2023-01-18 | 官方页面版本列表 |
| DOI(v1.0.2) | 10.13026/wce5-fj54 | 官方页面 Discovery 区 |
| 许可 | CC BY 4.0 | 官方页面 Access 区与 LICENSE.txt |
附录 B:数字的来源分层
第一层:官方页面与官方文件。 受试者数、性别构成、设备清单、四相位设计、速度坡度、采样率区间、处理后总时长与单条时长、标注总数与单条范围、原始各设备记录长度、体量、许可、版本日期与 DOI。这些数字直接来自项目主页的摘要、方法、数据描述与文件区,以及 RECORDS、ANNOTATORS 两个清单文件。
第二层:直接访问文件得到的结构数字。 处理后信号的条数 46、统一采样率 256 Hz、x001 与 x004 的采样点数、前四路心电的单位字段为空、各通道的增益与单位、.aux 里的注释条数与名字、各文件的字节数与修改日期。这些来自 x001.hea、x004.hea、x004.aux 与两个目录的文件列表,属于结构而非统计。
第三层:论文题录。 原始论文与方法论文只取题名、期刊、卷期与 DOI,未读全文,因此正文里凡涉及两篇论文结论的地方都一律写成"它提供了什么方法"而不写"它得出了什么结果"。
第四层:未核实。 受试者的具体年龄与体质参数、各原始 EDF 内逐通道的采样率清单、各相位内逐设备的误差幅度、29 篇引用文献的具体结论。这些需要下载全量或通读全文才能得到,本文按要求只写规模、结构、边界三类数字。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | Simultaneous physiological measurements with five devices at different cognitive and physical loads v1.0.2 | https://physionet.org/content/simultaneous-measurements/1.0.2/ | 全部规模、结构、边界数字的来源 |
| 2 | 该库的 PhysioNet 文件目录 | https://physionet.org/files/simultaneous-measurements/1.0.2/ | RECORDS、ANNOTATORS、头文件、目录清单 |
| 3 | Bläsing 等人(2022),PLoS ONE 17(10) e0274994 | https://doi.org/10.1371/journal.pone.0274994 | 原始论文,形态学噪声信号比与 Smith-Waterman 比对 |
| 4 | Vollmer、Bläsing、Kaderali(2019),Computing in Cardiology | https://doi.org/10.22489/cinc.2019.031 | 对齐与采样率调整方法 |
| 5 | PhysioNet 平台综述(Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | MIT-BIH 心律失常库(对照) | https://physionet.org/content/mitdb/ | §2.6 与 §6.1 的对比 |
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本数据集共享多个主题标签的相关数据集,按相关度降序排列:
- ppg-dalia — 共享标签:生理信号 / 可穿戴设备 / 多模态时序 / 运动与认知负荷
- mit-bih-arrhythmia — 共享标签:生理信号 / 心电信号
- wearable-exam-stress — 共享标签:生理信号 / 可穿戴设备 / 运动与认知负荷
- consumer-grade-wearables — 共享标签:可穿戴设备 / 多模态时序
- accelerometry-walk-climb-drive — 共享标签:可穿戴设备 / 运动与认知负荷
- wearable-device-dataset — 共享标签:可穿戴设备 / 多模态时序
- ecg-capable-smartwatches — 共享标签:心电信号 / 可穿戴设备
- pulse-transit-time-ppg — 共享标签:生理信号 / 多模态时序
- treadmill-exercise-cardioresp — 共享标签:生理信号 / 运动与认知负荷
- neuro-stress-resilience-hci — 共享标签:运动与认知负荷 / 多模态时序
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

