运动伪迹里的四路心电 — MACECGDB 单人心电库

1 人 27 条 / 4 路电极 500 Hz / 全部 1.0 MB

来源 https://physionet.org/content/macecgdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
运动伪迹里的四路心电 — MACECGDB 单人心电库

信息速览

数据集名称运动伪迹里的四路心电 — MACECGDB 单人心电库
数据类型时序信号,波形,原始数据链接,元数据
规模1 名受试者 / 27 条记录
接入方式https://physionet.org/content/macecgdb/1.0.0/
AI 就绪度

MACECGDB 是 PhysioNet 上一份小而具体的公开资源:一名 25 岁健康男性,身上贴一块内建四对电极的贴片,分别在站立、行走、单次跳跃三种状态下录下心电图,总共二十七条短记录。它的全名 Motion Artifact Contaminated ECG Database 已经把用途写在标题里——研究运动伪迹如何污染心电,以及被污染后的心电在什么基底下依然稀疏。

这份库的体量在所有公开心电库里属于最小的那一档,整包未压缩不足一兆字节,用一条命令就能下载完。它不提供诊断标签,不提供多受试者对照,也不提供标准导联体系。它提供的是一件事:同一块贴片在三个朝向上、三种运动中,给出四条彼此平行的信号,让人能把伪迹与信号分开看。

名字里的 MAC 常被误读成机构缩写或设备型号,实际是 Motion Artifact Contaminated 的缩写,「多导联」的猜测与它对不上——四条信号来自同一块贴片上四对呈四十五度间隔排布的电极,不是标准十二导联里的四个导联。一屏速览见下表。

维度 内容
官方全名 Motion Artifact Contaminated ECG Database
中文名 运动伪迹污染心电图数据库
缩写拆解 MAC = Motion Artifact Contaminated,不是机构或设备代号
托管平台 PhysioNet,Open Access 栏目
版本 1.0.0,2015 年 12 月 18 日发布
DOI 10.13026/C2JP4G
受试者 1 名 25 岁健康男性
记录数 27 条,test01 至 test27
每条通道数 4 路,头文件中记为 ECG 1 至 ECG 4
采样率 500 Hz
分辨率 16 位
单条时长 8 秒,4000 个采样点
前端增益 100(模拟,送 ADC 之前)
活动类型 站立 s、行走 w、单次跳跃 j
贴片朝向 0 度、45 度、90 度
整包大小 未压缩约 1.0 MB
许可 Open Data Commons Attribution License v1.0
注释 仅有头文件内的年龄、性别、诊断、用药四行
引用论文 Behravan 等,IEEE BSN 2015

§1 它要解决的具体麻烦

1.1 穿戴式心电的真正瓶颈不是放大电路,而是人在动

贴片式心电的核心矛盾很朴素:设备要贴身、要长时间佩戴、要让人该走就走、该跳就跳,而电极一旦跟着身体动,接触面就微动,皮肤电位随之漂移,叠加到心电信号上就形成了运动伪迹。伪迹的频率成分与心电本身高度重叠,几十赫兹到十几赫兹都有,简单的带通滤波切不干净——切狠了把 QRS 的锐利边沿一起削掉,切轻了伪迹原样留在那里。

这正是压缩感知这类方法进入穿戴式心电的入口。压缩感知的前提是信号在某个变换基下足够稀疏,采样可以远少于奈奎斯特率,然后从少量测量里重建。心电在某种小波基或差分级基下确实稀疏,但伪迹一来,稀疏度就变了,重建质量随之下降。要让算法知道「稀疏度会随运动改变」,就必须有真实的、带伪迹的、同一设备同一贴片的数据。拿临床静息心电加合成的正弦或高斯噪声去模拟,永远对不上真实伪迹的形态。

MACECGDB 就是在这类需求下产生的。它不追求覆盖人群,只追求把一件事讲清楚:同一块贴片、同一组电极,在静止、行走、跳跃三种动作下,四条信号各自被伪迹改写成了什么样。它是方法学材料,不是统计样本。

1.2 三条常见的错误期待

第一条,期待它是一份多人多导联心电库。 名字里的 ECG 和四条信号很容易让人联想到十二导联体系里抽出的四路,或者某个四人份的小型对照库。实际情况是单人、单贴片、四对差分电极。它没有 V1 到 V6,没有 I、II、III,也没有标准肢体导联的参考零点。

第二条,期待它可以当训练集。 二十七条记录,每条八秒,全部来自一个人。任何深度网络在这上面训练,学到的都不可能是「心电的通用规律」,只会是这名受试者这一次贴片位置下的形态习惯。它能做的是方法验证与消融实验:同一套重建算法在站立、行走、跳跃三组上分别跑一遍,看误差怎么随运动强度变化。

第三条,期待它有伪迹的时间标注。 官方页面没有给出任何逐点或逐段的伪迹区间标注。伪迹是整条记录的一种属性——这条是行走时录的,那条是跳跃时录的——而不是某一段落被单独框出来。想训练一个「伪迹检测器」,得自己定标注口径(§7.2)。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
研究运动伪迹对心电的影响 三种活动、三种朝向、共二十七条真实伪迹记录 够,这是它的主业
压缩感知重建的方法验证 真实穿戴场景下的四路同步信号,体量小可反复迭代 够,是设计初衷
稀疏度随运动变化的分析 同一受试者在三种运动下信号可直接对比 够,控制了人的因素
训练心律失常分类模型 无任何心搏、节律或诊断注释 不够,结构上做不到
评估跨人群泛化 只有一名受试者 不够,无法划分
评估贴片位置对信号的影响 三种朝向、每种多条 够,但只在一个身上
与标准导联做对照 无标准导联、无参考电极说明 不够,需自行推断电极几何
穿戴设备选型的快速预研 整包极小,半天能跑通全流程 够,适合做起点
伪迹检测或分割的监督学习 无伪迹区间标注 不够,得自建标签

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
你在给贴片式心电设备做去噪算法,手头只有静息数据加合成噪声 提供同一贴片在三种运动下的真实伪迹,让评估不再靠编造 先跑基线带通滤波,再跑你的方法,比较三组活动上的残差
你在做压缩感知重建,想验证「稀疏度随运动变化」这个假设 同一受试者、同一贴片、三种运动,人的因素被控制住 用同一组字典与采样率,分别在 s、w、j 三组上算重建误差与稀疏度
你在写论文需要一份可复现的小规模基准 体量小、许可宽松、下载快、有 DOI 固定随机种子与划分,把全部超参与代码一起放出来
你刚接手一个穿戴项目,需要一个半天能跑通的样本 二十七条记录,全部文件加起来约一兆字节 用它搭起读数据、画图、算指标的骨架,再换真实数据
你在教学,需要演示伪迹与心电频率重叠的直观例子 站立、行走、跳跃三组并排,差异肉眼可见 取同朝向的三条记录叠加画图,配 PSD 对比
你想评估贴片旋转对信号的影响 三种朝向各有九条记录 按朝向分组比较四路信号的相对幅度与相位
你已经有一个大库,想加一组真实运动对照 可作为补充实验里的「真实伪迹」对照组 注意标注不存在,只能做无监督或无参考评估

1.5 一句话判断

它是一块试验田而不是一座粮仓:用一名受试者、三种动作、三种朝向,把「运动伪迹怎样改变心电」这件事从抽象假设变成二十七条可以反复读取的波形。

1.6 不适合谁:四条边界

不适合做规模训练。 二十七条八秒记录,加起来不到六分钟的信号。任何带参数的模型都会在一两轮内记住全部样本,训练损失下降不代表学到了任何东西。

不适合做任何临床判断。 受试者是一名自报健康的二十五岁男性,头文件里诊断与用药两栏都写着 none。没有患者,没有病理标签,也没有医生判读。即便某条记录看起来像某种异常,也没有官方标注支撑。

不适合做多导联或标准导联研究。 四路信号来自同一块贴片上四对电极,彼此以四十五度间隔排布。它们之间是差分关系,与胸前 V1 到 V6 或肢体导联没有已知的换算关系。官方页面用 patch_electrodes.jpg 与 patch_location.png 两张图描述几何,但不提供电极坐标与参考点定义。

不适合做跨人群或跨设备的泛化评测。 一个人、一块贴片、一套前端。跨人泛化无从划分,跨设备泛化无从比较。想要这两类结论,得另找多中心数据(§7.4)。

§2 数据构成与规格

2.1 一个扁平目录,文件名承担全部元信息

