信息速览
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 — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

