CardioWave-Portable — 便携式 ECG+PPG 无袖带血压估计数据集

哈尔滨工业大学团队 2026 年在中国嫩江三级医院采集的 977 名成人 3,849 条同步单导联 ECG 与 PPG 24 秒波形记录,配 OMRON 袖带收缩/舒张压标签、信号质量标注与问卷元数据,PhysioNet 凭据受限访问,用于无袖带血压估计的可复现基准

来源 PhysioNet 凭据受限数据库 cardiowave-portable v1.0.0(DOI 10.13026/yasp-vq73);哈尔滨工业大学经济与管理学院团队采集于 2026 年中国黑龙江嫩江三级医院发布时间: 2026-10-10最后更新: 2026-10-20 阅读 84
CardioWave-Portable — 便携式 ECG+PPG 无袖带血压估计数据集

信息速览

数据集名称CardioWave-Portable — 便携式 ECG+PPG 无袖带血压估计数据集
数据类型原始数据,波形数据,人工标注
规模977 名成人受试者(女 664 / 男 302 / 缺失 11;年龄均值 48.27 岁、SD 15.79、范围 18–90+);3,849 条波形记录
接入方式PhysioNet 凭据受限数据库 cardiowave-portable v1.0.0(DOI 10.13026/yasp-vq73);哈尔滨工业大学经济与管理学院团队采集于 2026 年中国黑龙江嫩江三级医院
AI 就绪度

INFOBOX — CardioWave-Portable 一屏速览

维度 内容
本质 PhysioNet 上凭据受限的便携设备同步 ECG+PPG 无袖带血压估计数据集
团队 哈尔滨工业大学经济与管理学院(6 作者;Xitong Guo 兼四川大学华西第二医院)
平台 PhysioNet(RRID:SCR_007345),v1.0.0,2026-09-30 发布
DOI 10.13026/yasp-vq73
采集 2026 年,中国黑龙江嫩江一家三级医院;伦理批号 2026-12(2026-04-07)
设备 ChoiceMed MD100S 卡片式;1 导联 ECG + 1 导联 PPG,均 500 Hz;蓝(b)/金(g) 两版
规模 3,849 条记录 / 977 名成人(内部源 4,228 条 / 1,057 人漏斗而来)
波形 每条 2 通道 × 32-bit × 12,000 样本 = 24 秒;WFDB;16 分片
标签 袖带 OMRON OML-HEM-1026 测 SBP/DBP;ECG/PPG 质量标签各 0–3
人口学 女 664/男 302/缺 11;年龄均值 48.27 岁;高血压 265/694/缺 18
血压 SBP 均值 119.86 mmHg;DBP 均值 73.22 mmHg
访问 Credentialed Access(CITI 培训 + DUA 1.5.0,无公开直链)
许可 PhysioNet Credentialed Health Data License 1.5.0
库内互链 ppg-dalia(202)、butppg(803)、bidmc-ppg(74)、apnea-ecg(658)、mimic-iv-ecg(172)

CardioWave-Portable 是一个"把袖带换成卡片"的数据集工程:977 名成人每人坐在桌前休息十分钟、手臂抬到心脏水平,然后用一枚卡片大小的设备同时记录单导联心电(ECG)与光电容积脉搏波(PPG),紧接着用标准袖带血压计测量参考血压。这些成对的"波形—血压"记录,正是训练"无袖带血压估计"(cuffless blood pressure estimation)模型所需要的原料——用可穿戴信号推断血压,从而摆脱袖带充放气的不适与不连续性。它的分量不在于规模(3,849 条记录在生理信号数据集里并不算大),而在于三种模态的严格同步:ECG 提供心脏电活动的时序参照,PPG 提供外周脉搏波的形态信息,袖带提供金标准血压标签,三者一一配对,且附体检问卷与信号质量标注。

导语读法三则:

  1. 只想判断能不能用:直奔 §6 获取与许可——这是凭据受限数据集,先确认你有 PhysioNet 凭据与 CITI 培训再谈数据可用性。
  2. 关心 ECG+PPG 或血压建模:直奔 §2 数据构成与规格与 §4 无袖带血压估计任务——波形格式、标定陷阱、受试者级划分纪律都在那里。
  3. 要做数据集对比或互链:直奔 §9 与库内条目 ppg-dalia / butppg / bidmc-ppg / apnea-ecg 的辨析——本条是库内首个"ECG+PPG 双模态配对 + 袖带 BP"条目。

§0 导读:这个数据集解决什么问题

高血压是"隐形杀手":绝大多数患者没有症状,只能靠测量发现。而传统袖带血压计有三个根深蒂固的痛点——间断性(一次一个读数,无法捕捉夜间或情绪波动时的血压)、依赖袖带(充放气不适,夜间测量会惊醒睡眠)、操作依赖性(测量姿势、袖带松紧、手臂高度都会引入误差)。无袖带血压估计(cuffless blood pressure estimation)的思路是:用可穿戴设备已能连续采集的生理信号(PPG、ECG)反推血压,把"间断的袖带读数"变成"连续的波形流",让血压像心率一样常态化监测。

这条路的技术前提是数据:要训练模型从波形推断血压,就必须有同时包含"波形"与"金标准血压标签"的记录,且波形的采集条件、参考血压测量流程、信号质量、受试者分组都必须清清楚楚。CardioWave-Portable 正是为这个前提而生的数据集——它用一枚便携卡片式设备同时采集 ECG 与 PPG,用标准袖带血压计提供参考标签,并额外提供信号质量标注与问卷元数据。

为什么是 ECG + PPG 双模态? 单靠 PPG 推断血压,模型看到的是脉搏波波形与脉搏传导时间的一部分信息;但要精确估计血压,往往需要脉搏传导时间(PTT)或脉搏到达时间(PAT)这类指标——它们需要 ECG 提供的 R 峰作为"起点",PPG 提供脉搏波到达作为"终点"。ECG 为 PPG 提供时序参照,两者的同步配对让 PTT/PAT 的计算成为可能,这是单模态 PPG 数据集给不了的能力。CardioWave-Portable 的核心价值,就在于把这两条波形与血压标签对齐在同一时间轴上。

§0 读法三则:

  1. 这个条目是"数据集 + 采集协议 + 评测纪律"三合一:波形本体(§2)、采集与构建流程(§3)、以及页面反复强调的 participant-level 划分与标定陷阱(§4、§7)。
  2. 全文规模数字均出自 PhysioNet 内容页的摘要与 Methods 节;"4,228 → 3,849"的构建漏斗与本条对数据体量的估算已分别在 §2.6、§8.4 与 FACTS §9 存照。
  3. 检索时若把"CardioWave"当作已有数据集名去搜可能一无所获——PhysioNet slug 是 cardiowave-portable(带 -portable 后缀),且与库里已有的胸片心大条目 cxr-cardiomegaly 无任何关系(坑 1)。

§1 数据集速览:十问十答

Q1:CardioWave-Portable 是什么?一句话讲清。
一个托管在 PhysioNet 上的生理信号数据集:977 名成人、3,849 条记录,每条记录是一段 24 秒的同步单导联 ECG 与 PPG 波形,并配上一次袖带血压测量的收缩压/舒张压标签。用途是无袖带血压估计及其相关研究。

Q2:谁做的?在哪?
哈尔滨工业大学(Harbin Institute of Technology)经济与管理学院团队,6 位作者:Hailin Yang、Lexi Zhang、Hongyu Liu、Chao Wang、Zhenzhen Xie、Xitong Guo。数据采集于 2026 年,现场是中国黑龙江省嫩江一家三级医院,通过社区筛查与院内招募。研究经哈工大经济与管理学院伦理审查委员会批准(批号 2026-12,批准日 2026-04-07)。

Q3:规模到底多大?
最终释放 3,849 条记录、977 名成人受试者。这不是一次性采集到这个数字——内部源库原有 4,228 条记录、1,057 名受试者,经过文件与标签匹配(→3,915 条/980 人)、去重(排除 58 条→3,857 条/979 人)、重提交质控剔除 2 名 <18 岁受试者的 8 条记录(→3,849 条/977 人)后得到。整个漏斗在 §2.6 展开。

Q4:波形长什么样、什么格式?
每条记录含两个同步通道:单导联 ECG 与 PPG,采样率 500 Hz,释放 12,000 样本 = 24 秒。格式为 WFDB 标准(一个 .hea 头文件 + 一个 .dat 二进制信号文件)。存储值是 signed 32-bit 原始设备数字样本,未经标定、未重采样、未滤波。

Q5:血压标签怎么测的?
用 OMRON OML-HEM-1026 袖带式血压计测左臂,紧接在每次卡片设备采集之后进行。记录级统计:收缩压 SBP 均值 119.86 mmHg(SD 21.28,范围 68–210),舒张压 DBP 均值 73.22 mmHg(SD 13.10,范围 40–140)。袖带充放气发生在释放的 ECG/PPG 片段之外,因此波形段内不含袖带伪影。

Q6:有什么额外标注和元数据?
两层:记录级元数据(metadata/records.csv)含袖带 SBP/DBP、卡片类型(b/g)、源片段索引、ECG 与 PPG 质量标签(各 0–3);受试者级元数据(subject-info.csv)含问卷派生的人口学、体格测量、高血压与用药、生活方式与测前变量。

Q7:信号质量标签是什么意思?
每条原始记录针对 ECG 与 PPG 分别在三个重叠窗(样本 0–4,999、4,000–8,999、8,000–12,999)人工复核,每窗标 acceptable 或 poor。释放的质量标签 = poor 窗的数量,取值 0–3。注意:记录不因质量标签被剔除——0 分代表三段都合格,3 分代表三段都不合格,是否过滤由使用者自行决定。

Q8:怎么获取?要钱吗?
不要钱,但要资质。这是 Credentialed Access(凭据受限访问)数据集:你需要在 PhysioNet 注册并完成身份核验、完成 CITI「Data or Specimens Only Research」培训、签署 PhysioNet Credentialed Health Data Use Agreement 1.5.0,才能下载完整文件。没有匿名公开直链。

Q9:为什么受限?
PhysioNet 页面明确:数据含人体生理信号与健康相关间接标识符(health-related indirect identifiers),因此完整数据文件须走凭据受限访问而非匿名下载。页面同时说明释放版已做时间隐私处理——不含记录级日期/时间/年份、出生日期、原始文件名、工作人员标识、原始受试者标识,WFDB 头也无 base date/base time。

Q10:最需要注意的坑是什么?
如果做机器学习,最容易被忽略的是 participant leakage(受试者泄漏):同一受试者提供多条记录,随机按"记录"划分训练/测试集会把同一个人的记录同时放进两边,让评测分数虚高。页面反复强调:同一受试者的记录必须留在同一划分。

§2 数据构成与规格

2.1 规模、来源与受试者构成

CardioWave-Portable 的最终释放包含 3,849 条波形记录,来自 977 名成人受试者。全部数据于 2026 年在中国黑龙江省嫩江一家三级医院采集,招募方式为社区筛查与院内招募相结合。研究纳入的人群覆盖三类:未报告高血压诊断的成人、已诊断高血压的成人、以及报告正在服用血压相关药物的成人——这一设计使数据集同时包含正常血压、高血压与用药人群,为血压估计模型的泛化性研究提供了内在的分布多样性。

受试者级人口学(n=977):

变量 统计 数值
性别 女 / 男 / 缺失 664 / 302 / 11
年龄 均值 ± SD 48.27 ± 15.79 岁
年龄 范围 18 – 90+ 岁(≥90 顶编码为 “90+”)
身高 n / 均值 ± SD / 范围 961 / 164.13 ± 8.11 cm / 130–195 cm
体重 n / 均值 ± SD / 范围 955 / 66.56 ± 13.60 kg / 36–168 kg
高血压诊断 有 / 无 / 缺失 265 / 694 / 18
降压药使用 有 / 无 / 缺失 224 / 739 / 14

注意性别分布的显著不均衡(女 664 vs 男 302,约 2.2:1)与年龄的顶编码处理(≥90 统一记为 90+)——这两点在做人群泛化分析时都必须纳入考量。