下载解开后是一个没有子目录的文件夹。所有记录平铺在同一层,文件名本身是唯一的元信息载体。命名规则由三部分组成:test 加两位流水号,加下划线,加两位角度数字,加一个表示活动类型的字母。比如 test14_45w 表示流水号十四、贴片朝向四十五度、活动是行走。

这种把语义压进文件名而不放进字段的做法,在小库里非常常见,优点是简单到不需要任何数据字典就能猜出结构,缺点是任何筛选都必须写字符串解析。官方页面用两句话交代了规则:最后字母之前的两位数表示整块贴片相对身体的偏移角度,最后一个字母表示活动类型。s 是站立(standing),w 是行走(walking),j 是单次跳跃(jump)。

层级 命名 取值 说明
根目录 无子目录 全部平铺 清单、图片、PDF 与记录混放
记录头文件 <name>.hea 27 个 文本,含信号描述与受试者注释
记录数据体 <name>.dat 27 个 二进制,四路 16 位交错存放
清单 RECORDS 1 个 每行一条记录名,无扩展名
校验 SHA256SUMS.txt 1 个 2019 年补充的逐文件校验和
电极图 patch_electrodes.jpg 1 个 四对电极在贴片上的排布
位置图 patch_location.png 1 个 贴片相对身体的三种朝向
贴片说明 electrode_patch.pdf 1 个 贴片构造的图解文档

官方页面的文件列表给出每个 .dat 都是三十一点二千字节,每个 .hea 在二百七十字节上下,两张图片与一份 PDF 加起来不到二百千字节。页面同时给出三种取数方式:整包 ZIP、wget -r 递归抓取、aws s3 sync --no-sign-request 同步公开桶。三条路径指向同一份内容,没有登录门槛。

2.2 字段/记录的完整字典

这个库没有结构化字段表。信息分两处:文件名里的编码,与头文件里的文本行。头文件第一行是记录级描述,随后每个通道一行,最后可能有一行注释。下表把两处的信息合并列出。

信息项 存放在哪 取值或范围 是否每条都有
记录名 文件名 test01 至 test27 加角度与活动后缀 是
通道数 头文件首行第二列 恒为 4 是
采样率 头文件首行第三列 500 Hz 是
采样点数 头文件首行第四列 恒为 4000 是
数据文件名 通道行第一列 与记录同名加 .dat 每通道一行
存储格式 通道行第二列 16,即 16 位整数 每通道一行
增益 通道行第三列 100/mV 每通道一行
ADC 分辨率 通道行第四列 16 每通道一行
ADC 零点 通道行第五列 0 每通道一行
初始值 通道行第六列 各通道不同,为整数 每通道一行
校验和 通道行第七列 各通道不同 每通道一行
块大小 通道行第八列 0 每通道一行
信号名 通道行第九列 ECG 1 至 ECG 4 每通道一行
年龄 注释行 25 是
性别 注释行 M 是
诊断 注释行 (none) 是
用药 注释行 (none) 是
贴片朝向 文件名 00、45、90 是
活动类型 文件名 s、w、j 是
采集日期 无 官方未提供 否
采集设备 无 官方未提供 否
心搏注释 无 无 .atr 文件 否

注意通道行里的初始值与校验和逐通道不同,这是 WFDB 格式的常规字段,记录的是解码起点与数据校验,与人或设备无关。把它们误读成某种受试者编号,是解析时最常见的错。

2.3 一条记录的完整解剖

取 test14_45w 作为解剖对象。名字可以逐段拆开:test14 是第十四条流水记录,45 表示贴片整体相对身体旋转四十五度,w 表示行走。这条记录在完整记录清单里位于行走组的中间位置。

#-- 只看头文件,不解码二进制
curl -s https://physionet.org/files/macecgdb/1.0.0/test14_45w.hea

输出是五行。第一行 test14_45w 4 500 4000 说明记录名、通道数四、采样率五百、采样点数四千。随后四行每行描述一路信号,格式都是数据文件名、存储格式、增益、ADC 分辨率、ADC 零点、初始值、校验和、块大小、信号名。第五行是注释行,用尖括号包住四个字段名:<age>、<sex>、<diagnoses>、<medications>,对应值依次是二十五、M、none、none。

import wfdb
import numpy as np

base = "https://physionet.org/files/macecgdb/1.0.0"
rec = wfdb.rdrecord(f"{base}/test14_45w")
print(rec.record_name, rec.fs, rec.sig_len, rec.n_sig)
print(rec.sig_name)
print(rec.comments)
x = rec.p_signal
print(x.shape, float(np.nanmin(x)), float(np.nanmax(x)))

rdrecord 读进来后,p_signal 的形状是四千行四列,单位已按增益换算成毫伏。四路的峰峰值不同,这是贴片朝向与电极几何共同作用的结果,官方不提供正常范围供对照。头文件末尾的注释行会被收进 comments 列表,一条记录只有一条注释。

import wfdb
import numpy as np

base = "https://physionet.org/files/macecgdb/1.0.0"
rec = wfdb.rdrecord(f"{base}/test14_45w", physical=False)
d = rec.d_signal
print(d.dtype, d.shape)
print("第一路前八个原始整数:", d[:8, 0].tolist())
print("四路均值:", [round(float(v), 1) for v in d.mean(axis=0)])

不开物理换算时看到的是原始整数,除以一百才是毫伏。这一步在多路对比前很关键:如果只比较物理值而忘了各路增益一致,容易误以为某一路幅度天然更大。这个库里四路增益都写着一百,所以物理值比较是安全的。

解剖项 test14_45w 的值 含义
流水号 14 清单中的顺序,不代表时间先后
朝向 45 贴片整体旋转四十五度
活动 w 行走
通道数 4 ECG 1 至 ECG 4
采样率 500 Hz 与全库一致
采样点数 4000 恰为八秒
增益 100/mV 与全库一致
分辨率 16 位 与全库一致
数据体大小 约三十一点二千字节 4 乘 4000 乘 2 字节
注释 年龄 25、M、无诊断、无用药 全库同一人
心搏注释 无 不附 .atr 文件

2.4 三乘三的设计与每条记录的位置

把 27 条记录按活动与朝向交叉,得到的是一张三乘三的格子,每格三条。这种设计让几乎所有比较都能保持一个因素不变:想看活动效应就固定朝向横向比较,想看朝向效应就固定活动纵向比较。

活动 \ 朝向 0 度 45 度 90 度 合计
站立 s test01、test04、test07 test02、test05、test08 test03、test06、test09 9
行走 w test10、test13、test16 test11、test14、test17 test12、test15、test18 9
跳跃 j test19、test22、test25 test20、test23、test26 test21、test24、test27 9
合计 9 9 9 27

流水号并不是严格按格递增的。站立组从一到九连续,行走组从十到十八连续,跳跃组从十九到二十七连续,所以在活动这一维上是有序的;但在朝向这一维上,每三条一组内部的角度顺序是零、四十五、九十,组与组之间重复这个模式。这意味着流水号无法直接读作时间,也无法读作某一种系统排列——官方没有说明录制顺序,也没有给采集时间戳。

每格的重复数只有三。这个数字决定了统计上能做的事:可以做三条记录的中位数或均值对比,可以做定性的形态并排,但不能做任何显著性检验,也不能估计组内方差。当有人问「行走比站立伪迹大多少」时,诚实的回答是「三条对三条,只能看趋势」(§7.3)。

2.5 与同类资源的字段差异

把 MACECGDB 放进公开心电资源的谱系里,它的独特性与短板都很清楚。

资源 受试者 记录数 通道 采样率 标注 定位
MACECGDB 1 27 4 路贴片电极 500 Hz 无 运动伪迹方法学
MIT-BIH 心律失常库 47 48 段半小时 2 360 Hz 心搏类型 节律分类基准
MIT-BIH 噪声压力测试库 若干 12 段半小时 2 360 Hz 无 噪声鲁棒性测试
PhysioNet 挑战赛 2011 多中心 12 导联短记录 12 500 Hz 判读结论 分诊断挑战
WESAD 15 多模态会话 多模态 多档 情绪状态 可穿戴压力识别
本库的独特处 极少 极少 四路同片 一致 无 同一贴片三朝向

与噪声压力测试库最容易被混淆:那个库是往干净心电上叠加真实记录的噪声,噪声与心电来自不同的人;而这个库的伪迹与心电天然同步,是同一段身体在动的时候录下来的。前者的噪声可控可复现,后者的伪迹不可控但更真实。两者在方法学上是互补关系,不是替代关系。

与多导联库的差别则是结构性的。多导联库的每一路对应胸壁上固定的解剖位置,路与路之间的角度关系由导联体系定义;这个库的四路对应同一块贴片上四对电极,角度关系由贴片本身的构造决定,而贴片又可以被整体旋转。所以它天然适合研究位置效应,却不适合研究导联特异的心电形态。

§3 它是谁的数据:一篇 BSN 论文的配套

3.1 作者、机构与出处

官方页面给出的引用是 Vahid Behravan、Neil E. Glover、Rutger Farry、Mohammed Shoaib、Patrick Y. Chiang 五人合著的会议论文,题为 Rate-Adaptive Compressed-Sensing and Sparsity Variance of Biomedical Signals,发表在 2015 年 6 月于 IEEE Body Sensor Networks 会议上。题目已经把研究问题说得很清楚:自适应采样率的压缩感知,以及生物医学信号的稀疏度方差。

从题名可以反推这个库为什么长这样。稀疏度方差研究的是「同一类信号在不同状态下的稀疏度波动有多大」,那就必须让同一信号源在不同状态下被反复采集。一名受试者、三种运动、三种朝向,恰好是这个问题的实验台。多受试者反而会引入无关方差,把稀疏度方差这个待测量淹掉。

官方页面另有一段 PhysioNet 的标准引用,指向 2026 年发表在 Nature Health 上的平台综述,作者为 Pollard 等人。这一段是平台层面的引用,与数据集本身无关,属于 PhysioNet 全部资源共用。

3.2 时间线

时间 事件 来源
2015 年 6 月 IEEE BSN 会议发表配套论文 官方引用段
2015 年 11 月 17 日 二十六个数数据体文件的时间戳 目录列表
2015 年 11 月 25 日 电极贴片说明 PDF 时间戳 目录列表
2015 年 12 月 16 日 全部头文件与两张图片的时间戳 目录列表
2015 年 12 月 18 日 PhysioNet 以 1.0.0 版发布 官方页面
2019 年 2 月 20 日 补充 SHA256SUMS.txt 校验清单 目录列表

从时间戳看,数据体先于头文件二十九天落盘,这个先后顺序在离线采集再整理的流程里很常见:原始二进制先写出来,头文件按 WFDB 规范批量补写,图片与说明文档最后制作。这属于常规流程推断,官方没有明确说明。

十年间版本号停留在 1.0.0,没有修订版、没有勘误。对于一份只有二十七条记录的小库,这既是它稳定的证据,也说明社区没有对它提出过需要修正的问题。

3.3 采集场景:一块贴片,四对电极,三个角度

官方的数据描述只有两段,但把关键几何讲清楚了。受试者身上贴一块贴片,贴片内建四对电极,四对电极以四十五度间隔排布,排布方式见 patch_electrodes.jpg。贴片整体相对身体又被放在多个朝向上,朝向见 patch_location.png。每条记录含四路信号,对应四对电极。

+------------------------------+
|  贴片(圆角方形,贴于体表)  |
|                              |
|   (0度)  ----  (45度)        |
|      \        /              |
|       \      /               |
|        \    /                |
|         (中心)               |
|        /    \                |
|       /      \               |
|   (90度) ---- (135度)        |
|                              |
+------------------------------+
#-- 示意:四对电极以 45 度间隔围绕中心排布
#-- 实际排布以 electrode_patch.pdf 与 patch_electrodes.jpg 为准

四十五度间隔意味着贴片内四对电极覆盖了圆周上四个方向,每隔一个直角的一半。这个设计让贴片内的角度采样相对均匀,也让贴片整体旋转时四路信号的变化可以被预测:旋转四十五度,大致相当于把四路的角色轮换一格。官方没有明确说明旋转与信号轮换的对应关系,这个推断只能作为工作假设。

三种运动的选择也有讲究。站立是准静态,伪迹几乎只剩呼吸与细微的重心调整,可作为对照。行走是周期性运动,伪迹以步频为基频周期性出现,正好体现「伪迹有结构」这一点。单次跳跃是瞬态运动,伪迹是一次冲击加一段衰减,与行走形成对照。

活动 代码 运动性质 伪迹预期形态 在实验中的作用
站立 s 准静态 基线漂移、轻微呼吸起伏 近干净对照
行走 w 周期性 随步频重复的尖峰与基线抖动 结构化伪迹
单次跳跃 j 瞬态 一次冲击加余振 非平稳伪迹

表中「伪迹预期形态」是根据运动性质写的工作描述,官方页面并未给出逐条的形态说明。任何引用这部分的结论,都应标注为解读而非官方结论。

3.4 受试者是谁

全库只有一个人。头文件里写着年龄二十五、性别男、诊断栏与用药栏都写着 none。官方摘要用一个短语概括他:a single healthy 25-year-old male。除此之外没有身高体重、没有静息心率、没有运动习惯、没有采集地点。

属性 值 来源 对使用的含义
人数 1 官方摘要 无法做跨人划分
年龄 25 头文件注释 青年男性
性别 男 头文件注释 无女性样本
健康状况 健康 官方摘要 无病理形态
诊断 none 头文件注释 无标签可用
用药 none 头文件注释 无药物影响
采集地点 未公布 无 无法判断人群背景
采集日期 未公布 无 无法评估时间因素

这个受试者是谁并不重要,重要的是他只有一个人。这一点决定了库里所有结论的适用范围:任何观察到的伪迹形态,都是「这一名受试者、这一块贴片、这一次试验」的形态,向其它人的迁移能力不被数据支持。

3.5 与库内其它 PhysioNet 小库的对照

PhysioNet 上有不少同量级的专用小库,它们与 MACECGDB 共享同一种气质:规模极小、目标极窄、许可极宽。

PhysioNet 小库 记录规模 专门用途 与 MACECGDB 的关系
噪声压力测试库 12 段半小时 考察算法对真实噪声的鲁棒性 噪声外挂,本库伪迹内生
心率变异三角指数库 少量长时记录 心率变异方法示范 关注 HRV,本库关注形态
模拟数据集 合成信号 算法调试 可合成伪迹,本库为真实
MACECGDB 27 条八秒 运动伪迹与稀疏度 本库

这类小库在文献里的角色通常不是主数据集,而是补充实验或思路来源。它们的被引次数往往低于大库,但对特定问题的指导作用不可替代。判断一份小库的价值,看的是它能不能让某个问题变得可实验,而不是它能不能喂饱模型。

§4 它最独特的东西:同一贴片的四种视角

4.1 为什么「同一贴片多路」比「多导联」更稀缺

多导联心电随处可见,十二导联、三导联、单导联,公开库里一抓一把。但同一块贴片内四对电极同时取样,这个结构在公开资源里极少见。原因也简单:标准导联体系是为诊断服务的,位置由医疗规范固定;贴片内的多电极是为工程服务的,位置由产品设计决定。前者需要跨设备跨机构的可比性,所以被标准化了;后者需要的是产品内部的自由度,所以各家不同,很少公开。

MACECGDB 的稀缺性正落在后者。它把一块贴片的内部结构公开了,连带三种朝向、三种运动。任何一个做贴片式心电的团队,都能用它检验自己的算法在「电极位置变化」这一维度上是否稳定。

维度 标准多导联库 MACECGDB
路与路的关系 解剖位置固定,由导联体系定义 同一贴片内,由产品几何定义
位置可变性 固定,贴错就是质量事故 可变,三种朝向是实验变量
跨设备可比性 高 几乎为零
适合研究的问题 导联特异的病理形态 位置与运动对信号的影响
公开程度 高 低,本库是少数公开样本

4.2 案例:test14_45w 这一条记录的四路并排

选 test14_45w 作贯穿案例,理由是它落在行走组的中段:活动类型是库中伪迹最结构化的行走,朝向是中间档的四十五度,流水号在中间,既不是边界也不是特例。它的名字已经把三个元信息全写出来了,作为讲解样本最省口舌。

这条记录的四路信号来自同一贴片上四对电极。因为四对电极在贴片上以四十五度间隔排布,四路看到的其实是同一个心电向量在不同方向上的投影。相邻两路之间角度差四十五度,对角两路之间角度差九十度。这个几何关系意味着:四路不应该完全相同,也不应该完全无关。

import wfdb
import numpy as np

base = "https://physionet.org/files/macecgdb/1.0.0"
rec = wfdb.rdrecord(f"{base}/test14_45w")
x = rec.p_signal
print("形状:", x.shape)
print("每路程长(毫伏):", [round(float(np.ptp(x[:, i])), 3) for i in range(4)])
print("两两相关:", np.round(np.corrcoef(x.T), 2))