2.2 波形规格

每条记录的物理与逻辑规格如下:

  • 通道数:2(同步单导联 ECG + 单导联 PPG)
  • 采样率:500 Hz(两通道一致)
  • 样本数:12,000 样本/通道
  • 时长:24 秒
  • 位深:signed 32-bit 数字样本
  • 格式:WFDB(每记录 1 个 .hea 头文件 + 1 个 .dat 二进制信号文件)

释放片段是从原始约 30 秒采集(约 15,000 样本/通道)中截取而来:保留原始零基索引 [1000, 13000) 区间,即样本 1,000 到 12,999,共 12,000 样本,恰好对应 500 Hz 下的 24 秒。这一截取在协议上是有意的——它避开了采集起始阶段可能的不稳定与袖带充放气时段。

2.3 标定与显示:一个必须理解的陷阱

CardioWave-Portable 存储的波形值是原始设备数字样本,页面明确说明:未做物理幅度标定、未重采样、未做基线去除/带通/低通滤波。更要命的是——厂商的物理幅度换算因子不可得(Manufacturer conversion factors to calibrated physical amplitudes were unavailable)。这意味着你拿到的 waveform 是"数字计数",而不是"毫伏"或"任意标定单位"。

为了让波形至少能在软件里正常显示,WFDB 头文件提供了一套归一化的显示视图:

  • ECG 固定增益:1,000 digital counts / normalized unit
  • PPG 固定增益:12,000 digital counts / normalized unit
  • 每记录每通道使用四舍五入的数字中位数作为显示基线

页面强调:这些头文件值只影响归一化显示视图,不改变 .dat 里存储的 signed 32-bit 数字样本。需要精确设备值的用户应以 digital mode 读取 WFDB 记录(不应用头文件增益)。这一点在做跨设备或跨研究的幅度比较时是硬约束——因为不同设备家族甚至同设备不同硬件版本(蓝 b / 金 g)的数字计数物理含义可能不同。

2.4 血压标签

参考血压由 OMRON OML-HEM-1026 袖带式血压计测量左臂,测得时机是紧接在每次卡片设备采集之后。因此波形段与血压标签的时间间隔极短,两者可视为同一生理状态下的配对观测。记录级血压统计:

指标 均值 SD 范围
收缩压 SBP 119.86 mmHg 21.28 mmHg 68 – 210 mmHg
舒张压 DBP 73.22 mmHg 13.10 mmHg 40 – 140 mmHg

袖带充放气发生在释放的 ECG/PPG 片段之外——这是波形片段裁取的重要考量,避免了袖带加压对上肢血流与脉搏波的影响污染波形。SBP 范围跨 68–210 mmHg,涵盖了低血压到重度高血压的宽广区间,为血压回归任务提供了足够的目标值动态范围。

2.5 信号质量标注

每条原始记录的 ECG 与 PPG 分别经过人工复核,复核方式是把记录切成三个重叠窗:

  • 窗 1:样本 0 – 4,999
  • 窗 2:样本 4,000 – 8,999
  • 窗 3:样本 8,000 – 12,999

每个窗按波形完整性、节律规整性、基线漂移、严重噪声、可用性五项标准判定为 acceptable(可接受) 或 poor(差)。释放的 ECG/PPG 质量标签 = 该记录中 poor 窗的数量,取值 0–3。记录不因质量标签被剔除——这是设计选择而非缺失:页面把是否过滤质量差的记录留给使用者(对应"signal-quality-aware modelling"这一支持方向)。

2.6 构建漏斗:4,228 → 3,849

最终释放的 3,849 条记录不是原始采集量,而是经过多级质控后的结果。完整的构建漏斗如下:

  1. 内部源库:4,228 条原始记录 / 1,057 名受试者
  2. 文件与标签匹配 + 基础元数据检查:保留 3,915 条 / 980 名
  3. 重复源移除(duplicate-source removal):排除 58 条 → 3,857 条 / 979 名
  4. 重提交质控(resubmission QC):剔除 2 名 <18 岁受试者的 8 条记录 → 3,849 条 / 977 名

此外,质控阶段还做了两类修正:5 个不合理的体高值依据保留的问卷录入与复核材料修正;跨重复记录中不一致的性别与年龄值,统一协调为同一会话源录入或复核材料中的唯一非缺失值。完整的转换规则、排除标准、质控流程与合理性检查记录在数据集的 CLEANING_AND_FILTERING.md 文件中。

2.7 文件组织

数据的文件组织如下:

  • 波形:分 16 个编号上传分片,命名 part-0001 至 part-0016;前 15 个分片各不超过 500 个文件,part-0016 存放剩余记录。分片仅为组织用途,与受试者分组无关。
  • RECORDS:列出所有 WFDB 记录路径(不含扩展名)。
  • metadata/records.csv:把每条波形记录关联到其受试者、袖带 SBP/DBP、卡片类型(b/g)、固定源片段索引、ECG 与 PPG 质量标签。
  • subject-info.csv:每名受试者一行,含问卷派生的人口学、体格测量、高血压相关、用药、生活方式与测前变量。
  • DATA_DICTIONARY.csv:定义每个字段的名称、数据类型、单位或编码、缺失值表示与描述。
  • CALIBRATION:提供推荐的绘图尺度。
  • 辅助文件:README.md、CLEANING_AND_FILTERING.md、PRIVACY.md、ACCESS.md、REFERENCES.md,以及 examples/ 目录下的 WFDB 加载示例脚本与验证报告。

关键关联逻辑:记录级与受试者级通过 subject_id 关联——metadata/records.csv 中的 subject_id 字段就是这一关联的桥梁。凡涉及受试者级划分或统计的研究,都必须先用该字段把记录归组到人。

§3 采集与构建流程

3.1 设备:ChoiceMed MD100S 卡片式采集器

采集硬件是 ChoiceMed MD100S 便携卡片式设备(portable card-type device)。它同时输出:

  • 1 个单导联 ECG 通道
  • 1 个 PPG 通道

两通道均以 500 Hz 采样。一次原始采集持续约 30 秒,每通道约 15,000 样本(约 30 秒 × 500 Hz)。

值得关注的是,数据集使用了同一设备家族的两个涂层硬件版本:蓝色(编码 b)与金色(编码 g)。协议要求每名受试者做 2 次蓝色卡 + 2 次金色卡测量。这一设计暗示研究者有意考察设备版本间的系统性差异——虽然摘要未给出释放记录的实际 b/g 配比(见坑 4)。

3.2 标准化采集协议

采集遵循一套标准化流程(标准化采集协议,standardized acquisition protocol):

  1. 知情同意:受试者签署知情同意书。
  2. 问卷:完成一份问卷(问卷派生出 subject-info.csv 中的元数据)。
  3. 静息:采集前受试者端坐,休息约 10 分钟。
  4. 体位:手臂维持约在心脏水平高度。
  5. 波形采集:使用卡片设备采集 ECG + PPG(约 30 秒)。
  6. 参考血压:卡片采集后立即用 OMRON OML-HEM-1026 测左臂血压。

"静息 10 分钟 + 手臂心脏水平"这两条不是形式主义——血压对体位与情绪极度敏感,任何偏差都会直接进入标签,成为模型无法从波形中复原的噪声。

3.3 伦理与合规

采集与协议经哈尔滨工业大学经济与管理学院伦理审查委员会(其 Ethics Committee / IRB)批准,批号 2026-12,批准日 2026-04-07。全部参与者在参与前提供书面知情同意,同意范围覆盖"参与研究"与"去标识化数据用于研究目的"。释放数据库中不含姓名、联系方式、地址、身份号码、面部图像等直接个人标识符。

3.4 时间隐私保护

释放版对时间信息做了系统性剔除:不含记录级采集日期/时间/年份、出生日期、原始文件名、研究工作人员标识、原始受试者标识。WFDB 头文件不含 base date 或 base time。页面特别说明:“2026” 这一年份仅描述整体研究期,不与任何个体记录绑定。这一设计使记录无法通过时间戳被回溯定位到具体受试者或采集时刻。

3.5 数据不变量(供复现核对)

若你要复现或核验这份数据,可用以下不变量做自检:

  • 每记录样本数 = 12,000(= 24 秒 × 500 Hz)
  • 通道数 = 2(ECG + PPG)
  • 位深 = signed 32-bit
  • 质量标签取值 ∈
  • 记录级 BP 标签范围:SBP ∈ [68, 210],DBP ∈ [40, 140](按释放统计)
  • 记录数 = 3,849,唯一受试者数 = 977
  • 分片数 = 16(part-0001 … part-0016)

§4 任务与建模:无袖带血压估计

4.1 核心任务定义

CardioWave-Portable 的目标任务是无袖带血压估计(cuffless blood pressure estimation):给定一段同步的 ECG + PPG 波形(24 秒),预测该时刻的收缩压 SBP 与舒张压 DBP。这是一个连续值回归任务,而非分类任务;评价指标通常是 MAE / RMSE,且需同时报告 SBP 与 DBP 两条曲线。

除了核心回归任务,页面列出数据集支持的研究方向包括:波形分析(waveform analysis)、信号质量感知建模(quality-aware modelling)、元数据辅助预测(metadata-assisted prediction)、受试者级评测(participant-level evaluation)、以及精心设计的标定研究(calibration studies)。

4.2 为什么 ECG + PPG 配对是关键

无袖带血压估计的两大主流信号特征都依赖 ECG 与 PPG 的配对:

  • 脉搏传导时间(PTT, Pulse Transit Time):ECG 的 R 峰(心脏射血起点)到同一心动周期 PPG 脉搏波某特征点(如脚点 foot)的时间差。PTT 与血压呈负相关——血压升高时脉搏波传导更快,PTT 缩短。
  • 脉搏到达时间(PAT, Pulse Arrival Time):ECG R 峰到 PPG 波峰的更粗略时间差,实现更简单,但与血压的关系比 PTT 更受心室射血期(pre-ejection period)变化干扰。

两者都需要 ECG 提供的时序参照 + PPG 提供的脉搏波形态。若只有 PPG,模型无法得到 PTT/PAT;若只有 ECG,也无法得到外周脉搏动力学。CardioWave-Portable 把两者在同一时间轴上同步采样,正是为这类特征工程与端到端深度模型同时提供原料。

4.3 建模的三个层次

用这份数据建模,常见有三条路径,各有对应难点:

层次一:传统特征工程 + 浅层回归。
从 ECG 提 R 峰、从 PPG 提脚点/波峰/波谷与形态特征,计算 PTT/PAT 及波形形态指标,喂给线性回归/随机森林/SVR。优点是可解释,缺点是依赖精确的特征点检测——而标定缺失(§2.3)使部分幅度类特征不可用。

层次二:端到端深度学习。
直接把 24 秒双通道波形(或切 patch)喂给 CNN/LSTM/Transformer 做回归。优点是无需手工特征,缺点是数据规模(977 人)对深度模型偏小,极易过拟合,且必须严防 participant leakage(§4.4)。

层次三:信号质量感知建模。
把 ECG/PPG 质量标签(0–3)作为辅助输入或样本筛选依据,研究"低质量波形下模型的性能衰减"。这是 CardioWave-Portable 相对许多同类数据集的一个特色维度。

4.4 participant leakage:本数据集的第一号纪律

页面用了相当篇幅强调一个评测陷阱——participant leakage(受试者泄漏):

同一受试者的重复记录必须留在同一数据划分。随机按记录级划分会把同一人的记录同时放进训练集与评测集,导致因受试者泄漏而产生过度乐观的性能估计。

为什么会这样?因为每名受试者贡献了多条记录(协议要求 2 蓝 + 2 金,即最多 4 条),这些记录来自同一个人、同一场次、近乎同一生理状态,血压值高度相关。若把它们随机分到训练与测试两侧,测试集里出现的几乎就是训练集中已经见过的"同一人的血压",模型等于在认人而非学血压。正确的做法是按 subject_id 分组划分(GroupKFold 或按受试者整体划分)——页面甚至建议使用者在报告中明确说明其"受试者级数据划分方法"。