这段代码给出两张表:每路的峰峰值,与四路之间的相关系数矩阵。在行走状态下,四路之间的相关性通常明显低于站立状态——运动让每对电极接触不同的肌群与皮肤区域,伪迹各不相同。这个对比正是 §4.2 的案例要被反复引用的原因:它把一个抽象的「多视角」变成了一个可以打印出来的矩阵。

import wfdb
import numpy as np

base = "https://physionet.org/files/macecgdb/1.0.0"
for name in ("test01_00s", "test14_45w", "test19_00j"):
    x = wfdb.rdrecord(f"{base}/{name}").p_signal
    c = np.corrcoef(x.T)
    off = c[np.triu_indices(4, 1)]
    print(name, "跨路平均相关:", round(float(off.mean()), 3))

把站立、行走、跳跃各取一条,跨路平均相关系数呈现出一个可读的趋势:站立最高,行走下降,跳跃最不稳定。这与直觉一致——人越动,四路越各自为政。但三条对三条,结论只能停在定性层面,不能说「行走使相关性下降多少个百分点」(§7.3)。

值得注意的是,四路之间的相关不完全由伪迹决定,也由电极几何决定。对角两路相差九十度,理论上投影相关性就该低于相邻两路。所以任何相关性分析都应该先看矩阵的结构,再谈论运动的影响,否则会把几何效应误读成伪迹效应。§4.2 的案例之所以选四十五度朝向,是因为在这个朝向下,四路与身体坐标的夹角都不是零,几何效应最均衡。

4.3 贴片朝向如何改写四路信号

贴片整体旋转,等价于把同一个信号在四个方向上重新取样。旋转零度时,四对电极中有一对大致与身体某个方向对齐;旋转四十五度时,对齐关系被打散;旋转九十度时,又有一对与另一个方向对齐。三次旋转覆盖了四十五度的完整周期。

朝向 电极与身体的相对关系 四路形态的预期 可验证的迹象
0 度 一对电极近似对齐身体主轴 某一路幅度突出 某一路峰峰值显著偏大
45 度 四路都不与主轴对齐 四路幅度较均衡 峰峰值离散度最小
90 度 一对电极与前一朝向对齐方向正交 突出的一路换成了另一路 峰峰值最大的通道编号变化

上表是依据几何关系推出的工作假设,官方未提供验证。要在库里检验它,正确的做法是把同一活动下的三个朝向摆在一起,逐通道比较峰峰值排序,看排序是否随朝向轮换。这正是 §4.2 的案例可以扩展的方向:单条记录看相关性矩阵,九条记录看排序轮换。

朝向变量的价值在于它把「电极位置」从一个不可控的噪声源变成了可控的实验因素。真实产品里,用户贴歪是常态;研究里能系统改变朝向的机会却很少。这个库提供了三种朝向,虽少,但足以让「位置敏感度」这个概念有数据可依。

4.4 它支撑的四类实验

实验类型 设计 它能给的 结论强度
去噪算法对比 三组活动各取三条,比较残差与形态保真 真实伪迹,无可用的干净参考 中,需自建参考
压缩感知重建 固定字典与采样率,比较三组的重建误差与稀疏度 小体量可反复迭代 高,同人同片可比
位置敏感度分析 固定活动,比较三种朝向的通道排序 九条一组,每朝向三条 弱,重复数太少
伪迹结构化分析 比较站立与行走的频谱与包络 两种运动性质对照 中,定性为主

四类实验里,第二类的结论强度最高,因为它不需要外部参考:重建误差是自洽的,同一套参数跑在三种活动上,比较的是相对差异。第一类最难,因为没有干净参考,去噪效果好不只有主观判断,得靠下游任务间接验证,而这个库没有下游任务标签。

4.5 边界条件:什么时候它不再适用

条件 是否适用 判断依据
你要验证去噪算法在真实伪迹上的行为 适用 三种运动真实伪迹齐备
你要做压缩感知或稀疏度分析 适用 设计初衷,数据规格匹配
你要研究电极位置敏感度 有条件适用 三朝向太少,只能定性
你要训练端到端深度学习模型 不适用 二十七条,必然过拟合
你要评估跨人泛化 不适用 一人,无划分空间
你要做心律失常检测 不适用 无注释,无患者
你要与十二导联对齐 不适用 几何不可换算
你要做多模态融合 不适用 只有心电一种模态

§5 怎么拿到:从目录遍历到可训练张量

5.1 目录与体积

整个库未压缩约一兆字节,压缩包也是一兆字节。文件构成极简:二十七个 .hea、二十七个 .dat、一份 RECORDS、一份校验和、两张图片、一份 PDF。没有子目录,没有隐藏层级。

文件类 数量 单件大小 合计 说明
.dat 数据体 27 约 31.2 KB 约 842 KB 四路 16 位交错
.hea 头文件 27 约 270 B 约 7 KB 纯文本五行
RECORDS 1 297 B 297 B 二十七行记录名
SHA256SUMS.txt 1 4.5 KB 4.5 KB 逐文件校验
图片两张 2 15.3 / 36.4 KB 约 52 KB 电极与位置示意
electrode_patch.pdf 1 128.7 KB 128.7 KB 贴片构造文档

这一点体量意味着它几乎不可能成为存储或带宽瓶颈。真正的时间成本在调试代码上,而不在下载上。因此它非常适合作为新人熟悉 WFDB 生态的第一个库:跑完一次完整的读、画、算、存,成本极低。

5.2 批量获取

官方给出三种获取方式,任选一种即可。第一种是网页上的 ZIP 按钮,适合一次性下载。第二种是 wget 递归,适合命令行环境。第三种是 AWS 公开桶同步,适合在云上直接取数。

#-- 方式一:整包下载后解压
cd /tmp && wget -q https://physionet.org/content/macecgdb/1.0.0/macecgdb.zip
unzip -o macecgdb.zip -d macecgdb

#-- 方式二:只抓记录与头文件,跳过图片与 PDF
wget -q -r -N -c -np -A "*.hea,*.dat,RECORDS" \
  https://physionet.org/files/macecgdb/1.0.0/

第二种方式用 -A 限定了后缀,抓下来的目录会保留远端层级。如果只为跑通算法,这样最省事,避免把 PDF 与图片也拖下来。当然整包只有一兆字节,省下的空间可以忽略,过滤的意义主要在于保持目录干净。

#-- 方式三:从 PhysioNet 公开桶同步(需要 aws cli)
aws s3 sync --no-sign-request \
  s3://physionet-open/macecgdb/1.0.0/ /tmp/macecgdb --exclude "*" \
  --include "*.hea" --include "*.dat" --include "RECORDS"

公开桶的路径与网页路径规则一致,--no-sign-request 表示匿名访问,不需要任何凭证。这一步在集群环境下最实用,因为它不需要先登录再跳转。

5.3 建立索引

由于元信息全在文件名里,建索引实际上是一段字符串解析。写一个函数把三项提取出来并存成表,后面所有筛选都基于它。

索引表的七个字段如下。前三项从文件名解析,后三项从头文件读取,最后一项用来分组。

这段代码把 27 行展开成一张三乘三的计数表,用来确认设计是否完整。若某格的数量不是三,说明清单被改动过或解析规则与实际命名不符。这是每次用新版本前都该跑一遍的自检。

索引字段 类型 提取方式 用途
record 字符串 文件名原样 读数据时的主键
index 整数 test 后两位 排序与去重
angle 整数 下划线后两位 分组比较朝向效应
activity 字符串 末位字母映射 分组比较活动效应
n_sig 整数 头文件首行 一致性检查
fs 整数 头文件首行 一致性检查
sig_len 整数 头文件首行 一致性检查

后三个字段从头文件读,而不是从文件名推断。原因是文件名的语义是官方约定的,但采样率、通道数、点数这些是格式层的,以头文件为准更稳妥。全库一致性检查的预期结果是四个通道、五百赫兹、四千点,任何一条不符都说明文件损坏或被替换。

5.4 切窗与张量

每条记录本身就是八秒,不需要切窗。要做批处理时,直接把 27 条堆成一个张量。形状是二十七乘四千乘四。

import numpy as np
import wfdb

base = "https://physionet.org/files/macecgdb/1.0.0"
recs = [r.strip() for r in open("/tmp/macecgdb/RECORDS") if r.strip()]
X, meta = [], []
for n in recs:
    r = wfdb.rdrecord(f"{base}/{n}")
    X.append(r.p_signal)
    meta.append((n, r.n_sig, r.fs, r.sig_len))
X = np.stack(X)
print("张量:", X.shape, X.dtype)
print("全部四路:", all(m[1] == 4 for m in meta))
print("全部 500 Hz:", all(m[2] == 500 for m in meta))
print("全部 4000 点:", all(m[3] == 4000 for m in meta))

堆叠后得到的张量非常小,内存里只有约一兆字节的单精度数据。这让它适合放进单元测试:任何去噪或重建函数都能在一秒内跑完全库,适合做集成测试的固定输入。

张量维度 大小 对应 注意
第零维 27 记录 与 RECORDS 顺序一致
第一维 4000 采样点 八秒乘五百赫兹
第二维 4 通道 ECG 1 至 ECG 4
数据类型 浮点 毫伏 已按增益换算
内存占用 约 1 MB 单精度 可在内存中常驻

如果需要对多段做统计,可以在第一维上按秒切,每段五百点。但八秒的样本对切窗没有实际意义,切完只剩八个互不相干的片段,丢掉了运动周期。要保留周期信息,不如在频域处理。

5.5 按活动与朝向分组的评测协议

因为只有二十七条,任何「留出」都意味着某个格子被抽空。正确的评测设计不是留出集,而是交叉验证加分组报告。

import numpy as np
from itertools import combinations

#-- 三组活动,每组九条;组内按朝向再分三格
groups = {"standing": [], "walking": [], "jump": []}
for i, n in enumerate(recs):
    groups[{"s": "standing", "w": "walking", "j": "jump"}[n[-1]]].append(i)

for act, idx in groups.items():
    print(act, "条数:", len(idx), "索引:", idx)

分组之后,每个活动组内部再按朝向分三格,每格三条。报告指标时,正确的写法是「站立组九条、行走组九条、跳跃组九条,各组内按朝向再分三格,每格三条」,而不是给一个全局平均值。全局平均值会把三种运动混在一起,任何去噪算法在这种混算下的差异都会被平均掉。

报告项 建议写法 不建议写法
样本量 每组九条,每格三条 全库二十七条平均
指标 分活动、分朝向报告 一个全局数字
离散度 三条的范围或中位数 标准差(样本太少)
显著性 不做检验,只说趋势 p 值
划分 按记录编号固定种子 随机打乱后只跑一次

这套协议看起来很保守,但它与该库的规模匹配。在二十七条记录上报一个带小数点后三位的高斯误差,比报一个粗粒度的趋势更不可信。

5.6 六个最容易出错的地方

易错点 表现 正确做法
把四路当四导联 按导联名索引失败 按 ECG 1 至 ECG 4 索引
忘记除以增益 数值在千位数 用 p_signal 或除以一百
把流水号当时间 误以为 test01 最早 如需时间只能靠文件名外信息
把初始值当受试者编号 每通道数值不同 初始值是 WFDB 解码字段
在跳跃组算周期指标 指标无意义 跳跃按瞬态分析处理
跨朝向直接平均 位置效应被抹平 先分朝向再合并

第一条最隐蔽。官方文档里写的是「four signals (ECG 1 to ECG 4)」,没有写 lead,但很多人的代码习惯按 lead 命名,一旦试图按 V1、V2 取数就会报错。第二条则会在画图时表现为纵轴量级异常,看数值在几千到几万之间就知道忘了除。

§6 与库内条目的关系

6.1 关系图谱

在千方医数集的公开心电资源版图里,MACECGDB 是一个边缘但明确的位置:它不参与分类任务,不参与人群研究,只提供运动伪迹的真实样本。

关联资源 关系类型 具体接口 迁移注意
心电身份库 同类小库 同为 PhysioNet 单人或多人的短记录 关注点不同,一个身份一个伪迹
MIT-BIH 心律失常库 上下游 干净心电加标注的基准 可把本库伪迹叠加上去测鲁棒性
噪声压力测试库 对照 都是加噪鲁棒性评估 那边噪声外挂,这边伪迹内生
可穿戴压力识别库 场景相近 都是穿戴场景多模态 那边有人群标签,这边没有
折返式心电挑战赛 2011 规模对照 同为五百赫兹十二导联短记录 规模差三个数量级
心电图影像化库 无直接关系 一个是波形一个是图像 不可混用
本库在其间的身份 试剂 提供真实伪迹而不是分布 只补方法学缺口

最有价值的组合是与心律失常库的联用:从那边取干净心电与标注,按本库的伪迹形态合成污染样本,再用标注检验去噪后分类性能是否保持。这个做法借了本库的真实伪迹,又补上了本库缺失的标签,是它最常见的二次利用方式。

6.2 检索路径

在心电类目下,按用途检索比按规模检索更有效率。若目标是伪迹与去噪,MACECGDB 与噪声压力测试库是两个必看的入口;若目标是分类与诊断,应从心律失常库与挑战赛库进入;若目标是穿戴场景,应从可穿戴多模态库进入。

检索意图 首选入口 次选入口 判断依据
真实运动伪迹 MACECGDB 噪声压力测试库 伪迹是否与心电同源
去噪算法基准 噪声压力测试库 MACECGDB 是否有干净参考
穿戴设备预研 MACECGDB 可穿戴多模态库 是否需要人群
心律失常分类 心律失常库 挑战赛库 是否有标注
稀疏性与压缩感知 MACECGDB 无同类 是否专为此设计
电极位置与运动的影响 MACECGDB 无同类 是否要求位置可变
人群间差异 多中心心电库 挑战赛库 是否要求代表性
长时间连续监测 Holter 类长时库 穿戴多模态库 是否要求小时级时长
多模态融合 穿戴多模态库 无同类 是否要求第二种模态

「稀疏性与压缩感知」这一行之所以次选为空,是因为公开库里专门为这个主题准备的数据样本极少。多数压缩感知论文用的都是自采数据,公开的只有少数几份,本库是其中之一。这张表的后四行同时承担了分工判据:判断一份需求该不该落到本库上,只需要问三个问题——这个问题是否与「电极怎么动」有关,它是否不需要人群标签,它是否能接受二十七条这个量级。三问都是肯定,本库就是合适的起点;任何一问否定,就该换库。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

在对本库做任何质量判断之前,必须先校正一个常见的错位:把它当成「数据不够多」的失败样本。这个判断本身是误判,因为它假设了本库的目标是覆盖人群。官方摘要写得很直白,本库是为研究运动伪迹对信号及其稀疏性的影响而录的,受试者是一名健康青年。按这个目标衡量,一名受试者恰恰是优点,因为跨人差异是无关方差,会稀释要测量的效应。

校正之后的判断标准应该改成三条:伪迹是否真实、几何变量是否可控、规格是否规整。本库在这三条上都站得住:伪迹来自真人真动,朝向与活动是显式变量,四路五百赫兹十六位全库一致。它站不住的是另一组问题:能否泛化到人群、能否支撑监督学习、能否与临床导联对齐。把这两组问题分开,评价才不会错位。

7.1 五维评分

按千方医数集的框架,对数据集的评价分成规模、结构、标注、边界、可用性五个维度。这一框架与 DAIMS(Data and AI Management Standards)的分层思路一致:先看数据本身,再看治理与使用条件,而不是只看体量。

维度 分值(五分制) 依据 说明
规模 1 一人二十七条八秒 方法验证足够,统计推断不足
结构 4 四路同片、三乘三设计、规格统一 文件名承载全部元信息,解析简单
标注 1 仅年龄性别诊断用药四行 无心搏、无伪迹区间
边界 3 许可宽松,边界清楚 适用面窄但边界不含糊
可用性 5 一兆字节、三种取数方式、WFDB 标准 半小时能跑通

五项的加权方式取决于用途。做方法验证时,结构与可用性权重高,规模与标注权重低,总分可观;做人群研究时,规模与标注权重高,总分立刻跌到很低。任何单一的「综合分」都不应脱离用途去引用。

7.2 注释的真实覆盖范围

本库没有任何独立注释文件。所有注释都在头文件末尾的一行里,格式是尖括号包字段名后跟冒号与值。

注释项 是否逐记录不同 覆盖范围 能否支撑监督学习
年龄 否,全库二十五 全库 不能
性别 否,全库 M 全库 不能
诊断 否,全库 none 全库 不能
用药 否,全库 none 全库 不能
活动类型 是,来自文件名 全库 可做三分类
贴片朝向 是,来自文件名 全库 可做三分类
伪迹区间 无 零 不能
心搏位置 无 零 不能