4.5 标定与泛化:页面反复警示的两条限制

页面在"当前证据"部分点明无袖带血压估计的四类方法学与临床限制,直接映射到本数据集的建模注意:

  1. 标定依赖(calibration dependence):多数无袖带方法需要个体的初始血压校准,未标定的绝对血压估计误差显著更大。数据集支持"calibration studies",但使用者须明确定义标定协议。
  2. 评估设计(evaluation design):划分方式、指标口径、是否做受试者级聚合,都会显著影响结论。
  3. 人群泛化性(population generalizability):本数据集单一中心(嫩江三级医院)、性别不均衡(2.2:1)、年龄有顶编码,跨人群泛化需谨慎。
  4. 技术预测性能 vs 临床验证:页面明确区分两者——一个在测试集上 MAE 小的模型,不等于临床可用的血压计。

§5 方法与评测框架

5.1 数据加载(WFDB)

波形以 WFDB 格式存储,标准加载方式使用 wfdb Python 包。注意两点纪律:(1) 若需要精确设备数字值,用 digital mode 读取(physical=False 或等价接口),不要应用头文件的归一化增益;(2) 记录路径在 RECORDS 文件中,无扩展名,分片在 part-0001~part-0016 目录。

# 加载示例(概念伪码,非官方脚本——官方示例在 examples/ 目录)
import wfdb

# 读一条记录:header + signal(digital 模式保留原始 32-bit 计数)
rec = wfdb.rdrecord(
    record_name="part-0001/<record_id>",
    pn_dir=None,          # 本地已下载路径
    physical=False,       # 保留原始数字计数(未标定)
)
# rec.d_signal 形状约为 (12000, 2):[:,0]=ECG, [:,1]=PPG
# 若要看归一化显示,用 physical=True 应用头文件增益(ECG 1/1000, PPG 1/12000)

重要提醒:官方 examples/ 目录下有一个 WFDB 加载示例脚本,实际使用应以该脚本为准;上面的伪码仅说明读取逻辑,不保证与官方接口完全一致。

5.2 元数据关联与划分

import pandas as pd

records = pd.read_csv("metadata/records.csv")   # 记录级:subject_id, SBP, DBP, card_type, quality...
subject = pd.read_csv("subject-info.csv")        # 受试者级:人口学/体格/高血压等

df = records.merge(subject, on="subject_id", how="left")

# 正确的划分:按 subject_id 分组,同一人记录不跨集
from sklearn.model_selection import GroupKFold
gkf = GroupKFold(n_splits=5)
for train_idx, test_idx in gkf.split(df, groups=df["subject_id"]):
    ...  # 错误做法:train_test_split(df) 会随机切记录,导致 participant leakage

5.3 推荐评测协议(综合页面建议)

结合页面强调的要点,一个可复现的评测应至少包含:

  1. 受试者级划分:GroupKFold / 按 subject_id 整体划分,杜绝 participant leakage。
  2. 信号质量分层报告:按 ECG/PPG 质量标签(0–3)分层报告性能,或显式做质量过滤,并说明口径。
  3. 标定协议说明:若做个体标定,明确用多少参考测量、如何选择标定样本。
  4. 完整披露:报告中写明额外过滤、归一化、缺失值处理、队列限制、标定流程与划分方法(页面原文要求)。
  5. 不主张临床等效:结论限定在"技术预测性能"层面,不宣称与经验证袖带设备等效。

5.4 官方是否提供基准划分?

没有。页面未附带 leaderboard、固定 benchmark 划分或官方基线模型。CardioWave-Portable 的定位是"支持可复现基准的底层数据资源"——它提供高质量、规格清晰、纪律明确的原料,把划分设计与基线构建留给社区。这也意味着跨论文的性能数字无法直接横向比较,除非双方公开了完全一致的划分协议与标定流程。

5.5 与既有无袖带血压数据集的对照维度

评估一份无袖带血压数据集,通常看五个维度:(1)模态(PPG 单模态 / ECG+PPG 双模态)、(2)参考标签(袖带 / 动脉线 / 指套)、(3)场景(ICU / 手术 / 社区筛查)、(4)样本量与人群、(5)可获取性。CardioWave-Portable 的定位是:双模态 + 袖带标签 + 社区筛查场景 + 中等人群 + 凭据受限。它与 ICU 类血压数据集(如含动脉线的 MIMIC 系)在场景与标签精度上互补,与 PPG 单模态血压数据集(如 ppg-dalia)在模态完整性上互补。

§6 获取与许可:凭据受限访问的正确姿势

6.1 三层许可结构

CardioWave-Portable 的许可体系相对单一(不像某些数据集分层异构),但门槛明确:

资产 许可 / 权限 获取方式
完整数据文件(波形 + 元数据) PhysioNet Credentialed Health Data License 1.5.0 凭据受限访问
数据使用协议 PhysioNet Credentialed Health Data Use Agreement 1.5.0 签署
必要培训 CITI「Data or Specimens Only Research」 完成后提交证明
数据集页面 / 摘要 公开可读 https://physionet.org/content/cardiowave-portable/

6.2 获取流程(Credentialed Access)

要拿到完整数据,你需要依次完成:

  1. 注册 PhysioNet 账号并申请完成身份核验(credentialing)——通常需提供机构隶属与身份证明。
  2. 完成 CITI「Data or Specimens Only Research」培训并取得结业证明。
  3. 签署 PhysioNet Credentialed Health Data Use Agreement 1.5.0。
  4. 在数据集页面提交访问申请,经审核后获得下载权限。
  5. 下载后按 DUA 约束使用——不得试图识别或联系受试者、不得与外部个人信息链接、不得向未授权者转发受控文件、不得超出批准用途使用。

6.3 为什么受限:健康间接标识符

PhysioNet 页面给出的理由是:数据含人体生理信号与健康相关间接标识符(health-related indirect identifiers)。生理波形本身具有潜在的生物特征可识别性(类似指纹),配合人群学元数据可能增加再识别风险,因此不能走匿名公开下载。作为补偿性保护,释放版做了严格的时间隐私剔除(§3.4)。

6.4 AI-Ready 视角的可复现性评估

从 AI-Ready(面向 AI 训练的可用性)视角,CardioWave-Portable 的可复现性入口偏保守:

  • 优点:规格文档齐全(README / DATA_DICTIONARY / CLEANING_AND_FILTERING / PRIVACY / ACCESS / CALIBRATION 全备),设备、协议、伦理、构建漏斗全部公开,评测纪律(受试者级划分、标定披露)写得比多数数据集清楚。
  • 缺点:无公开直链、需凭据与培训、无官方划分与基线,意味着"从看到条目到跑通第一个基线"的路径比开放数据集长得多。

这种"规格透明、访问受限"的组合,是医疗生理信号数据集在隐私合规压力下的典型折中——它把可复现性的负担前置到"获取资质",而非后置到"文档缺失"。

§7 局限与风险

7.1 数据本身的局限

  1. 单一中心:全部数据来自中国黑龙江嫩江一家三级医院,队列以社区筛查 + 院内招募为主,跨地区、跨种族、跨医疗体系泛化性未知。页面自身把 population generalizability 列为核心限制。
  2. 性别不均衡:女 664 vs 男 302(约 2.2:1),性别相关的血压/波形差异可能被数据分布放大。
  3. 年龄顶编码:≥90 岁统一记为 90+,年龄变量的高阶信息丢失。
  4. 规模有限:977 人 / 3,849 条记录,对深度模型训练而言偏小,过拟合风险高。
  5. 标定缺失:厂商物理幅度换算因子不可得,波形为未标定数字计数,跨设备/跨版本幅度不可比较(§2.3)。
  6. 质量未过滤:质量标签仅标注未剔除,含 0–3 poor 窗记录。

7.2 设备相关风险

  1. 两种硬件版本:蓝色(b)与金色(g)两个涂层版本可能有系统性的信号差异。协议计划每受试者各测 2 次,但释放记录的 b/g 实际配比未在摘要披露——若做跨版本比较需先在元数据中核实(见坑 4)。
  2. 卡片式设备的信号质量:便携消费级设备的信号质量通常不如临床级采集系统,这也是质量标签存在的原因;低质量记录的占比需使用者自行从数据集统计。

7.3 临床与法律风险

  1. 不主张临床等效:页面明确"does not establish clinical equivalence to validated cuff-based devices"——任何基于本数据集的模型都不得被表述为临床可用的血压计,除非另行完成独立的临床验证。
  2. 技术性能 ≠ 临床价值:页面区分"technical prediction performance"与"clinical validation",MAE 小不等于临床可用。
  3. 标定依赖:无个体标定的绝对血压估计误差通常显著更大,模型的实际部署价值取决于标定方案。

7.4 使用纪律

  1. 禁再识别:不得试图识别或联系受试者、不得与外部个人信息链接。
  2. 禁再分发:不得把受控文件转发给未授权者。
  3. 引用义务:发表物与衍生物应引用数据集本体,并在配套 Data Descriptor 可用时引用它。

§8 避坑清单:八个必须记住的坑

坑 1:slug 是 cardiowave-portable,不是 cardiowave。
该数据集在 PhysioNet 的 URL 标识带 -portable 后缀。检索时若只用 “CardioWave” 可能指向别处或一无所获;本库内的 cxr-cardiomegaly(rid 606,胸片心大)与本数据集毫无关系,切勿因名称含 “cardio” 而混为一谈。

坑 2:这是凭据受限数据集,不是匿名公开下载。
需要 PhysioNet credentialing + CITI「Data or Specimens Only Research」培训 + 签署 DUA 1.5.0。看到条目页面能打开,别误以为数据文件能直接 curl——页面头标注 Database Credentialed Access。

坑 3:波形没标定,别当物理幅度用。
存储值是 signed 32-bit 原始设备数字计数,未做物理标定、未重采样、未滤波,厂商换算因子不可得。WFDB 头里的增益(ECG 1,000、PPG 12,000 counts/unit)只用于显示,不改变存储数字。若要精确设备值,用 digital mode 读取。

坑 4:蓝卡(b)与金卡(g)两版,配比未在摘要披露。
协议要求每受试者 2 蓝 + 2 金,但释放记录的实际 b/g 配比未在页面摘要给出。做跨硬件版本分析前,必须先从 metadata/records.csv 的 card_type 字段自行统计——不要想当然假设均衡。

坑 5:participant leakage 是本数据集的头号评测陷阱。
每受试者贡献多条记录(最多 4 条),且同一人记录血压高度相关。随机按记录划分训练/测试集会让同一人的记录跨集,产生过度乐观的性能。必须按 subject_id 分组划分。页面反复强调此事。

坑 6:质量标签是"poor 窗数量",且记录未按质量剔除。
ECG/PPG 质量标签各取值 0–3,含义是三个重叠窗中判为 poor 的窗数——不是"质量分级"的直觉序列。低分好、高分差;但所有记录都在,是否过滤由你决定并须在报告中说明。

坑 7:没有官方 benchmark 划分或 leaderboard。
页面不提供固定划分、基线模型或排行榜。跨论文的性能数字不可直接横向比较,除非双方公开完全一致的划分协议、标定流程与质量过滤口径。

坑 8:这是研究数据集,不得主张临床等效。
页面明确其不建立与经验证袖带设备的临床等效性。任何模型结论须限定在技术预测性能层面,并注意 calibration dependence 与 population generalizability 两大限制。

DAIMS 数据可获取性评估

按 DAIMS / FAIR 视角对 CardioWave-Portable 的评估:

维度 评级 说明
Findable(可发现) 高 PhysioNet 稳定托管,DOI 10.13026/yasp-vq73,RRID:SCR_007345,页面引文格式齐全
Accessible(可访问) 中 凭据受限(Credentialed Access),流程明确但需培训 + DUA,无匿名直链
Interoperable(可互操作) 高 标准 WFDB 格式 + CSV 元数据 + DATA_DICTIONARY,通用工具可直接读取
Reusable(可复用) 中高 文档极其齐全(含 CLEANING_AND_FILTERING/PRIVACY/ACCESS/CALIBRATION),但无标定与无官方划分降低直接复用度
Provenance(来源可溯) 高 设备、协议、伦理批号、构建漏斗(4,228→3,849)全部公开
Licensing(许可清晰度) 高 单一明确许可(PhysioNet Credentialed Health Data License 1.5.0)+ DUA 1.5.0