能支撑监督学习的目标只有活动类型与朝向两个,而且它们来自文件名而不是注释文件。这意味着「用本库训练一个伪迹检测器」这条路走不通,除非自己定义标签口径,比如把整条记录按活动类型打上「轻伪迹/中伪迹/重伪迹」的粗标签。这种标签是研究者构造的,不是官方的(§7.3)。

7.3 已知的、可枚举的偏差

偏差项 具体表现 影响 可否从数据里校正
单人偏差 全库一名受试者 所有结论限于该人 不可校正
性别偏差 全库男性 无女性样本 不可校正
年龄偏差 全库二十五岁 无老年与儿童 不可校正
活动偏差 只有站、走、跳 无跑步、上下楼、骑行 不可校正,除非自采
朝向偏差 只有三个角度 覆盖四十五度周期的一半以上 部分可插值
重复数偏差 每格仅三条 组内方差不可估 不可校正
设备偏差 型号未公布 无法比较其它前端 不可校正
地理偏差 地点未公布 无法判断人群背景 不可校正

这张表里最值得强调的不是行数多少,而是最后两列的普遍性:八项偏差里只有一项可以从数据内部部分校正。这说明本库的适用范围不是「多大程度上有偏」,而是「偏差在结构上封死了哪类问题」。跨人、跨性别、跨年龄这三类问题,无论用什么统计技巧都无法从本库得到答案。

§4.2 的案例在这里提供了一个具体化的提醒。那条记录的四路相关性矩阵看起来信息量很大,但它反映的是一名二十五岁男性在特定贴片位置下的一次行走。任何把它当普适规律的推断,都是把一个人的身体当成了所有人的身体。

7.4 外部验证矩阵

外部验证指的是用本库之外的资源检验在本库上得到的结论。对一份小库而言,这几乎是必做的一步。

验证方向 可用外部资源 验证方式 预期结果
去噪效果 心律失常库加合成伪迹 用本库调参,在外部库上测分类保持率 可能下降,说明过拟合本库伪迹
伪迹形态代表性 自采穿戴数据 比较本库与自采数据的频谱包络 相似度决定可迁移性
电极位置效应 其它贴片公开数据 比较朝向与通道排序关系 若一致则几何推断成立
稀疏度结论 公开压缩感知心电数据 比较同采样率下的重建误差 差异大小反映人群效应
算法泛化 噪声压力测试库 同一算法在两边对比 本库更近真实,外部更可控

第二行与第四行最容易被忽略。很多人用本库调完参数就直接报结果,没有在外部数据上复核。对本库这种单人单设备的资源,外部复核不是可选项,而是结论成立的前提。

7.5 它为何能持续:一粒种子不需要长成森林

一份只有二十七条记录的小库能十年不删、持续被引用,原因不在它的数据量,而在它的替代性。想做「同一贴片内多电极、多朝向、多运动」的实验,公开资源里几乎没有第二个选择。自采一套等价数据听起来成本不高,实际上要牵涉电极设计、贴片制作、同步采集、伦理与数据整理,门槛并不低。

更重要的是它作为「种子」的用途。一个团队要开展穿戴式心电去噪研究,第一周总得有个能跑通的东西。本库小到可以放进仓库,许可宽到可以随便分发,格式标准到不需要写专门的解析器。这种「低摩擦起步」的价值,与数据量无关,与它能否被任何人立刻用起来有关。

十年版本号不变也是同一逻辑的一部分。数据没有错,就没有理由改;不需要改,就不会因为维护不力而被下架。它靠的是一种极简的稳定性,而不是持续供给新数据的能力(§8.3)。

§8 生态位与历史

8.1 历史沿革

2015 年之前,运动伪迹研究大量依赖合成噪声。做法是从某份真实噪声记录里截取噪声段,按一定信噪比叠加到干净心电上。这个做法有优点:信噪比可控、可复现、不需要重新采集。也有明显缺陷:叠加的噪声与心电不同源,噪声段的频谱不随信号变化,而真实伪迹恰恰与运动节奏强耦合。

本库出现的时机正好切入这个缺口。同一时期,穿戴式心电设备从实验室走向消费市场,贴片式产品需要证明自己在运动中还能工作,去噪算法的评估需求随之上升。一份规模极小但伪迹真实的样本,正好填补了「合成太假、自采太贵」之间的空档。

阶段 时间 特征 本库的位置
合成噪声主导 2010 年前 噪声外挂,信噪比可控 尚未出现
真实伪迹起步 2013 至 2015 开始出现穿戴场景实录 2015 年加入
大规模穿戴数据集 2018 年后 多受试者、多模态、长时 成为小样本参照
当前 至今 大库主导,小库做方法学入口 稳定存续

2026 年 PhysioNet 在 Nature Health 上发表的平台综述把这一路的积累概括为二十五年、数万篇论文的规模,其中既包括百万级记录的临床库,也包括本库这样的数十条记录的方法学组件。平台的价值不在于每一份资源都大,而在于不同量级的资源都能被稳定托管、被稳定引用。

8.2 与后续研究的关系

本库在 2015 年之后的研究里,很少作为主数据出现,更多是作为方法学背景或消融实验的一环。它的被引多集中在压缩感知、稀疏表示与穿戴式信号质量评估三个方向。

研究方向 与本库的关系 典型用法
压缩感知重建 源头 验证稀疏度随运动变化
自适应采样 源头 考察采样率随信号状态的调整
穿戴信号质量评估 参照 定义「伪迹程度」的少量真实样本
去噪网络训练 极少 数据太少,一般不直接训练
电极位置优化 参照 论证位置敏感性的存在
算法泛化测试 外部复核 检验算法是否只对本库伪迹有效

值得注意的是,它与后续大规模穿戴数据集之间不是替代关系。大库覆盖面广但伪迹被平均,小库覆盖窄但每个格子的伪迹性质清晰。在研究「伪迹机制」而不是「穿戴设备的平均性能」时,小库仍有优势。最后一行尤其值得展开:很多算法在本库上调出很小的重建误差,换到别的穿戴数据上就失效,原因是本库的伪迹只来自一种贴片几何与一名受试者。把本库当外部复核集而不是训练集,这个风险反而变成了优势。

8.3 生态位:试剂而不是样本

用一句话概括本库的生态位:它是试剂,不是样本。样本用来估计分布,试剂用来验证反应。一个实验室不需要大量试剂,只需要一小瓶性质明确的。

这个定位解释了它的所有特征。小体量是特性而非缺陷,因为验证只需要少量高质量输入。单人是特性,因为要排除无关方差。无标注是特性,因为研究目标不在分类。规格统一是必需,因为方法对比要求输入一致。

定位 需要的属性 本库是否满足 反例
试剂型资源 小、纯、可控、许可宽 满足 大库需要下载数十 GB
样本型资源 大、有代表性、有标注 不满足 本库一人无标注
基准型资源 有官方划分与评分脚本 不满足 本库无划分
教学型资源 体量小、结构清楚 满足 本库适合首次接触 WFDB

试剂这个比喻还能解释另一个现象:本库在论文里出现的频率远高于它被下载的次数。试剂在被用完之前不需要大量消耗,一个团队读它一次、用它的形态描述一次,就完成了它的使命。相反,一份大库会被反复下载、反复切分、反复统计。两种资源的消耗模式不同,用下载量去比较它们的价值没有意义。

8.4 谁在用它,用来做什么

从官方页面的项目浏览量看,当前版本累计被查看两百余次,这个数字在 PhysioNet 上属于中等偏低。低浏览量不代表低价值,只说明它面向的是一个窄口。

使用者类型 典型用途 从中获得的东西 主要障碍
算法研究者 去噪与重建方法验证 真实伪迹与可控几何 无干净参考
穿戴设备工程师 位置与运动敏感性预研 三种朝向的对照 与自家产品几何不同
教师 伪迹与心电频率重叠的演示 三种运动并排的直观差异 无标注难做练习
学生 首次接触 WFDB 生态 小体量低成本 网上资料少
论文作者 作为方法学背景引用 稀疏度随运动变化的依据 只能引用不能复现全流程
数据工程师 流水线与校验脚本的测试样本 规格统一、异常易检出 体量太小,压不出性能问题

后两行是常被忽略的使用者。论文作者引用它多半不是为了跑实验,而是为了说明「稀疏度会随运动变化」这个前提有公开证据。数据工程师则把它当单元测试的固定输入——规格统一意味着任何解析 bug 都会立刻在二十七条上暴露出来。

§9 使用指引

9.1 三种角色的路径

不同角色从本库得到的东西不同,最短路径也不同。