§9 与库内条目的关系

9.1 家族图谱

  • ppg-dalia (rid 202):PPG 单模态血压/活动数据集。核心辨析:DaLiA 以腕表式 PPG 为主、面向日常活动场景;CardioWave-Portable 以卡片机同步 ECG+PPG 为主、面向静息社区筛查场景。前者给你"真实生活里的 PPG",后者给你"能算 PTT 的配对波形"——两者在模态完整度上互补。
  • butppg (rid 803):PPG 血压数据集。核心辨析:若其为 PPG 单模态口径,则与本条的核心差异仍是"是否提供 ECG 时序参照"。做无袖带血压综述时,两者应作为"单模态 vs 双模态"的对照并列。
  • bidmc-ppg (rid 74):BIDMC 生理信号集(含 PPG),BIDMC 系列源自重症/手术场景。核心辨析:ICU 场景、动脉/临床级参考;本条为社区筛查 + 袖带参考,场景与人群完全不同。
  • mimic-iii-ext-ppg (rid 928):MIMIC-III 派生的 PPG 扩展。核心辨析:ICU 回顾性队列、规模大但场景单一;本条为前瞻采集、场景偏社区、文档细化程度高。
  • mimic-iv-waveform (rid 65):ICU 多模态波形(含 ECG/PPG)。核心辨析:ICU 高密度监护波形;本条为便携设备单导联 + 单 PPG,设备与场景均不同。
  • apnea-ecg (rid 658):ECG 单模态(呼吸暂停)。核心辨析:ECG-only、无 PPG、无血压标签;本条为 ECG+PPG 配对 + BP 标签。两者唯一共性是"含 ECG"。
  • mimic-iv-ecg (rid 172) / leipzig-heart-center-ecg (rid 910) / openecg (rid 802) / ecg-image-database (rid 959):均为 ECG 单模态条目。核心辨析:ecg-image-database(rid 959)是图像化 ECG,与波形数据集在数据形态上完全不同;其余为波形 ECG 单模态。本条的价值在于把 ECG 与 PPG 配成对。
  • mimic-iv-ext-ecg-glucose (rid 998):ECG + 血糖配对。核心辨析:配对模态不同(血糖 vs 血压)——这是"ECG 与其他模态配对"的另一方向,与本条的"ECG+PPG→BP"形成配对模态的对照。

9.2 检索路径建议

  • 精确检索:cardiowave-portable(PhysioNet slug)+ 10.13026/yasp-vq73(DOI)。勿单用 “CardioWave”。
  • 若要直接可用数据:先确认 PhysioNet 凭据与 CITI 培训——这是本节最实际的"入口成本"。
  • 若做无袖带血压综述:用"ECG+PPG 双模态 + 袖带参考 + 社区场景"三个标签定位本条目,与 ppg-dalia / butppg(单模态)及 MIMIC 系(ICU 场景)对照。
  • 若做互链建设:本条可与 §9.1 全部条目做"模态配对方向"的交叉互链。

§10 建议互链点与检索卫生

10.1 建议互链点(库内条目 + rid)

库内条目 rid 互链理由
ppg-dalia 202 PPG 血压系,单模态对照
butppg 803 PPG 血压系,单模态对照
bidmc-ppg 74 PPG 生理信号,ICU 场景对照
mimic-iii-ext-ppg 928 PPG 扩展,ICU 场景对照
mimic-iv-waveform 65 多模态 ICU 波形对照
apnea-ecg 658 ECG 单模态对照
mimic-iv-ecg 172 ECG 单模态对照
mimic-iv-ext-ecg-glucose 998 ECG+其他模态配对对照
ecg-image-database 959 ECG 图像形态对照(勿混)

10.2 检索卫生

  • 勿用 “CardioWave” 单字检索作为数据集名的唯一依据;本库 cxr-cardiomegaly(606) 含 “cardio”,与生理信号无关。
  • 勿把本条目与 MIMIC 系 PPG 条目混为一谈:MIMIC 系为 ICU 回顾性,本条为前瞻社区筛查。
  • 勿把 CVD 类条目当作同一数据:本库尚有多个心血管相关条目,务必以 slug/DOI 为准。

§11 总结

11.1 三句话总结

  1. CardioWave-Portable 用 977 名成人的 3,849 条记录证明:ECG 与 PPG 的严格同步配对可以从便携卡片机低成本获得,打通无袖带血压估计(尤其 PTT/PAT 类方法)的数据瓶颈。
  2. 它的价值不在规模而在规格透明——设备、协议、伦理、构建漏斗、质量标注、评测纪律全部公开,且明确区分技术性能与临床验证,是数据集工程诚实性的样本。
  3. 它同时是一份"凭据受限 + 无标定 + 无官方划分"的典型样本,把 AI-Ready 的复现负担前置到获取资质与自建评测协议。

11.2 适合谁

  • 无袖带血压估计研究者:需要 ECG+PPG 配对 + 袖带参考的原料。
  • 生理信号处理团队:需要标准 WFDB、双模态同步、清晰元数据的基准数据。
  • 可穿戴健康算法团队:需要社区筛查场景的便携设备真实波形。
  • 数据集工程研究者:规格透明 + 访问受限 + 诚实限制声明,是活案例。

11.3 不适合谁

  • 需要即插即用大规模数据的团队(977 人、凭据受限)。
  • 需要临床级标定幅度的项目(厂商换算因子不可得)。
  • 需要 ICU 高密度监护波形的研究(场景不符,去看 MIMIC 系)。
  • 不愿走凭据申请与培训流程的快速原型(门槛在获取)。

11.4 30 秒决策卡

你的情况 行动
要立刻跑通无袖带血压基线 先确认 PhysioNet 凭据 + CITI 培训,再申请下载
要 ECG+PPG 配对数据 本条首选;PPG 单模态另看 ppg-dalia/butppg
要 ICU 波形 看 mimic-iv-waveform / mimic-iii-ext-ppg,非本条
要做受试者级评测 §4.4 + §5.2 的 GroupKFold 骨架直接用
要引用本数据集 引 Yang et al. (2026), PhysioNet, doi:10.13026/yasp-vq73
要评 AI-Ready 可复现性 §6.4 + §8 DAIMS 表

FAQ(高频问答 20 问)

A. 基础认知

Q1:CardioWave-Portable 是挑战赛吗?
不是。它是 PhysioNet 上的一个托管数据集,没有比赛、没有排行榜、没有官方基线模型。

Q2:名字里的 Portable 指什么?
指采集设备是便携卡片式设备(ChoiceMed MD100S),区别于临床大型监护设备。这也是数据集相对 ICU 波形数据集的定位差异。

Q3:数据在哪个平台?
PhysioNet(RRID:SCR_007345),URL https://physionet.org/content/cardiowave-portable/,v1.0.0,2026-09-30 发布。

Q4:谁做的?
哈尔滨工业大学经济与管理学院团队:Hailin Yang、Lexi Zhang、Hongyu Liu、Chao Wang、Zhenzhen Xie、Xitong Guo。

Q5:多大?
3,849 条记录、977 名成人受试者(内部源 4,228 条 / 1,057 人经质控漏斗而来)。

B. 数据与规格

Q6:波形是什么?
同步单导联 ECG + PPG,500 Hz,12,000 样本 = 24 秒,signed 32-bit 数字样本,WFDB 格式。

Q7:血压标签怎么来的?
OMRON OML-HEM-1026 袖带式血压计,卡片采集后立即测左臂。SBP 均值 119.86 mmHg,DBP 均值 73.22 mmHg。

Q8:信号质量标签是什么?
ECG/PPG 各自由三重叠窗(0–4,999 / 4,000–8,999 / 8,000–12,999)判定 acceptable/poor,标签 = poor 窗数量(0–3)。记录未按质量剔除。

Q9:波形标定了吗?
没有。存储为原始设备数字计数,厂商物理换算因子不可得;WFDB 头增益仅用于显示(ECG 1,000、PPG 12,000 counts/unit)。

Q10:为什么有蓝卡和金卡?
同设备家族的两个涂层硬件版本(b/g),协议计划每受试者各测 2 次;释放配比未在摘要披露。

C. 获取与许可

Q11:怎么下载?
Credentialed Access:PhysioNet 凭据 + CITI「Data or Specimens Only Research」培训 + 签署 DUA 1.5.0。

Q12:要钱吗?
不要钱,但要资质与承诺遵守 DUA。

Q13:为什么受限?
数据含人体生理信号与健康相关间接标识符,不能匿名公开下载。

Q14:发布时间?
v1.0.0(Initial Release),2026-09-30。

Q15:有配套论文吗?
页面指引引用 “Data Descriptor when available”,抓取时点未见到配套数据描述论文(见遗留疑点)。

D. 建模与评测

Q16:核心任务是什么?
从 24 秒同步 ECG+PPG 回归 SBP/DBP(连续值回归)。

Q17:为什么需要 ECG+PPG 配对?
为了计算 PTT/PAT(脉搏传导/到达时间),这是血压估计的经典特征;单模态 PPG 或 ECG 都给不了。

Q18:最大的评测陷阱是什么?
participant leakage——同一受试者多条记录必须留在同一划分,否则性能估计过度乐观。

Q19:有官方划分吗?
没有。需自建受试者级划分,并在报告中披露协议。

Q20:能用于临床吗?
不能主张临床等效。页面明确其不建立与经验证袖带设备的临床等效性。

事实清单(硬事实 30 条)

  1. 官方名:CardioWave-Portable: a portable ECG and PPG dataset for cuffless blood pressure estimation
  2. PhysioNet slug:cardiowave-portable;版本 v1.0.0;发布 2026-09-30
  3. DOI:10.13026/yasp-vq73;RRID:SCR_007345
  4. 访问等级:Database Credentialed Access
  5. 许可:PhysioNet Credentialed Health Data License 1.5.0
  6. DUA:PhysioNet Credentialed Health Data Use Agreement 1.5.0
  7. 培训要求:CITI「Data or Specimens Only Research」
  8. 作者:Hailin Yang, Lexi Zhang, Hongyu Liu, Chao Wang, Zhenzhen Xie, Xitong Guo
  9. 机构:哈尔滨工业大学经济与管理学院;Xitong Guo 兼四川大学华西第二医院
  10. 采集年份:2026;现场:中国黑龙江嫩江一家三级医院
  11. 伦理批号:2026-12(批准日 2026-04-07)
  12. 最终规模:3,849 条记录 / 977 名成人
  13. 构建漏斗:4,228→3,915→3,857→3,849(受试者 1,057→980→979→977)
  14. 去重排除 58 条;质控剔除 <18 岁 2 人 8 条
  15. 设备:ChoiceMed MD100S 卡片式
  16. 通道:1 导联 ECG + 1 导联 PPG
  17. 采样率:500 Hz;每记录 12,000 样本 = 24 秒
  18. 位深:signed 32-bit;格式 WFDB
  19. 原始采集约 30 秒(约 15,000 样本/通道);释放保留索引 [1000, 13000)
  20. 显示增益:ECG 1,000、PPG 12,000 counts/normalized unit
  21. 参考血压计:OMRON OML-HEM-1026(左臂)
  22. SBP:均值 119.86 ± 21.28 mmHg,范围 68–210
  23. DBP:均值 73.22 ± 13.10 mmHg,范围 40–140
  24. 性别:女 664 / 男 302 / 缺失 11
  25. 年龄:均值 48.27 ± 15.79 岁,范围 18–90+(顶编码)
  26. 身高:n=961,均值 164.13 ± 8.11 cm
  27. 体重:n=955,均值 66.56 ± 13.60 kg
  28. 高血压诊断:265 / 694 / 缺失 18;用药:224 / 739 / 缺失 14
  29. 质量标注:ECG 与 PPG 各三重叠窗,标签 = poor 窗数(0–3),不剔除记录
  30. 分片:16 个(part-0001 … part-0016,前 15 个各 ≤500 文件)

术语表

  • 无袖带血压估计(cuffless BP estimation):用生理信号推断血压,无需袖带。
  • ECG(electrocardiography):心电图,记录心脏电活动。
  • PPG(photoplethysmography):光电容积脉搏波,光学记录外周血容变化。
  • PTT(pulse transit time):脉搏传导时间,ECG R 峰到 PPG 特征点的时间差。
  • PAT(pulse arrival time):脉搏到达时间,ECG R 峰到 PPG 波峰的时间差。
  • WFDB:WaveForm DataBase,PhysioNet 标准波形格式(.hea + .dat)。
  • SBP / DBP:收缩压 / 舒张压(mmHg)。
  • participant leakage:受试者泄漏,同一人记录跨训练/测试集导致性能虚高。
  • calibration dependence:标定依赖,无袖带方法需个体初始血压校准。
  • credentialed access:凭据受限访问,需资质与协议。
  • DUA(Data Use Agreement):数据使用协议。
  • CITI:Collaborative Institutional Training Initiative,提供研究伦理培训。
  • RAI / DAIMS:数据可获取性与互操作评估框架。
  • top-coded:顶编码,超阈值的连续变量统一记为阈值(如年龄 ≥90 记 90+)。
  • normalized display view:归一化显示视图,仅用于显示不改变存储值。

附录 A:抓取时点与来源

项 值
抓取日期 2026-10-09
一手来源 https://physionet.org/content/cardiowave-portable/
平台 PhysioNet(RRID:SCR_007345)
版本 v1.0.0(2026-09-30 发布)
DOI 10.13026/yasp-vq73
抓取方式 curl 实抓内容页(HTTP 200,页面约 52 KB)

附录 B:文件清单(据页面描述)

文件 / 目录 内容
part-0001 … part-0016 波形分片(WFDB .hea + .dat)
RECORDS 所有 WFDB 记录路径(无扩展名)
metadata/records.csv 记录级:subject_id、SBP、DBP、card_type、源索引、ECG/PPG 质量
subject-info.csv 受试者级问卷元数据
DATA_DICTIONARY.csv 字段定义(名称/类型/单位/缺失码/描述)
CALIBRATION 推荐绘图尺度
README.md 使用总览
CLEANING_AND_FILTERING.md 清洗与过滤规则
PRIVACY.md 隐私处理说明
ACCESS.md 访问说明
REFERENCES.md 参考文献
examples/ WFDB 加载示例脚本
validation reports 验证报告

附录 C:引用格式(据页面)

APA:Yang, H., Zhang, L., Liu, H., Wang, C., Xie, Z., & Guo, X. (2026). CardioWave-Portable: a portable ECG and PPG dataset for cuffless blood pressure estimation (version 1.0.0). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/yasp-vq73

BibTeX:

@article{PhysioNet-cardiowave-portable-1.0.0,
  author = {Yang, Hailin and Zhang, Lexi and Liu, Hongyu and Wang, Chao and Xie, Zhenzhen and Guo, Xitong},
  title = {{CardioWave-Portable: a portable ECG and PPG dataset for cuffless blood pressure estimation}},
  journal = {{PhysioNet}},
  year = {2026},
  month = sep,
  note = {Version 1.0.0},
  doi = {10.13026/yasp-vq73},
  url = {https://doi.org/10.13026/yasp-vq73}
}

平台通用引用:Pollard, T., Moody, B. E., Lehman, L., Gow, B., Fernandes, C., Xie, C., Johnson, A., Mark, R. G., & Heldt, T. (2026). PhysioNet as a global platform for biomedical research. Nature Health, 1(8), 792–795. https://doi.org/10.1038/s44360-026-00096-z

附录 D:建模自查清单

  1. 划分:是否按 subject_id 分组?是否杜绝 participant leakage?
  2. 标定:如何处理未标定数字计数?是否需要数字模式读取?
  3. 质量:是否按质量标签分层报告或显式过滤?口径是否写明?
  4. 硬件版本:是否从 card_type 统计并报告 b/g 配比影响?
  5. 标定协议:若做个体标定,是否写明测量的选择与数量?
  6. 披露:过滤/归一化/缺失处理/队列限制是否全部写明?
  7. 结论边界:是否避免主张临床等效?
  8. 引用:是否引用本体(及 Data Descriptor 若可用)?

附录 E:遗留疑点(待核)

  1. 配套 Data Descriptor 论文:页面指引 “when available”,抓取时点未见配套论文编号/DOI。
  2. 数据体量(GB):页面未披露总大小;本条估算 3,849 × 2 通道 × 4 字节 × 12,000 样本 ≈ 369 MB(仅 .dat 裸数据,未计头文件/元数据)。
  3. b/g 实际配比:摘要未给出释放记录的实际硬件版本配比。
  4. 质量标签分布:页面未给出各质量等级(0–3)的记录数分布。
  5. 官方划分/基线:未提供。

尾注

本条目为 AI-Ready Wikipedia 数据集条目,生产于 2026-10-09,抓取与核验时点见附录 A。事实陈述以 PhysioNet 内容页(https://physionet.org/content/cardiowave-portable/,DOI 10.13026/yasp-vq73)为一手来源,实测抓取时页面 HTTP 200。规模数字(3,849 条 / 977 人)取自页面摘要与 Methods 的构建漏斗;血压、人口学、波形规格、设备与协议细节均逐字核对页面正文。页面未披露的项(数据体量、b/g 配比、质量分布、配套论文)已在附录 E 与 FACTS §9 存照为遗留疑点,未做任何推断性填充。条目与库内 ppg-dalia(rid 202)、butppg(803)、bidmc-ppg(74)、apnea-ecg(658)、mimic-iv-ecg(172)等条目互链,构成生理信号与无袖带血压估计家族的检索面。


§12 数据规模与构成(深化)

§2 已给出 CardioWave-Portable 的骨架性规格。本节在不重复前置结论的前提下,从数字口径、构成维度、字段语义、规模测算四个角度做深化,供建模者在开工前完成一次"数据体检"式的核对。

12.1 三个口径必须分开记:源库、漏斗、释放

CardioWave-Portable 的规模数字存在三层口径,混用是新手最常见的记账错误。以下三行数字都来自 PhysioNet 内容页摘要与 Methods,可逐字核对:

口径层 记录数 受试者数 含义
内部源库 4,228 1,057 采集现场全部原始记录(未清洗)
中间漏斗态 3,915 → 3,857 980 → 979 文件名/标签匹配 + 去重后
最终释放 3,849 977 凭据受限发布的受控记录

漏斗的每一步都对应一条可解释的排除规则:

  1. 4,228 → 3,915(记录 -313,受试者 -77):文件名与标签匹配失败、基础元数据校验不通过的记录被剔除。这一步同时丢人,说明部分受试者的全部记录都未通过,而非仅丢个别记录。
  2. 3,915 → 3,857(记录 -58,受试者 -1):重复源去除(duplicate-source removal)排除 58 条。受试者仅 -1,说明重复主要发生在同一受试者的多条记录之间,而非整人重复。
  3. 3,857 → 3,849(记录 -8,受试者 -2):重提交质控发现 2 名年龄 <18 岁的受试者,其 8 条记录一并剔除。这是唯一一条以年龄为硬门槛的排除。

记账纪律:撰写方法学章节时,若引用"4,228"必须同时说明它是"内部源库"而非"可用规模";若引用"3,849"则须说明它是"最终释放"。把 4,228 当作数据量报给审稿人,等于把未清洗数据当成品。

12.2 构成维度:记录级 vs 受试者级

CardioWave-Portable 的元数据分两张主表,粒度不同、不能混算:

  • 记录级(records.csv,n=3,849):每行一条波形记录。字段含 subject_id(外键)、SBP、DBP、card_type(b/g)、源片段索引、ECG 质量标签、PPG 质量标签。
  • 受试者级(subject-info.csv,n=977):每行一名受试者。字段含问卷派生的人口学、体格测量、高血压诊断、用药、生活方式与测前变量。

两表经 subject_id 关联,是一对多:977 名受试者摊到 3,849 条记录,平均每人 ≈3.94 条(3,849 ÷ 977)。协议计划每人测"2 次蓝卡 + 2 次金卡"共 4 次,故人均接近 4 条符合设计预期;实际均值 3.94 说明有少量受试者未凑满 4 条(这正是 b/g 配比须自查的原因,见 §14 坑 4)。

人口学维度(受试者级,n=977):

变量 n(有效) 均值 SD 范围
年龄(岁) 977 48.27 15.79 18–90+(顶编码)
身高(cm) 961 164.13 8.11 130–195
体重(kg) 955 66.56 13.60 36–168

注意身高的有效 n=961、体重 n=955,均低于 977——存在结构性缺失。做 BMI 派生或体重相关协变量时必须先处理这 16–22 条缺失,不能默认全人群齐备。

性别与临床标签(受试者级):

变量 有 无 缺失
性别(女/男) 女 664 男 302 11
高血压诊断 265 694 18
降压药使用 224 739 14

三类均有缺失(11–18 条),且缺失不等于"无"。做高血压分层或"用药 vs 未用药"对照时,若把缺失并入"无"会引入偏倚;正确做法是单列缺失层或做多重插补。

血压标签维度(记录级,n=3,849):

标签 均值 SD 范围
SBP(mmHg) 119.86 21.28 68–210
DBP(mmHg) 73.22 13.10 40–140

SBP 范围 68–210 覆盖低血压到 3 级高血压,DBP 范围 40–140 同样跨度大。回归任务的标签区间宽,意味着 MAE 不足以刻画误差结构——须同时报告误差随血压分层的分布(低/正常/高区间各自的偏差),否则会掩盖"高血压端系统性低估"这类典型失败模式。

12.3 波形规格的字段级语义

每条记录 = 一个 .hea + 一个 .dat。关键语义逐项拆解:

  • 2 通道:channel 0 = 单导联 ECG;channel 1 = 单导联 PPG。二者在同一 500 Hz 时基上同步采样,这是能算 PTT/PAT 的前提。
  • signed 32-bit:存储为有符号 32 位整数,非 float。读取时必须保持整型,避免在读取阶段就做隐式浮点转换而丢失原始计数精度。
  • 12,000 样本 = 24 秒:500 Hz × 24 s = 12,000。原始采集约 30 秒(≈15,000 样本/通道),释放时保留原始零基索引 [1000, 13000) 的片段——即丢弃前 1,000 样本(前 2 秒)与后 2,000 样本(后 4 秒)。这段裁剪区间是固定的,不是按信号质量动态选取。
  • 未标定:存储值是原始设备数字计数(raw device counts),未做物理幅度换算、未重采样、未滤波(无基线去除/带通/低通)。
  • 显示增益:CALIBRATION 文件给出推荐绘图尺度——ECG 固定增益 1,000 counts/normalized unit,PPG 固定增益 12,000 counts/normalized unit;每记录每通道以四舍五入的数字中位数作为显示基线。增益只用于显示,把数字除以增益得到的是"显示归一化单位",不是生理物理量。

一句话记忆:.dat 里是"设备说了算的数字",不是"物理意义明确的毫伏/百分比"。想要物理量,得先拿到厂商换算因子——而厂商因子不可得(见 §14 坑 3)。

12.4 规模测算(估算口径,非官方数字)

PhysioNet 页面未披露数据总体量(GB)。以下为基于已知规格的估算,仅供容量规划参考,须标注为估算:

  • 单条记录裸信号量:2 通道 × 4 字节 × 12,000 样本 = 96,000 字节 ≈ 93.75 KiB
  • 全部记录裸信号量:3,849 × 96,000 ≈ 369.5 MB(≈352 MiB)
  • 加上 .hea 头文件(每条数百字节)、records.csv/subject-info.csv/DATA_DICTIONARY.csv、examples/、validation reports 等,总下载量估计在数百 MB 量级。

这一估算与"16 分片、前 15 片各 ≤500 文件"的组织方式自洽:500 文件 ≈ 250 条记录(.hea + .dat 成对),前 15 片约 7,500 文件对应约 3,750 条记录,与 3,849 条吻合。

12.5 数据体检清单(开工前 8 步核对)

把上述全部维度压缩成一张可执行的核对单,建议在任何建模前跑一遍:

  1. 记录数:RECORDS 行数是否 = 3,849?records.csv 数据行是否 = 3,849?
  2. 受试者数:subject-info.csv 行数是否 = 977?records.csv 中 subject_id 去重后是否 = 977?
  3. 配对性:每条记录的 .hea 是否声明 2 通道?.dat 大小是否 = 2 × 4 × 12,000 = 96,000 字节?
  4. 同步性:ECG 与 PPG 是否共用同一采样率(500 Hz)与同一长度(12,000)?——不同步则 PTT 不可算。
  5. 血压缺失:SBP/DBP 是否有空?页面言全部记录配袖带标签,但仍须实测确认。
  6. 卡片类型配比:card_type 中 b 与 g 各多少?是否接近 1:1?——页面未披露,必须自算(§14 坑 4)。
  7. 质量分布:ECG/PPG 质量标签 0/1/2/3 各自的记录数?——页面未披露分布,必须自算(§14 坑 6)。
  8. 人群缺失:身高/体重/高血压/用药/性别的缺失条数,与本节表格是否一致?

只有这 8 步全部对齐,后续的划分、建模、报告才站得住脚。


§13 使用指南:数据加载与预处理代码示例

本节给出可运行的 Python 骨架,覆盖三个最易出错的环节:WFDB 波形读取(含 digital/physical 模式之别)、血压标签对齐、预处理滤波。代码以 CardioWave-Portable 的规格(2 通道、500 Hz、12,000 样本、signed 32-bit、未标定)为准。

前置:需已通过 PhysioNet 凭据访问获得数据;本地目录结构假定为 cardiowave-portable/ 下含 part-XXXX/、metadata/records.csv、subject-info.csv、RECORDS。示例用 wfdb 与 numpy/scipy,pip install wfdb numpy scipy pandas。

13.1 环境与依赖自检

import wfdb, numpy as np, pandas as pd
from pathlib import Path

DATA_ROOT = Path("cardiowave-portable")

# 基本存在性自检
assert (DATA_ROOT / "RECORDS").exists(), "缺 RECORDS 文件"
assert (DATA_ROOT / "metadata" / "records.csv").exists(), "缺 records.csv"
assert (DATA_ROOT / "subject-info.csv").exists(), "缺 subject-info.csv"

records = [r.strip() for r in (DATA_ROOT / "RECORDS").read_text().splitlines() if r.strip()]
print(f"RECORDS 记录数: {len(records)}")          # 期望 3849

13.2 读取单条 WFDB 记录(关键:digital vs physical)

CardioWave-Portable 未标定,因此默认必须用 digital 模式读取,保留原始设备数字计数:

def load_record_digital(record_path_no_ext: str):
    """以 digital 模式读取一条记录,返回 (ecg, ppg, fs, sig_names, header)。"""
    rec = wfdb.rdrecord(record_path_no_ext, physical=False)   # ← physical=False 是重点
    fs = rec.fs
    sig = rec.d_signal          # 原始整型数字信号,形状 (12000, 2)
    names = rec.sig_name
    ecg = sig[:, 0].astype(np.int64)
    ppg = sig[:, 1].astype(np.int64)

    # 规格断言
    assert fs == 500, f"采样率异常: {fs}"
    assert sig.shape == (12000, 2), f"形状异常: {sig.shape}"
    return ecg, ppg, fs, names, rec

ecg, ppg, fs, names, header = load_record_digital(str(DATA_ROOT / records[0]))
print("通道:", names, "| fs =", fs, "| 样本数 =", ecg.size)
print("ECG 数字范围:", ecg.min(), ecg.max())
print("PPG 数字范围:", ppg.min(), ppg.max())

为什么用 digital 而不是 physical:physical=True 会让 wfdb 用头文件里的增益/基线把数字折算成"物理量",但本数据集的"物理量"只是显示归一化单位,并非真实毫伏/百分比。折来折去不仅得不到设备真值,还可能因基线假设不同引入伪差异。保持 digital,把"是否归一化"留给你自己在建模管线里显式决定。

读取物理/显示视图(仅供绘图核对,不用于建模输入):

def load_record_display(record_path_no_ext: str):
    """读取归一化显示视图,仅供绘图;不代表设备物理量。"""
    rec = wfdb.rdrecord(record_path_no_ext, physical=True)
    return rec.p_signal   # 归一化显示单位,形状 (12000, 2)

disp = load_record_display(str(DATA_ROOT / records[0]))
print("显示视图范围 ECG:", disp[:, 0].min(), disp[:, 0].max())

13.3 批量扫描:先做全局体检

在建模前,先对全部记录做一次轻量扫描,验证 §12.5 的 8 步清单:

def audit_dataset(data_root: Path, records: list[str]) -> pd.DataFrame:
    rows = []
    for rp in records:
        full = str(data_root / rp)
        rec = wfdb.rdrecord(full, physical=False)
        rows.append({
            "record": rp,
            "n_sig": rec.n_sig,
            "fs": rec.fs,
            "length": rec.sig_len,
            "ecg_dtype": str(rec.d_signal.dtype),
        })
    return pd.DataFrame(rows)

audit = audit_dataset(DATA_ROOT, records[:20])   # 先抽 20 条验证,再全量
print(audit.head())
print("唯一 (n_sig, fs, length) 组合:", audit[["n_sig","fs","length"]].drop_duplicates().values)
# 期望: [[2, 500, 12000]]

13.4 血压标签对齐(记录级 → 受试者级)

records.csv 是记录级表,含 subject_id 与 SBP/DBP。对齐时务必确认一行记录一份 BP,不要把同一受试者多条的 BP 混算:

rec_df = pd.read_csv(DATA_ROOT / "metadata" / "records.csv")
subj_df = pd.read_csv(DATA_ROOT / "subject-info.csv")

print(rec_df.columns.tolist())     # 确认字段名,如 subject_id / SBP / DBP / card_type / ecg_quality / ppg_quality
print("记录数:", len(rec_df), "| 受试者数:", rec_df["subject_id"].nunique())

# 建立 记录路径 → 标签 的映射(假设 records.csv 有 record 或 path 列)
# 若列名有差异,以 DATA_DICTIONARY.csv 为准逐字核对
label_map = rec_df.set_index("record")[["subject_id", "SBP", "DBP", "card_type"]].to_dict("index")

# 组装建模样本:一条记录一个 (ecg, ppg) → (sbp, dbp)
def build_sample(record_id: str):
    rp = str(DATA_ROOT / record_id)
    ecg, ppg, fs, _, _ = load_record_digital(rp)
    lab = label_map[record_id]
    return {
        "subject_id": lab["subject_id"],
        "ecg": ecg, "ppg": ppg, "fs": fs,
        "sbp": lab["SBP"], "dbp": lab["DBP"],
        "card_type": lab["card_type"],
    }

对齐纪律:

  1. 记录级 BP 属于该记录:同一受试者不同记录的 BP 可能不同(不同次测量),不能取平均后回填。
  2. 外键完整性:records.csv 的每个 subject_id 必须能在 subject-info.csv 中找到;找不到的行要报错而非静默丢弃。
  3. 缺失形态:先统计 SBP/DBP 的 isna(),确认是否全有;再统计 card_type 缺失。
# 完整性核对
missing_subj = set(rec_df["subject_id"]) - set(subj_df["subject_id"])
print("records 中找不到的 subject_id 数:", len(missing_subj))   # 期望 0
print("SBP 缺失:", rec_df["SBP"].isna().sum(), "| DBP 缺失:", rec_df["DBP"].isna().sum())
print("card_type 分布:\n", rec_df["card_type"].value_counts(dropna=False))

13.5 预处理滤波(谨慎:原始数据未滤波)

原始信号未做基线去除/带通/低通。是否滤波、怎么滤波由你决定,但必须在报告中写明。以下给出 ECG 与 PPG 的常规范式,仅作起点,非官方推荐:

from scipy.signal import butter, filtfilt, iirnotch, find_peaks

def bandpass(x, fs, lo, hi, order=4):
    b, a = butter(order, [lo/(fs/2), hi/(fs/2)], btype="band")
    return filtfilt(b, a, x)

def notch(x, fs, f0=50.0, q=30.0):
    b, a = iirnotch(f0/(fs/2), q)
    return filtfilt(b, a, x)

def preprocess_ecg(ecg, fs=500):
    x = ecg.astype(np.float64)
    x = x - np.median(x)             # 去基线(中位数法,抗尖峰)
    x = notch(x, fs, f0=50.0)        # 工频 50 Hz(中国电网)陷波
    x = bandpass(x, fs, 0.5, 40.0)   # 心电有效频带
    return x

def preprocess_ppg(ppg, fs=500):
    x = ppg.astype(np.float64)
    x = x - np.median(x)
    x = notch(x, fs, f0=50.0)
    x = bandpass(x, fs, 0.5, 8.0)    # 脉搏基频与谐波
    return x

ecg_f = preprocess_ecg(ecg, fs)
ppg_f = preprocess_ppg(ppg, fs)
print("滤波后 ECG/PPG:", ecg_f.shape, ppg_f.shape)

滤波注意事项:

  • 工频选择:中国现场采集,工频为 50 Hz;若误用 60 Hz 陷波则无效。
  • 零相位:用 filtfilt 而非 lfilter,避免相位偏移破坏 ECG 与 PPG 的时序对齐(PTT 对相位极敏感)。
  • 不要过度滤波:PPG 高截止设到 8 Hz 是常见起点;设太低会削掉反射波,设太高则保留噪声。
  • 滤波一致性:同一条流水线对全部记录(含训练/测试)用相同参数,避免泄露或口径不一。

13.6 PTT/PAT 特征与受试者级划分骨架

ECG+PPG 配对的核心价值在于可算脉搏传导/到达时间。以下给出最小骨架,并同时给出防 participant leakage 的 GroupKFold 划分:

from sklearn.model_selection import GroupKFold

def estimate_ptt(ecg_f, ppg_f, fs=500):
    """估算 ECG R 峰到 PPG 波峰的时延(秒):PTT 的简化代理。"""
    r_peaks, _ = find_peaks(ecg_f, distance=int(0.3*fs), height=np.std(ecg_f))
    ppg_peaks, _ = find_peaks(ppg_f, distance=int(0.3*fs), height=np.std(ppg_f))
    if len(r_peaks) == 0 or len(ppg_peaks) == 0:
        return np.nan
    # 每个 R 峰后最近的一个 PPG 峰作为配对
    delays = []
    for r in r_peaks:
        after = ppg_peaks[ppg_peaks > r]
        if len(after):
            delays.append((after[0] - r) / fs)
    return float(np.median(delays)) if delays else np.nan

# 构造特征表 + 分组变量
samples = [build_sample(r) for r in records]     # 记录级
X, y_sbp, groups = [], [], []
for s in samples:
    ecg_f = preprocess_ecg(s["ecg"], s["fs"])
    ppg_f = preprocess_ppg(s["ppg"], s["fs"])
    ptt = estimate_ptt(ecg_f, ppg_f, s["fs"])
    X.append([ptt])
    y_sbp.append(s["sbp"])
    groups.append(s["subject_id"])               # ← 分组键 = subject_id

X = np.array(X, dtype=float)
y_sbp = np.array(y_sbp, dtype=float)
groups = np.array(groups)

gkf = GroupKFold(n_splits=5)
for fold, (tr, te) in enumerate(gkf.split(X, y_sbp, groups=groups)):
    assert not (set(groups[tr]) & set(groups[te])), "participant leakage!"
    print(f"fold {fold}: train={len(tr)} test={len(te)}")

三点必须强调:

  1. 分组键是 subject_id,不是 record_id。用 record_id 划分必然导致泄漏。
  2. 断言防泄漏:每个 fold 显式断言 train 与 test 的 subject 集合不相交,把它写进代码而非只写在文档里。
  3. PTT 只是骨架:真实建模应加入更多形态/频域特征、质量标签协变量、卡片类型协变量,并对质量差的窗做加权或过滤。

13.7 质量标签的分层报告模板

质量标签(0–3 = poor 窗数)不用于剔除,但强烈建议分层报告:

def stratified_report(rec_df: pd.DataFrame):
    for ch in ["ecg_quality", "ppg_quality"]:
        if ch in rec_df.columns:
            print(f"--- {ch} 分布(0 好 → 3 差)---")
            print(rec_df[ch].value_counts(dropna=False).sort_index())

stratified_report(rec_df)
# 交叉:高质量子集 vs 全集的性能差异才是质量感知建模的关键证据

口径纪律:无论是否过滤、如何归一化、如何处理缺失,全部写进方法章节。页面反复强调"报告额外过滤/归一化/缺失处理/队列限制/标定流程/受试者级划分"——这六项缺一,复现性就不完整。

§14 避坑清单(续):坑 9–16

§8 已列八坑,此处续列八条,专治"上手之后才会撞到"的细节坑。编号承接 §8,不重复其内容。

坑 9:records.csv 与 subject-info.csv 是两张表,靠 subject_id 连接,别想当然一一对应。
records.csv 是记录级(约 3,849 行,每行一条 24s 波形),subject-info.csv 是受试者级(约 977 行,每行一名受试者的人口学与临床字段)。二者通过 subject_id 多对一关联(一名受试者对应多条记录)。常见错误:把两张表按行号直接对齐,或对 subject-info 做 merge 后忘记它会被"记录数"放大(一人 4 条记录 → 该人的身高体重被复制 4 份)。做被试级统计务必先去重到 subject_id 唯一,否则体重/身高会被重复加权,均值与 n 都会错。

坑 10:血压标签是每受试者一次的袖带读数,被复制到该人每条记录,不是每条波形各测一次。
协议里袖带血压(OMRON OML-HEM-1026)是按受试者采集的,随后同一人的 2 蓝 + 2 金记录共享同一组 SBP/DBP 标签。这意味着:同一人的多条记录标签完全相同。后果一:按记录随机划分会把同一标签的同人记录分到训练与测试两侧,制造 participant leakage(见坑 5)。后果二:若把记录数当作独立样本量做统计功效估算,会严重高估有效 n——真正独立的是 977 名受试者,不是 3,849 条记录。后果三:同人记录之间的"预测差异"只反映波形段差异,不反映血压变化,别误读成模型对血压的敏感性。

坑 11:physical=True 读出来的 p_signal 只用于显示/画图**,不是标定后的物理量。**
WFDB 头里的增益(ECG 1,000、PPG 12,000 counts per normalized unit)是显示换算,目的是让波形画在合理纵轴上,不代表电压(mV)或光强(a.u.)的任何生理真值。厂家的模数换算因子不可得(见 FACTS §9 遗留疑点 4)。因此:建模请用 digital mode(physical=False → d_signal);若论文里要报"幅度相关"的特征(如 PPG 峰-谷高度、ECG R 波幅度),必须显式声明"使用未标定数字计数",并说明跨设备版本(蓝/金卡)不可直接比幅度。

坑 12:50 Hz 工频干扰得自己滤,数据集不保证已去工频。
页面文档的 CLEANING_AND_FILTERING 说明了可用的清理/滤波取向,但释放的波形本身不是"已为你滤好"的成品(属原始设备数字流)。中国大陆电网为 50 Hz 工频,PPG 与 ECG 都易受其污染。做频域或形态特征前,建议先做 50 Hz 陷波(scipy.signal.iirnotch(50, Q=30, fs=500))+ 带通;并且用零相位滤波(filtfilt),避免 lfilter 引入的相位延迟破坏 PTT/PAT 的时序(PTT 是毫秒级量,相位延迟直接毁掉它)。详见 §13.5 代码。

坑 13:PPG 单周期峰检测在 24s 短窗 + 卡片机信号上不稳,别直接套通用算法。
24s @ 500 Hz = 12,000 点,静息心率下约 20–40 个脉搏周期。卡片机 PPG 的形态、灌注指数与腕表/指夹不同,通用峰值检测(如 find_peaks 设固定 prominence)容易漏检/多检。务实做法:先带通(0.5–8 Hz)再检测;用自适应阈值或模板匹配;对每段做质量标签交叉校验(质量差就别硬算 PTT);并把峰检测失败的记录显式丢弃并计数,而不是静默填 0。PTT 对 R 峰与 PPG 足点的配对极敏感,错配一对就能把回归带偏。

坑 14:质量标签虽在但未用于剔除**,谁过滤谁负责说明。**
ECG/PPG 质量标签(0–3,poor 窗计数)只是附加列,数据集不会因质量差而删除记录(见 §8 坑 6)。这意味着:A 论文用全部 3,849 条、B 论文用"质量≤1"的子集,两者的数字不可比。规范:报告时明写过滤口径(performance only on records with ecg_quality<=1 and ppg_quality<=1, n=____),并把被剔除的记录数一并报出;对质量分层(好/中/差)分别出指标,而不是只报一个"全量均值"掩盖噪声。

坑 15:没有官方 train/test 划分文件,划分协议必须自己定义并公开**。**
页面不发布固定 split,也没有 leaderboard(见 §8 坑 7)。CrossRef 表格里任何"CardioWave 上的 SOTA"数字,若不注明划分种子、分组键(应为 subject_id)、质量过滤与标定口径,一律不可复现、不可横比。最小可复现清单:① 分组键 = subject_id(GroupKFold);② 随机种子;③ 质量过滤口径;④ digital/physical 读法与增益口径;⑤ 特征集合(是否含 PTT/PAT);⑥ 标准化统计量是否只用训练折拟合。缺任一项,横向数字即失效。

坑 16:受限凭据下,代码可开源、数据不可转发——协作与复现要提前设计。
PhysioNet Credentialed Health Data License 1.5.0 + DUA 规定:数据文件不得再分发给未获授权者。这带来三个工程后果:① 队友必须各自完成 credentialing,不能"一个人下载大家用";② CI/云环境若无凭据就拿不到数据,测试数据需另做 mock 或合成信号;③ 复现包(reproducibility package)只能放代码 + 划分清单 + 随机种子,不能打包 .dat 波形。设计实验流程时就把"凭据墙"当成架构约束,而非事后补丁。

14.1 坑点速查表(9–16)

编号 一句话 触发场景 应对
坑 9 记录表≠受试者表 做人口学统计 先按 subject_id 去重
坑 10 同人共享标签 划分/功效估算 分组划分 + 以 977 为有效 n
坑 11 p_signal 非标定物量 报幅度特征 用 d_signal 并声明未标定
坑 12 工频得自己滤 频域/形态特征 50 Hz 陷波 + filtfilt 零相位
坑 13 PPG 峰检测易错 算 PTT/PAT 带通 + 自适应阈值 + 质量校验
坑 14 质量标签不自动剔除 跨论文对比 显式声明过滤口径与剔除数
坑 15 无官方划分 报 SOTA 公开分组键/种子/口径清单
坑 16 数据不可转发 协作/CI 各自 credentialing + mock 数据

14.2 与 §8 八坑的合并口径

§8 覆盖"身份、许可、标定、配比、泄漏、质量、基准、临床边界"八大顶层红线;§14 覆盖"表连接、标签粒度、读法、滤波、峰检测、过滤、划分、分发"八条落地细节。八 + 八 = 16 条,构成从"第一步别下错文件"到"最后一步别发错数据"的完整避坑链。若本条目要抽出"最小必读三条",应为:坑 5(分组泄漏)、坑 10(标签粒度)、坑 15(无官方划分)——这三条直接决定任何跨论文性能数字是否可信。

§15 常见问题 FAQ(增补 12 组)

§1「十问十答」与正文 FAQ 已答基础问题,此处续答 12 组上手/复现层面的高频疑问。

Q21:我只想要"够用"的入门数据子集,能否不全量下载?
可以。最小可用子集建议:随机取 100–200 名受试者的全部记录(保证分组划分可行),配合 records.csv + subject-info.csv。这样既有足够训练样本(每人最多 4 条 → 约 400–800 条记录),又能在本地沙箱内跑通全流程。注意:PhysioNet 凭据是整库级授权,但下载量由你控制,不必一次拉全 3,849 条。

Q22:数据集里有没有现成的"血压预测模型"或权重?
没有。本条目是数据集,不是模型仓库。页面不附带预训练模型、基线 weight 或推理脚本(见 §8 坑 7)。你要从零训练。可从简单的 Ridge / 随机森林基线起步,再上 CNN/LSTM——但划分必须走 GroupKFold(§13.6)。

Q23:ECG 与 PPG 是同一时间轴对齐的吗?
是。卡片机同机同步采集,两通道共享同一 500 Hz 时间轴,24s 等长。这正是能算 PTT/PAT 的前提(§13.6)。但是:两条通道的"绝对起始时刻"不代表生理事件对齐——R 峰与 PPG 足点之间才是有意义的时延;别把"同一行索引"误当成"同一生理时刻"。

Q24:24 秒够长吗?能算心率变异性(HRV)吗?
勉强。24s 静息下约 20–40 个心搏,足以估平均心率与粗粒度 PTT,但不足以做有统计意义的 HRV(SDNN/RMSSD 需要更长或多次记录)。跨记录拼接同一受试者时,注意记录间的时间间隔未知(不是连续监测),别把 4 条记录当成连续 96s 信号。

Q25:蓝卡(b)与金卡(g)到底差在哪?能混用吗?
两者是不同硬件版本/卡片型号(见 §8 坑 4),协议要求每人各 2 条。混合建模技术上可行,但须把 card_type 作为协变量或分层变量,并检验跨版本是否存在系统性幅度/形态偏移。切勿在不控制 card_type 的情况下把幅度类特征直接喂给模型——那可能学成"认卡型"而非"认血压"。

Q26:标签里的血压是收缩/舒张两值,能派生脉压(PP)或平均压(MAP)吗?
可以,且常见:PP = SBP − DBP,MAP ≈ DBP + (SBP − DBP)/3。本条目 SBP 均值 119.86、DBP 均值 73.22(见 FACTS §4),据此可估人群平均 PP ≈ 46.6 mmHg、MAP ≈ 88.8 mmHg。但注意:派生量继承了原标签的误差,且 MAP 的 1/3 公式是近似,报告时须注明口径。

Q27:缺失值怎么处理?人口学字段有缺(如身高 n=961、体重 n=955)。
别默认用 0 填。身高/体重缺失会让 BMI 派生失败;性别/高血压/用药有缺失(分别 11/18/14 例)。建议:① 对标签预测任务,缺失协变量可整列弃用;② 若要用作特征,用中位数填补并加缺失指示列;③ 报告建模样本量时,明确"因协变量缺失排除 n=__ 例"。把缺失当 0 会制造"身高 0 cm"的荒谬样本。

Q28:可以拿它做 ECG 单模态任务(如心律失常分类)吗?
不建议作为首选。本条目 ECG 是单导联、短窗、无心律失常标注,标签是血压而非心电诊断。做 ECG 分类应去 mimic-iv-ecg(rid 172)等带诊断标签的条目。本条目 ECG 的唯一价值是与 PPG 配对算 PTT,脱离 PPG 的 ECG 任务是"用错工具"。

Q29:审查代码时怎么确认"我确实没泄漏"?
加一道断言闸:划分后,训练集与测试集的 subject_id 集合交集必须为空。§13.6 已给 assert set(train_subs).isdisjoint(set(test_subs))。此外建议:① 标准化统计量只 fit 在训练折;② 记录级指标要同时报记录级与受试者级两份(受试者级先聚合同人记录);③ 用 GroupKFold 时把 groups 传成 subject_id 数组,别传成记录索引。

Q30:PhysioNet 上同名/近似名的条目一堆,怎么确保下的是对的?
认三样:① slug 精确匹配 cardiowave-portable;② DOI 10.13026/yasp-vq73;③ 页面头 Database Credentialed Access。库内 cxr-cardiomegaly(rid 606)虽含 “cardio” 但毫无关系(§8 坑 1)。下载后校验:应得 .hea/.dat 波形 + records.csv + subject-info.csv + 若干说明 MD。

Q31:能不能把数据传到云端 GPU 训练?
可在你自身持有凭据的前提下,在受 DUA 约束的安全环境使用;但不得把数据文件重新分发给第三方或公开托管(§14 坑 16)。团队协作时,每名成员须各自 credentialing;CI 环境若无凭据,需构造 mock/合成信号做管道测试,真数据只在有授权的机器上跑。

Q32:如果论文要引用,正式的引用格式是什么?
用页面提供的引文块(authors + 数据集标题 + PhysioNet + year + DOI 10.13026/yasp-vq73)。FACTS §2 记录作者为 Hailin Yang, Lexi Zhang, Hongyu Liu, Chao Wang, Zhenzhen Xie, Xitong Guo。注意:截至核验时,与该数据集对应的 Data Descriptor 论文尚未确认(FACTS §9 遗留疑点 2)——引用时应以 PhysioNet 页面自身的 DOI 条目为准,不要臆造期刊论文出处。

§16 相关数据集对照表

以下对照表聚焦库内 ECG / PPG / 血压(BP) 三类相邻条目,按"模态构成"归类,供选型与互链决策。rid 为库内编号;模态列 E=ECG 波形、P=PPG 波形、BP=血压标签、①=单模态。所有 rid 与名称以库内条目页为准,若与实际不符以条目页为最权威。

16.1 双模态(ECG + PPG 配对)

条目 rid 模态 场景 参考血压来源 与本条核心差异
cardiowave-portable(本条) — E + P + BP 社区静息筛查 袖带 OMRON OML-HEM-1026 —(基准)
mimic-iv-waveform 65 E + P (+更多) ICU 高密度监护 动脉/监护 ICU 前瞻监护 vs 便携静息;规模更大但场景单一
mimic-iii-ext-ppg 928 P(MIMIC 派生) ICU 回顾 监护 回顾性、ICU、PPG 派生;无同步 ECG 配对口径需核对
bidmc-ppg 74 P +(呼吸等) 重症/手术 临床级 场景为 ICU/手术,人群与本条社区人群不可比

16.2 单模态 PPG / 血压

条目 rid 模态 场景 与本条核心差异
ppg-dalia 202 P + BP 日常活动(腕表式) 腕表 PPG、活动场景;本条为卡片机同步双模态、静息场景
butppg 803 P + BP 待核(PPG 口径) 若为单模态 PPG,则缺 ECG 时序参照,无法算 PTT

16.3 单模态 ECG(无 PPG)

条目 rid 形态 用途 与本条核心差异
apnea-ecg 658 波形 ECG 呼吸暂停 ECG-only、无 PPG、无 BP;共性是"含 ECG"
mimic-iv-ecg 172 波形 ECG 心电诊断 多导联 + 诊断标签;本条单导联、无诊断标签
leipzig-heart-center-ecg 910 波形 ECG 心电形态 单模态 ECG,无血压关联
openecg 802 波形 ECG 心电通用 单模态 ECG,无血压关联
ecg-image-database 959 图像化 ECG 图像识别 数据形态是图片而非波形,任务范式完全不同

16.4 配对扩展(ECG 与其他模态)

条目 rid 配对模态 与本条的关系
mimic-iv-ext-ecg-glucose 998 ECG + 血糖 "ECG 与生理指标配对"的另一方向;本条为 ECG+PPG→BP

16.5 易混淆但无关

条目 rid 为何易混 结论
cxr-cardiomegaly 606 名称含 “cardio” 胸片心大(影像),与波形完全无关(§8 坑 1)

16.6 选型决策树(文字版)

  1. 要算 PTT/PAT → 必须"ECG + PPG 同步":本条 或 mimic-iv-waveform(ICU)。静息社区场景选本条。
  2. 要单模态 PPG 血压 → ppg-dalia(腕表活动)/ butppg。
  3. 要心电诊断分类 → mimic-iv-ecg(多导联 + 标签),不是本条。
  4. 要 ICU 高密度 → MIMIC 系(waveform / ext-ppg / ext-ecg-glucose)。
  5. 要图像化 ECG → ecg-image-database(范式不同,勿混任务)。

口径提醒:任何跨条目对比都受"场景(ICU vs 社区)、设备(监护 vs 卡片机/腕表)、参考标准(动脉 vs 袖带)、许可(公开 vs 受限)"四重差异污染。表中 rid 与字段以库内条目页为准;本表为导航用,非性能排名。

附录 F 参考文献与来源

本附录汇总本条目撰写期间所依据的一手/二手来源,并逐条标注可信度等级与核验状态。凡标 「待核」 者,均属抓取时点未能闭合的遗留疑点,不得在下游写作中被当作已确证事实引用。

F.1 一手来源(Primary Sources)

编号 来源 类型 关键内容 核验状态
P1 PhysioNet 内容页 https://physionet.org/content/cardiowave-portable/ 数据集官方页面 名称、版本 v1.0.0、发布日期 2026-09-30、DOI、访问等级、规模摘要 已核(凭据页公开摘要部分)
P2 数据集 DOI 10.13026/yasp-vq73 持久标识符 版本化引用锚点(v1.0.0) 已核
P3 数据集内 README.md / CLEANING_AND_FILTERING.md / PRIVACY.md / ACCESS.md 随包文档 前处理口径、隐私声明、访问步骤 已核(结构)/内容随版本
P4 数据集内 metadata/records.csv、subject-info.csv、DATA_DICTIONARY.csv 元数据文件 记录↔受试者↔BP↔卡片类型↔质量标签;问卷变量字典 已核(字段清单)
P5 数据集内 examples/(WFDB 加载示例)、CALIBRATION、RECORDS 示例与清单 官方读取范式、推荐绘图尺度、WFDB 路径列表 已核(存在性)
P6 伦理批件:哈尔滨工业大学经济与管理学院伦理审查委员会,Approval No. 2026-12(批准日 2026-04-07) 伦理文件 采集合规依据 已核(转述)

F.2 二手来源(Secondary Sources)

编号 来源 类型 用途 核验状态
S1 PhysioNet 平台通用引用:Pollard et al. (2026), Nature Health 1(8):792-795, doi:10.1038/s44360-026-00096-z 期刊论文(平台方法论) 平台级引用规范 已核(转述)
S2 库内既有 PPG/ECG 条目页面(ppg-dalia 等,见 §16) 内部条目 生态辨析与选型对照 已核(只读查库)
S3 生理信号处理通行方法(WFDB 工具链、Pan-Tompkins、零相位滤波等) 教科书/文献通识 §13 代码示例的算法依据 通识,非本数据集专有

F.3 引用格式建议(下游写作可直接采用)

数据集本体(推荐):

Yang, H., Zhang, L., Liu, H., Wang, C., Xie, Z., & Guo, X. (2026). CardioWave-Portable: a portable ECG and PPG dataset for cuffless blood pressure estimation (version 1.0.0). PhysioNet. https://doi.org/10.13026/yasp-vq73

平台(当引用数据集托管平台时):

Pollard, T., et al. (2026). PhysioNet. Nature Health, 1(8), 792-795. https://doi.org/10.1038/s44360-026-00096-z

F.4 来源使用纪律

  1. 一手优先:凡数值(规模、人口学、血压统计)一律以 P1/P4 为准;二手转述(含本条目正文)仅供导航。
  2. 不臆造论文:抓取时点未检索到配套 Data Descriptor 论文的编号/DOI,故 F.1/F.2 中不列任何推测性论文条目;正文亦不得出现虚构的 “Data Descriptor 已发表”。
  3. 许可不可绕过:所有来源均属 Credentialed Access 语境,附录所列 URL 仅指向公开摘要页,不构成数据下载入口。
  4. 时点声明:本附录核验时点为 2026-10-09,晚于此日期的页面变更需重新核验。

附录 G 存照附录

本附录将撰写过程中无法闭合的疑点与已闭合的核对项集中存照,供下游审校与后续版本对照。原则:能核的如实核,不能核的如实标"待核",绝不填坑式编造。

G.1 已闭合核对项(Closed)

项 结论 依据
数据集是否为库内新条目 是,无撞库 库内 ILIKE/关键词检索(FACTS §1)
最终释放规模 3,849 条 / 977 名成人受试者 P1 摘要 + P4
波形采样与长度 2 通道、500 Hz、12,000 样本 = 24 秒 P1 + P4
血压标签范围 SBP 68–210 mmHg;DBP 40–140 mmHg P4(记录级 n=3,849)
访问等级 Database Credentialed Access P1 + P3
质量标签语义 每通道 poor 窗数(0–3),不据此剔除 P1 + P4
评测纪律 同受试者记录必须同划分(防 participant leakage) P1 明示

G.2 未闭合疑点(Open / 待核)

编号 疑点 为何重要 当前状态 建议动作
G-O1 Data Descriptor 论文缺失 影响学术引用完整性与方法学权威性 页面仅言 “cite … Data Descriptor when available”;未检索到编号/DOI 后续版本定期复查 PhysioNet 页面
G-O2 数据体量(GB)未披露 影响存储/下载规划 官方未给;本条目估算裸 .dat ≈ 369 MB(非官方) 以实际下载为准
G-O3 硬件标定因子不可得 影响跨设备/跨研究幅度可比性 仅知显示增益(ECG 1,000 / PPG 12,000 counts/unit),物理换算因子不可得 使用时仅报告归一化或相对量
G-O4 b/g 两硬件版配比未披露 影响设备效应分析 计划每受试者 2×b + 2×g,实际释放配比未在摘要给出 下载后按 records.csv 统计
G-O5 无官方数据划分文件 影响基准可比性 页面仅强调纪律,未附划分文件 使用者自建受试者级 GroupKFold
G-O6 质量标签未驱动剔除 影响建模口径 释放含 0–3 poor 窗记录 建模者须自行制定过滤阈值并在报告中声明
G-O7 人口学缺失编码细节 影响缺失处理 性别/身高/体重等存在缺失(如性别缺失 11),具体缺失编码以 DATA_DICTIONARY.csv 为准 以 P4 字典为准

G.3 估算值专表(Estimates — 非官方数字)

警示:下表数值均为本条目根据公开字段推算,不是官方披露。下游引用时必须显式标注"估算",不得冒充官方数字。

估算项 推算依据 估算值 备注
单记录裸信号字节 2 通道 × 32 bit × 12,000 样本 96,000 B ≈ 93.75 KiB 仅 .dat 主体
全部裸信号总量 3,849 × 96,000 B ≈ 369.5 MB 未计 .hea/元数据
原始采集时长 约 30 秒/通道 ≈ 15,000 样本 — 释放仅取 12,000 样本片段

G.4 变更留痕建议

  • 若后续版本补齐 G-O1(论文上线),应在新增章节而非改写既有 §1–§11 中标注,保持"只增不改"的留痕原则。
  • 若官方后续披露 G-O2/G-O4 真值,附录 G.3 应保留估算行、另起"官方值"行对照,不删除原估算,以显式呈现认知更新。
  • 本条目所有"待核"标记应视为交接信号,供下一接管代理优先处理。

G.5 声明

  1. 本附录不含任何人体可识别信息;所列 URL 均为公开摘要页,不构成受控数据入口。
  2. 本条目为 AI-Ready Wikipedia 条目,定位为导航与方法学提示,不主张与经验证袖带设备的临床等效性。
  3. 撰写时点:2026-10-09;核验状态随官方页面更新可能变化,读者应自行复核最新版本(v1.0.0 起)。

相关数据集导航

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

  • heartcycle — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 多模态
  • ephnogram — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
  • cinc-2011 — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • butppg — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • qol-stress — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
  • dreamer — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 多模态
  • physionet-cinc-2017 — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • mimic-iv-ecg — 共享标签:生理信号 / 心电信号 / 心血管疾病 / 多模态
  • wesad — 共享标签:生理信号 / 可穿戴传感 / 多模态
  • cves — 共享标签:生理信号 / 心血管疾病 / 多模态

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

返回 AI-Ready 数据集