角色 目标 第一步 第二步 第三步
算法研究者 验证去噪或重建 跑通读数据与画四路 固定分组做三组对比 在外部库复核
穿戴工程师 评估位置与运动敏感性 读三朝向的通道排序 比较峰峰值与相关结构 与自研贴片对照
教师与学生 建立直觉 读站立、行走、跳跃各一条 画时域与频谱对照 写一页观察笔记

三条路径的共同起点都是读数据与画图,差别在于之后往哪个方向走。任何一条路径都不需要先学 WFDB 的完整规范,只要会用 rdrecord 就能开始。

9.2 一条最短的可用流程

从零到能出一张报告图,最短的流程是五步:取数、建索引、读全库、分三组算指标、画对照图。

import numpy as np
import wfdb

base = "https://physionet.org/files/macecgdb/1.0.0"

#-- 1 取全库记录名
names = [r.strip() for r in open("/tmp/macecgdb/RECORDS") if r.strip()]

#-- 2 按活动与朝向建索引
idx = {}
for n in names:
    act = {"s": "standing", "w": "walking", "j": "jump"}[n[-1]]
    ang = int(n[-3:-1])
    idx.setdefault((act, ang), []).append(n)

#-- 3 逐个读入并算四路平均峰峰值
metric = {}
for key, lst in idx.items():
    vals = []
    for n in lst:
        x = wfdb.rdrecord(f"{base}/{n}").p_signal
        vals.append(float(np.mean(np.ptp(x, axis=0))))
    metric[key] = round(float(np.mean(vals)), 3)

#-- 4 按活动分组打印
for act in ("standing", "walking", "jump"):
    line = [metric[(act, a)] for a in (0, 45, 90)]
    print(act, line)

这段输出的三行三列,正好对应 §2.4 的三乘三格子。看到数值后,第一件要做的事不是解释差异,而是检查顺序是否与预期一致:站立应当最小。若站立反而最大,多半是读错了通道或忘了换算物理值。

import numpy as np
import wfdb
from scipy import signal

base = "https://physionet.org/files/macecgdb/1.0.0"
for n in ("test01_00s", "test10_00w", "test19_00j"):
    x = wfdb.rdrecord(f"{base}/{n}").p_signal[:, 0]
    f, p = signal.welch(x, fs=500, nperseg=512)
    band = {lo: round(float(p[(f >= lo) & (f < hi)].mean()), 6)
            for lo, hi in ((0.5, 5), (5, 40), (40, 150))}
    print(n, band)

频谱分段统计给出三个频段的平均功率密度。站立与行走的差别最明显地体现在低频段:步频落在零点五到五赫兹之间,行走时这一段的功率会明显抬升。跳跃是瞬态,单次冲击的能量摊到频谱上比较分散,用同样的段划分未必能看出稳定模式(§4.2 的案例里跳跃是最不稳定的一组)。

9.3 引用方式

官方要求的引用分两层:数据集层面引用配套论文,平台层面引用 PhysioNet 的标准引用格式。

引用层级 引用内容 格式建议
数据集 Behravan 等,Rate-Adaptive Compressed-Sensing and Sparsity Variance of Biomedical Signals,IEEE BSN 2015 作者、题名、会议、年份
平台 Pollard 等,PhysioNet as a global platform for biomedical research,Nature Health 2026 作者、题名、期刊、DOI
版本 Motion Artifact Contaminated ECG Database v1.0.0 名称加版本号
标识 DOI 10.13026/C2JP4G 可解析链接
许可 ODC-BY 1.0 署名要求

四个字段里最容易漏的是版本号。PhysioNet 的库会更新,引用时写明版本号才算精确定位。DOI 指向的是特定版本,所以带 DOI 的引用已经隐含了版本,但仍建议在文字里写出。另外要注意,官方页面把配套论文列为「使用本资源时应引用的原始出版物」,也就是说数据集层面并没有独立的论文,引用这篇会议论文即视为引用数据集本身。

9.4 复现一份最小报告的三步检查

按顺序确认三件事,可以避免绝大多数返工:先确认读进来的形状是四千乘四,再确认四路增益一致,最后确认分组索引与 §2.4 的格子对得上。

检查点 预期 不符时的常见原因 处理
张量形状 27 乘 4000 乘 4 混入了图片或 PDF 当记录 按 RECORDS 清单逐个读
物理值与原始值 物理值约为原始值除以一百 忘了增益 用 p_signal 或手工换算
分组计数 每格三条 文件名解析用了固定切片 用正则而非下标
通道命名 ECG 1 至 ECG 4 代码按导联名索引 改按下标索引
采样率 全库五百赫兹 读到了非本库文件 从 rdheader 取

第三步之所以容易被跳过,是因为文件名长度固定、格式统一,用固定下标切片(比如取倒数第三四位)读起来很方便。但这一技巧依赖文件名格式永不变化,一旦官方在某个版本里加入新后缀,切片就会静默出错而不报异常。正则虽然啰嗦,出错时会直接匹配失败。

§10 AI 使用声明

项目 内容
写作方式 由人工智能辅助撰写,人工校核事实与表述
事实来源 官方项目页、记录清单、头文件、官方文件列表
未使用的手段 未下载全量数据做分布统计,未做任何频次或空值分析
数字口径 官方页面与头文件给出什么就写什么,不推断不补全
不确定项处理 标注「官方未公布」或「工作假设」,不写成事实
表格中的预期值 明确标注为几何推断或工作描述,与官方结论分开
封面图 由生成模型按风格提示词产出,不含真实数据
更新责任 若官方页面修订,以官方为准,本页随之更新

常见误读(避坑清单)

说法 实际 证据
MAC 是某个机构或设备代号 MAC 是 Motion Artifact Contaminated 的首字母缩写 官方页面标题与摘要
这是一份多导联心电库 四路信号来自同一贴片内四对电极,非标准导联 官方数据描述第一段
有四个受试者 只有一名二十五岁健康男性 官方摘要
每条记录很长 每条恰为八秒,四千点乘五百赫兹 头文件首行
有丰富的诊断标注 诊断与用药两栏全为 none 头文件注释行
可以用来训练心律失常模型 无任何心搏或节律注释 目录中无 .atr 文件
数据量有几十兆 未压缩约一兆字节 官方文件列表合计
站立、行走、跳跃条数不等 三种各九条 RECORDS 逐行核对
流水号就是录制顺序 官方未给录制时间,序号只是编号 官方未提供日期字段
四路增益不同导致幅度差异 四路增益都写着一百 头文件通道行

FAQ

问:MACECGDB 这个名字该怎么拆?
答:MAC 是 Motion Artifact Contaminated 的首字母缩写,意思是「被运动伪迹污染的」,不是机构名也不是设备型号。全名直译是「运动伪迹心电图数据库」。把它读成「多导联心电库」是常见的误解(§1.2)。

问:它有多少条记录、多少路信号?
答:二十七条记录,编号 test01 至 test27;每条四路信号,头文件里记作 ECG 1 到 ECG 4。四路对应贴片内四对电极,不是四个标准导联。

问:它能不能训练心律失常分类模型?
答:不能。全库没有心搏或节律注释,受试者是一名健康人,原用途是研究伪迹对稀疏性的影响。拿它做诊断模型,等于把一个活动标签当病理标签用(§1.6)。

问:三种活动各多少条?
答:按命名规则,站立九条、行走九条、跳跃九条,各占三分之一;每种活动内再按零度、四十五度、九十度三种朝向各三条(§2.4)。

问:为什么每条只有八秒?
答:官方未解释。从规格看,四千点除以五百赫兹恰为八秒,长度足够展示一次运动周期的伪迹,也足够让压缩感知实验在极小数据量上反复迭代。

问:可以商用吗?
答:ODC-BY 1.0 允许商用,条件是署名。署名应按官方页面的要求引用 Behravan 等人的会议论文,并同时引用 PhysioNet 平台(§9.3)。

问:四路信号之间为什么差别这么大?
答:四对电极在贴片上以四十五度间隔排布,四路是同一心电向量在不同方向上的投影。角度不同则投影不同,再叠加各电极接触状态差异,差别自然出现(§4.2)。

问:有干净参考信号吗?
答:没有。官方不提供同步采集的无伪迹参考,也没有说明哪条记录可以当基线。做去噪评估时需要自建参考,比如用强滤波或模板平均近似(§4.4)。

问:采集设备和地点是什么?
答:官方页面都未公布。头文件只给了年龄、性别、诊断、用药四项,没有设备型号、没有机构名称、没有采集日期。

问:数据会不会更新?
答:版本号自 2015 年发布以来一直是 1.0.0,唯一的变化是 2019 年 2 月补了校验和文件。十年未修订,说明没有需要更正的地方。

问:适合当教学材料吗?
答:适合入门。体量一兆字节,格式是标准 WFDB,结构简单到文件名就够用。缺点是没有任何标注,做练习需要自己出题(§8.4)。

问:和噪声压力测试库有什么区别?
答:那个库往干净心电上叠加从别处截来的真实噪声,噪声与心电不同源;本库的伪迹与心电同源,是同一段身体在动时录下的。前者可控可复现,后者更真实但不可控(§2.5)。

术语表

术语 英文 在本库中的含义
运动伪迹 motion artifact 电极随身体移动导致接触面变化,叠加到心电上的干扰
贴片 patch 内建四对电极、贴于体表的一体化采集单元
电极对 electrode pair 贴片内成对的两片电极,构成一路差分信号
朝向 orientation 贴片整体相对身体旋转的角度,本库有零、四十五、九十度
通道 channel 本库的一路信号,对应一对电极
采样率 sampling rate 每秒采样点数,本库为五百赫兹
分辨率 resolution 模数转换的位数,本库为十六位
增益 gain 模拟前端放大倍数,本库为一百
头文件 header file WFDB 格式的文本描述文件,后缀 hea
数据体 data file WFDB 格式的二进制文件,后缀 dat
记录 record 一条八秒四路信号的完整单位
稀疏度 sparsity 信号在某个变换基下非零系数的多少
压缩感知 compressed sensing 用远少于奈奎斯特率的测量重建稀疏信号
稀疏度方差 sparsity variance 同一信号在不同状态下稀疏度的波动,本库配套论文的主题
站立 standing 活动代码 s,准静态对照
行走 walking 活动代码 w,周期性伪迹
单次跳跃 jump 活动代码 j,瞬态伪迹
基线漂移 baseline wander 低频成分的整体漂移,多由呼吸与体位变化引起
步频 cadence 行走时每步的时间频率,落在低频段
差分信号 differential signal 两个电极电位之差,本库四路都是差分
投影 projection 心电向量在电极方向上的分量
峰峰值 peak-to-peak 一段信号最大值与最小值之差
信噪比 signal-to-noise ratio 信号功率与噪声功率之比
格式规范 WFDB PhysioNet 通用的生理信号存储规范
开放许可 ODC-BY 1.0 允许包括商用在内的使用,需署名
方法学材料 methodological material 用于验证方法而非估计分布的数据

附录 A:核心数字核对表

项 值 来源 来源层级
记录数 27 RECORDS 与官方文件列表 官方
通道数 4 头文件首行 官方
采样率 500 Hz 头文件首行 官方
每条点数 4000 头文件首行 官方
单条时长 8 秒 点数除以采样率 推导
分辨率 16 位 头文件通道行 官方
增益 100/mV 头文件通道行 官方
受试者数 1 官方摘要 官方
年龄 25 头文件注释 官方
性别 男 头文件注释 官方
活动类型 3 种 官方数据描述 官方
朝向 3 种 官方数据描述 官方
整包大小 约 1.0 MB 官方页面 官方
版本 1.0.0 官方页面 官方
发布日期 2015-12-18 官方页面 官方
许可 ODC-BY 1.0 官方页面 官方
DOI 10.13026/C2JP4G 官方页面 官方

附录 B:数字的来源分层

层级 含义 本页涉及的数字
官方页面 PhysioNet 项目页与其文件列表直接给出 记录数、通道数、采样率、增益、分辨率、体量、版本、许可、DOI
官方文件 头文件与 RECORDS 清单内容 点数、每通道初始值、注释行四项、二十七行记录名
论文摘要 配套会议论文的题名与出处 研究主题、作者、会议与年份
推导 由官方数字直接换算或按命名规则展开 单条八秒、三乘三格子、各组九条
工作假设 依据几何关系提出、官方未验证 朝向与通道排序的轮换关系、伪迹形态的定性描述

前两层可以直接引用;第三层用于说明背景;第四层的推导可复算;第五层必须标注为推断,不能当作结论使用。

附录 C:完整参考文献

序号 文献 用途
1 Behravan V, Glover NE, Farry R, Shoaib M, Chiang PY. Rate-Adaptive Compressed-Sensing and Sparsity Variance of Biomedical Signals. IEEE BSN 2015. 数据集配套论文
2 PhysioNet. Motion Artifact Contaminated ECG Database v1.0.0. 2015-12-18. DOI 10.13026/C2JP4G. 官方数据页
3 Pollard T, Moody BE, Lehman L, Gow B, Fernandes C, Xie C, Johnson A, Mark RG, Heldt T. PhysioNet as a global platform for biomedical research. Nature Health, 2026. 平台引用
4 Goldberger A, et al. PhysioBank, PhysioToolkit, and PhysioNet. Circulation, 2000. WFDB 与平台背景
5 Open Data Commons. Attribution License v1.0. 许可文本
6 Moody GB, Mark RG. The impact of the MIT-BIH Arrhythmia Database. IEEE EMB Magazine, 2001. 同类库对照背景

附录 D:任务代码

一段把全库读入、按三乘三分组、输出分组摘要的完整脚本,可直接运行。

import numpy as np
import wfdb

base = "https://physionet.org/files/macecgdb/1.0.0"
ACTS = {"s": "standing", "w": "walking", "j": "jump"}

def load_all(root):
    names = [r.strip() for r in open(f"{root}/RECORDS") if r.strip()]
    out = {}
    for n in names:
        r = wfdb.rdrecord(f"{base}/{n}")
        out[n] = {
            "sig": r.p_signal,
            "act": ACTS[n[-1]],
            "ang": int(n[-3:-1]),
            "fs": r.fs,
        }
    return out

def summarize(db):
    cells = {}
    for n, v in db.items():
        key = (v["act"], v["ang"])
        p2p = float(np.mean(np.ptp(v["sig"], axis=0)))
        cells.setdefault(key, []).append(p2p)
    rows = []
    for act in ("standing", "walking", "jump"):
        rows.append([act] + [round(float(np.mean(cells[(act, a)])), 3)
                             for a in (0, 45, 90)])
    return rows

db = load_all("/tmp/macecgdb")
print("记录数:", len(db))
for r in summarize(db):
    print(r)

脚本假设数据已解压到 /tmp/macecgdb,若改用远端路径,只需把 open 换成读网页清单。输出三行三列,与 §2.4 的格子一一对应。

下载后先做一遍完整性检查同样是必要的:用 rdheader 只读头文件、不加载数据体,逐条核对通道数、采样率与点数是否分别为四、五百、四千。若有不符,说明文件损坏或被替换,应当在批处理之前就停下。这一步比读全量数据快得多,适合放进下载脚本的末尾。

§4.3 那张表的检验方法同样简单:固定活动为行走,对每个朝向取三条记录,统计四路中峰峰值最大的那一路落在第几号,再比较三个朝向的计数。若朝向变化确实带来通道排序轮换,三个朝向的计数应呈现不同分布;若三个朝向分布完全相同,则说明朝向效应被标签掩盖,或几何推断不成立。

附录 E:如果只记五件事

序 要点 一句话
1 它是谁的 一名二十五岁健康男性,不是群体
2 它有什么 二十七条八秒、四路贴片电极、三种活动三种朝向
3 它缺什么 无标注、无干净参考、无多人、无标准导联
4 它最适合 去噪与压缩感知的方法验证、穿戴设备预研
5 它最容易被误用 当多导联库训练深度模型,或用它做诊断

编辑说明

本页所有事实以 PhysioNet 官方项目页 1.0.0 版为准,辅以头文件与记录清单的逐条核对。凡官方未公布的项,均标注「官方未公布」;凡依据几何关系提出的推断,均标注为工作假设。正文未做任何分布统计,也未下载全量数据做二次分析。若官方页面后续修订,以官方内容为准。

页面中反复出现的 test14_45w 是贯穿案例,第一次出现在 §2.3,并在 §4.2、§4.3、§7.3、§9.2 等处回指。选择它是因为它同时具备行走(伪迹最结构化)与四十五度(几何最均衡)两个属性,适合作为讲解样本。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • ecgiddb — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • icentia11k — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • scientisst-move — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • ieeepg — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • auricle-wearable-cv — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • butqdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
  • drivedb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
  • eda-rest-sedation — 共享标签:生理信号 / 可穿戴传感 / 评测基准
  • mmash — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
  • bidsleep-dataset — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集