马桶座圈上的单导联心电 — tOLIet 大腿心电库

86 人 / 149 条记录 / 四条纹理电极 1 kHz

来源 https://physionet.org/content/tollet/1.0.1/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 11
马桶座圈上的单导联心电 — tOLIet 大腿心电库

信息速览

数据集名称马桶座圈上的单导联心电 — tOLIet 大腿心电库
数据类型时序信号,波形,元数据,补充材料
规模86 名受试者 / 149 条记录
接入方式https://physionet.org/content/tollet/1.0.1/
AI 就绪度

tOLIet 是一份把电极嵌进马桶座圈、从大腿后侧取心电的公开数据集。官方全名 tOLIet: Single-lead Thigh-based Electrocardiography Using Polimeric Dry Electrodes,直译是「用聚合干电极从大腿采集单导联心电」。它由葡萄牙的电信研究所与波尔图大学团队完成,2026 年 2 月以 1.0.1 版挂在 PhysioNet 上,许可为 CC BY 4.0。

它收录的不是常规心电图,而是一个日常物件被改装成传感器之后的原始输出。八十六名志愿者先后坐上同一只智能座圈,座圈内嵌四对干电极,四对电极的表面纹理各不相同,同一次坐姿里四路差分信号同时录下,单次最长五分钟;其中二十三条记录另配一段医院 12 导联心电作为参照。

这份库里最容易被误读的有两处:一是「单导联」不等于某个标准导联,四路信号都没有被映射到 I、II、V 这套体系(§1.2);二是它记录的不是「上厕所时的心电」,受试者是在卫生间或病房里褪去下装、坐上座圈静候几分钟,全程不在真实如厕过程中(§3.4)。一屏速览见下表。

维度 内容
官方全名 tOLIet: Single-lead Thigh-based Electrocardiography Using Polimeric Dry Electrodes
名字拆解 toilet 的中间三字母写作大写 OLI,与卫浴企业 OLI 同名
中文名 马桶座圈单导联大腿心电数据集
托管平台 PhysioNet,Open Access 栏目
版本 1.0.1,2026 年 2 月 2 日发布;1.0.0 为 2025 年 6 月 24 日
DOI 10.13026/411k-1476(v1.0.1);最新版 10.13026/z36n-vk32
规模 86 名葡萄牙籍受试者(女 50 男 36),149 条记录,含重复会话
每条信号路数 4 路差分,另有 6 路未使用的数字与模拟通道
电极纹理 平面、正弦、金字塔、梯形四种
采样与量化 1 kHz,10 位
前端与滤波 BITalino,增益一万一千,0.5 至 40 Hz 带通
单次时长 最长五分钟
参考数据 23 条记录配 10 秒 12 导联,GE MAC800
整包体积 未压缩 520.1 MB,ZIP 74.6 MB
许可 CC BY 4.0(仓库 README 另有更严格表述)
配套论文 Scientific Data 13(1),2026,DOI 10.1038/s41597-026-06713-6

§1 它要解决的具体麻烦

1.1 十二导联只能给你十秒,手环要你天天记得戴

临床心电的困境不在精度,在时长。门诊十二导联只记十秒,间歇性心律失常与阵发性房颤落在十秒之外的概率不低。动态心电补一天,代价是贴电极、连导线、洗澡要拆;手环补数月,代价是用户得记得充电和佩戴。

官方背景段的逻辑是:非传染性疾病已成主要死因,心血管病占其中最大一块,而这类病的早期信号稀疏、间歇。解法不是把设备做得更准,而是把传感器藏进每天必然接触的家具——马桶座圈。人每天会坐上去,不必额外动作,不必充电,也不必在身上贴东西。

这条思路在文献里叫 off-the-person 采集:信号不来自身上的器件,而来自环境中的接触面。手指电极与座椅电极都属这一类;大腿的特殊之处是接触面积大、位置稳定,坐下去就必然贴合。

采集方式 需要用户做什么 单次时长 主要代价
门诊十二导联 到医院、躺下、贴十枚电极 十秒 覆盖不到间歇事件
动态心电 贴身佩戴一至七天 一天以上 洗澡与睡眠受影响,依从性下降
消费级手环 记得戴、记得充电 数天至数月 单导联、位置随手腕变化
座圈电极 坐下 数分钟 只在特定房间可用

四行对比说明:座圈方案的竞争力不在信号质量,在「零动作」。代价是数据形态随之改变——短会话多、人杂、质量参差,现场也无法像诊室那样标准化。

概念 常被理解成 在这份数据里的实际含义
单导联 某一路标准导联,如 II 或 V1 一对电极之间的电位差,不对应任何标准导联
干电极 不用导电膏的金属片 嵌在座圈里的聚合材料电极,靠压力接触皮肤
不可见心电 穿戴式设备的隐形化 传感器进入家具,人身上没有任何器件
参考心电 同一时刻的标准记录 同一次就诊的 12 导联,十秒,不一定逐点对齐

1.2 三条常见的错误期待

第一条,把四路信号当作四导联心电。 A1 到 A4 是座圈上四对电极的输出,差别在表面纹理,不在对应哪个胸导联。当 I、II、III 去算电轴,角度没有生理意义;官方也从未给出导联等效表。

第二条,把它当带诊断标签的病人库。 官方写明部分受试者自述可能有心脏问题,但无一例经专科确认,库里没有一个可当金标准的疾病标签。它的目标是比较四种纹理的信号质量、验证可行性,不是建分类基准。

第三条,以为记录是在真实如厕时完成的。 官方声明数据不在真实使用马桶的过程中采集:座圈装在标准马桶上,受试者褪去下装静坐至多五分钟,有研究人员在场。地点选卫生间或单人病房是为隐私,不是为模拟日常。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
大腿取心的真实信号样本 145 条实验信号,四条纹理并行 够,这是主用途
电极纹理对信号质量的影响 同一坐姿下四路同时录,纹理已知 够,四路互为对照
与标准十二导联的形态对照 23 条记录配十秒参考 勉强,只有段级对照
日常场景心电的可行性论证 真实坐姿、真实接触条件 够,适合写进可行性章节
心律失常分类训练 无逐搏标签、无确认诊断 不够,结构上没有
心电生物识别的模板研究 同一人多次会话,编号可追踪 够,重复会话是关键
长时程心率变异性 单次最长五分钟 不够,只够短时指标
消费级产品的算法预研 与手环同量级的采样与量化 够,条件接近
ST 段或高频成分分析 0.5 至 40 Hz 带通切掉两端 不够,滤波已经把信息滤掉

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

你的处境 它能帮你什么 下一步该做什么
你在做智能家居健康监测的原型 一套真实坐姿下的四路信号,可直接当输入 先用四路中质量最好的一路跑通检测,再谈融合
你在比较干电极的材料或纹理 四种纹理同场对照,同一人同一坐姿 以同一会话内的四路互比,避免跨人比较
你在做心电身份识别 重复会话可验证模板稳定性 只用编号可追踪的多次会话做同人跨会话测试
你在给可穿戴算法找外部验证集 采样与量化水平接近消费级器件 明确写出带宽与位深差异,不要与临床库混比
你在写 off-the-person 的综述 一个可引用的公开数据点 与手指电极、座椅电极的公开集并列引用
你在教生理信号处理 数据格式简单,噪声真实,适合做第一次实战 从读一个文本文件开始,不要先碰 XML
你要一份能训练心律失常模型的数据 没有标签 换库内带标注的心电词条

1.5 一句话判断

它是一份把心电从医院搬到卫生间的可行性证据:四路干电极同场对照,信号粗糙但真实,标签稀薄但现场完整。

1.6 不适合谁:四条边界

四条边界都是硬的。 诊断级分析:10 位量化在 3 毫伏满量程上只有约 2.9 微伏的分辨率,叠加带通,测 ST 偏移的误差可能与信号同量级。导联定位:四路都在大腿与座圈之间,某一路像 II 导联也不能推电轴。疾病分类:无病种、逐搏与随访标签,只能做自监督。人群推断:八十六人、单中心、青年为主,外推超出便利样本容量。

边界 具体限制 越界使用的后果
诊断级分析 10 位量化、0.5 至 40 Hz 带通 毫伏级形态指标不可靠
导联定位 四路均为大腿差分,无标准导联对应 电轴与定位结论无效
疾病分类 无标签、无确认诊断 只能做自监督,无法验证
人群推断 86 人便利样本、单中心 外推结论不可复现

§2 数据构成与规格

2.1 四个目录、三个根文件、两种完全不同的数据格式

解压后是两个数据目录、一个脚本目录,加上元数据表、许可、说明与校验文件。实验信号与参考信号彻底分开,格式也完全不同——前者是 OpenSignals 的制表符文本,后者是 GE 心电机的私有 XML。任何流程都要写两套读取代码。

路径 类型 内容 数量
ECG_EXP/ 目录 座圈电极的实验信号文本 145 个 txt
ECG_REF/ 目录 临床 12 导联参考 XML 23 个 XML
Script/ 目录 官方读取与特征脚本 3 个 py
DataSet.csv 文件 受试者与记录元数据 1 份,含表头 150 行
README.md 文件 结构说明与使用提示 1 份
LICENSE.txt 文件 许可文本 1 份
SHA256SUMS.txt 文件 逐文件哈希 1 份
格式 用于 编码 单位 读取难点
OpenSignals 文本 实验四路信号 制表符分隔,两行井号头 原始整数,需换算 头行是 JSON,需跳过
分号 CSV 元数据 带 BOM,分号分隔 岁、千克、厘米 表头尾随空格、空列
GE 私有 XML 12 导联参考 单行超长属性 微伏 波形挤在一个属性里

三种格式并列,说明它是各环节工具的原始产物直接归档:保真,但每条流程都得自己写解析,官方那三个脚本只是演示级。

2.2 字段与记录的完整字典

实验文本一共十一列,其中只有一列是序号、四列是信号、六列是空置的辅助通道。列名写在第二行头信息的 JSON 里,而不是表头行,这一点与常见的 CSV 完全不同。

列序 列名 含义 实际取值
1 nSeq 四位循环序号,用于发现丢包 0 至 15 反复回绕
2 I1 BITalino 数字输入一 恒为 0
3 I2 BITalino 数字输入二 恒为 0
4 O1 BITalino 数字输出一 恒为 0
5 O2 BITalino 数字输出二 恒为 0
6 A1 平面纹理电极差分信号 10 位整数
7 A2 正弦纹理电极差分信号 10 位整数
8 A3 金字塔纹理电极差分信号 10 位整数
9 A4 梯形纹理电极差分信号 10 位整数
10 A5 未使用的模拟输入 恒为 0
11 A6 未使用的模拟输入 恒为 0

元数据表只有六列有效信息,后面还挂着十二个完全空置的列,是导出时的残留。文件名里的编号与会话后缀在这一栏里同样出现,构成与文件系统一一对应的键。

字段 类型 说明 是否有值
ID 文本 受试者编号,重复会话带 _1/_2 后缀 全部
Age 整数 年龄,岁 全部
Weight 整数 体重,千克,表头带尾随空格 全部
Height 整数 身高,厘米 全部
Gender 文本 取值为 Male 或 Female 全部
Observations field 文本 自由备注 多数留空

参考 XML 是 GE 的私有结构,命名空间指向 Sapphire 记录格式,文件语言标记为葡萄牙语。有用信息集中在三类节点:患者信息、设备信息、波形与模板。

节点或属性 含义 备注
patientInfo/identifier 受试者标识 值为空串,靠文件名对应
patientInfo/gender 性别 统一写 U(未知)
testInfo/acquisitionDateTime 采集时间 字段存在,可为空串
device/modelID 设备型号 ge:MAC800
ecgWaveform[@lead] 导联名,I 至 V6 共 12 个
ecgWaveform[@asizeVT] 波形点数 5000 或 600
ecgWaveform[@V] 空格分隔的样本值 短整数
ecgWaveform[@VT] 数据类型 xs:short

2.3 一条记录的完整解剖

打开任意一个实验文件,前两行是注释(格式声明与一段 JSON 元数据),第三行起是数据:十进制整数,制表符分隔,一行一个采样点。

#-- 第 1 行原文为格式声明:OpenSignals Text File Format. Version 1
#-- 第 2 行原文为单行元数据 JSON,关键字段照录如下
{"sampling rate": 1000, "resolution": [4, 1, 1, 1, 1, 10, 10, 10, 10, 6, 6],
 "column": ["nSeq", "I1", "I2", "O1", "O2", "A1", "A2", "A3", "A4", "A5", "A6"]}
9	0	0	0	0	427	511	0	515	0	0
10	0	0	0	0	451	519	0	518	0	0
11	0	0	0	0	487	528	0	519	0	0
12	0	0	0	0	531	537	0	521	0	0
13	0	0	0	0	578	547	0	523	0	0
14	0	0	0	0	625	554	0	524	0	0
15	0	0	0	0	665	560	0	525	0	0
0	0	0	0	0	697	561	0	526	0	0

第一列 nSeq 是这份文件里最容易被误用的字段。它看着像样本序号,实际是一个四位计数器,从 0 走到 15 就回绕,作用只是让接收端发现蓝牙丢包——上面八行里它从 9 数到 15 再回到 0。把它当时间轴,会得到一条每十六个样本跳回零的锯齿。

头信息键 用途
sampling rate 每秒样本数
resolution 各列位深,与列序一一对应
column 列名与顺序
sensor 六项 RAW,表示未做片上物理量换算

注意 sensor 全部标为 RAW,resolution 里四路信号写的是 10。这两条合起来决定了换算方式:原始值是 0 到 1023 的整数,需要按官方脚本的公式换算成毫伏,而不是任何心电库默认的整数单位。

换算步骤 表达式 结果
取反并抬升 1024 减原始值 0 至 1024
归一化 除以 1024 0 至 1
去中点 减 0.5 负 0.5 至 0.5
定标 乘 3 负 1.5 至 1.5 毫伏

四步之后得到毫伏。官方脚本把常数写作 33 除以 11,等价于 3,来自前端电源电压与增益的比值,不是随手取的整数。

2.4 三种记录形态:有参考、无参考、重复会话

把目录与元数据表对起来看,记录分三种形态:多数只有实验信号,一部分另配同批十二导联,还有一部分是同一受试者的第二或第三次会话。

形态 判定方式 典型记录 使用时的注意
单次无参考 只有一条 txt,XML 目录无同名文件 1、2、3 最常见,只能做实验路内部比较
单次带参考 txt 与 XML 同名 69 至 86 参考只有十秒,需自行定位对应段
重复会话 文件名带 _1 或 _2 67_1、67_2 同人跨会话,适合模板稳定性研究

三种形态能回答的问题不同:有参考的记录回答「大腿信号与标准导联像不像」,重复会话回答「同一个人再坐一次信号是否稳定」。这两类问题恰好是这份库最有价值的两个角度(§4.4 的案例同时具备两者)。

命名形式 含义 例子
NN.txt 第 NN 号受试者的第一次会话 67.txt
NN_1.txt 第 NN 号受试者的第二次会话 67_1.txt
NN_2.txt 第 NN 号受试者的第三次会话 67_2.txt
NN.XML 与同名会话同批的十二导联 67_2.XML

命名简单,但有个坑:第一次会话可能存为 67.txt,也可能直接存为 67_1.txt,取决于当时是否已有同名文件。做同人分组时,必须把下划线前的数字当受试者键。

2.5 与同类资源的规格差异

公开的 off-the-person 心电库不多,能把同一部位四种电极纹理同时录下来的更少。下表只比结构,不比优劣。

维度 tOLIet 常规临床心电库 消费级手环数据
采集位置 大腿后侧,座圈接触 胸导联与肢体导联 手腕或指端
导联数 4 路差分,非标准 3 至 12 路标准 1 路
采样率 1 kHz 250 至 1000 Hz 125 至 500 Hz
量化位数 10 位 16 位上下 12 至 16 位
带宽 0.5 至 40 Hz 0.05 至 150 Hz 0.5 至 40 Hz 常见
单次时长 最长五分钟 十秒至二十四小时 数小时至数天
参考标准 部分记录配 12 导联 本身就是标准 多数无参考
标签 仅人口学 心律与诊断 多为心率

这张表说明一件事:它的规格更接近消费级器件,而不是临床设备。1 kHz 只看时间分辨率,带宽被 0.5 至 40 Hz 的带通锁死。

对照对象 相同点 关键差异
手指电极身份识别库 同为 off-the-person,同为干电极 本库在大腿,接触压力更大
座椅式心电监测原型 同为家具集成 本库公开了原始波形
智能座圈心衰监测研究 同为马桶座圈 对方是家用连续监测系统,本库是可行性采集
床垫式心电 同为无感采集 位置与耦合方式不同

§3 它的身份:把心电搬进卫生间的一次工程试验

3.1 谁做的、在哪做的、为什么做

署名共五人,挂着五个机构:第一作者兼通讯作者属 INESC TEC 与波尔图大学工学院,一位属电信研究所,一位属卫浴企业 OLI-Sistemas Sanitários,临床方属里斯本新大学医学院。

机构 角色 在项目中承担
Instituto de Telecomunicações 信号处理与硬件 前端设计、信号分析、论文撰写
INESC TEC 工程实现 系统集成与数据采集
Faculdade de Engenharia da Universidade do Porto 学术依托 研究设计
OLI-Sistemas Sanitários S.A. 产业方 提供座圈与卫生洁具资源
Nova Medical School 临床方 受试者招募与临床判断
参与方 提供什么 决定了数据的哪个特征
卫浴企业 座圈结构、电极安装位 电极位置只能在大腿接触面
工程团队 BITalino 前端、蓝牙链路 1 kHz、10 位、0.5 至 40 Hz
临床团队 受试者、12 导联机 有参考段的记录集中在后期
伦理委员会 审批与数据保护评估 只保留匿名编号,无病历回溯

3.2 时间线:从概念验证到一份带 DOI 的数据集

这条研究线走了四年:2021 年证明聚合电极装在座圈上能取到心电,2022 年把同一套装置用于身份识别,2023 年讨论产业化可行性,2024 年验证模板持久性,2025 年年中数据集上线,2026 年三月数据描述论文见刊。

时间 事件 依据
2021 聚合电极座圈取心的设计与评估发表于 Scientific Reports 官方参考文献第 12 条
2022 卫生间场景下的心电身份识别发表于 Sensors 官方参考文献第 8 条
2023 面向产业化的可行性研究,IEEE ENBENG 官方参考文献第 16 条
2024 生物特征模板持久性评估,IEEE MELECON 官方参考文献第 17 条
2025-06-24 PhysioNet 发布 1.0.0 版 官方版本列表
2026-02-02 发布 1.0.1 版 官方版本列表
2026-03 数据描述论文见 Scientific Data 第 13 卷第 1 期 论文摘要

两个版本相隔七个多月,官方未给修订说明,但引用时仍需写清用的是哪一版。

版本 日期 页面标注 引用建议
1.0.0 2025-06-24 首版 老论文可能引用此版
1.0.1 2026-02-02 当前版 新工作应引此版并附下载日期
最新版 DOI 随版本滚动 10.13026/z36n-vk32 指向最新,不适合精确定位
固定版 DOI 指向 1.0.1 10.13026/411k-1476 可复现引用首选

3.3 采集链:一只座圈、一块开发板、一台笔记本

从电极到文件只有三级:座圈上的电极对、BITalino 前端、跑着 OpenSignals 的计算机,蓝牙把采样数据送过去落盘。这条链可以在实验室复现,也没有任何临床级隔离与校准环节。

环节 器件或参数 说明
电极 四对聚合干电极,四种表面纹理 嵌在座圈内侧,接触大腿后侧
前端 BITalino(PLUX,里斯本) 开源生物电采集套件
增益 一万一千 官方给出的模拟前端增益
滤波 0.5 至 40 Hz 带通 硬件或固件实现
采样 1 kHz 四路同步
量化 10 位 每路独立
传输 蓝牙 送至运行 OpenSignals 的计算机
落盘 制表符文本,两行头信息 每行一个采样点

带宽上限 40 Hz 是一个关键选择。它把工频干扰与大部分肌电噪声挡在外面,代价是 QRS 的陡峭上升沿被平滑,R 波峰值幅度被低估。做 R 波检测没问题,做形态学测量要谨慎。

3.4 受试者:八十六名志愿者,一次便利抽样

官方给出三项体格指标的均值与标准差:年龄 31.73 ± 13.11 岁,体重 66.89 ± 10.70 千克,身高 166.82 ± 6.07 厘米;女五十、男三十六,全部葡萄牙籍,经研究者直接联系与门诊机会招募。官方称招募时刻意覆盖不同年龄与体型。

项目 官方表述 对使用的含义
人数 86 便利样本,非抽样调查
性别 女 50、男 36 女性略多,性别分层时两组都够用
年龄 均值 31.73,标准差 13.11 以青年为主,老年段样本薄
体重 均值 66.89,标准差 10.70 体型跨度有限
身高 均值 166.82,标准差 6.07 身高分布集中
国籍 全部葡萄牙籍 单一人群
健康状况 部分自述心脏问题,未经确认 不能当病例对照
招募途径 场景 可能的偏倚
研究者直接联系 校内与协作机构 便利样本,健康志愿者偏多
门诊机会招募 医院门诊 就诊人群,可能带轻微症状

采集现场有硬约束:需要褪去下装才能保证皮肤与电极直接接触,所以测试安排在卫生间或医院单人病房;座圈装在标准马桶上,受试者静坐至多五分钟,除保证接触外不给姿势指导。

采集条件 官方设定 影响
地点 卫生间或医院单人病房 隐私优先,环境噪声不可控
着装 褪去下装,皮肤直接接触 接触条件比日常更理想
时长 最长五分钟 只够短时分析
姿势 不额外指导,自然坐姿 坐姿差异成为变异来源
人员 研究人员在场 可能存在紧张导致的体位变化

官方还列出会影响信号质量却未被记录的变量:体毛、护肤品、个体体格差异。这等于承认同一套硬件在不同人身上表现不同,而记录里没有可校正的协变量。

3.5 名字、缩写与一处拼写分歧

标题里的 Polimeric 不是常见拼法:同页参考文献与更早的论文一律写作 polymeric,即「聚合物的」。两者指向同一件事——电极材料是高分子聚合物,不是金属。官方未做说明,按页面原文照录即可。

口径 写法 出处
数据集标题 Polimeric Dry Electrodes PhysioNet 页面与 README
参考文献 polymeric electrodes 官方参考文献第 12 条
中文对应 聚合干电极 意译,两种拼写同指

名字本身也值得拆一下:tOLIet 是 toilet 的变体,中段三字母写成大写 OLI,恰好与提供资源的卫浴企业同名。官方未解释这层关系,但致谢里感谢该公司提供全部资源,作者之一亦隶属该公司。这属于读法,不是官方定义,写论文时不宜当事实陈述。

组成 字面 可能的用意
t 前缀 无实义,凑成 toilet
OLI 大写中段 与卫浴企业同名
et 后缀 凑成 toilet

3.6 与十二导联参考的关系:同批,不同步

二十三条记录配了参考心电。参考机是 GE MAC800,十秒十二导联,文件里同时存原始波形与每个导联的中位心搏模板。它的价值是给出「同一个人的标准心电长什么样」,让大腿信号有了一把可比的尺子。

参考项 规格 用途
设备 GE MAC800 临床级十二导联
时长 十秒 只够形态对照
导联 I 至 V6 共十二路 完整标准导联
波形点数 每导联 5000 点 按十秒折算为每秒 500 点
模板 每导联 600 点 中位心搏,供形态分析
单位 微伏 与实验路的毫伏不同
关系 是否成立 说明
同一受试者 成立 文件名与编号对应
同一批次 成立 官方称同时记录
逐点对齐 未说明 无同步标记,只能按波形自行配准
同一体位 未说明 参考机为静卧或坐位,未交代

「同批」与「同步」是两件事。实验段最长五分钟、参考段只有十秒,两者之间没有公开的同步标记。用参考段做形态比对,只能靠 R 波位置自行配准,并接受配准误差。

§4 它最独特的东西:一张座圈上的四种电极纹理

4.1 大腿取心为什么比手指更难

手指电极能做身份识别,是因为指端血管密集、皮肤薄、握持压力可控。大腿后侧恰好相反:皮肤厚、脂肪多、体毛密,接触压力由体重与坐姿决定,两腿之间的电位差本来就比胸导联之间弱。

难点 具体表现 官方是否给出对策
接触压力 由体重与坐姿决定,不可控 不控制,让受试者自然坐
皮肤阻抗 脂肪厚、体毛多,阻抗高 靠干电极压力与面积
电位幅度 两腿间差分幅度低 高增益前端补偿
运动伪迹 坐姿微调即产生基线跳变 0.5 Hz 高通压制
位置漂移 每次坐下的接触点略有差异 座圈固定电极位置
取心部位 接触可控性 信号幅度 场景自然度
手指 高,靠握持 中 需要主动触碰
手腕 中,靠表带 低 需要佩戴
胸部 低,需贴片 高 需要脱衣或贴电极
大腿后侧 中,靠体重 低 坐下即可

4.2 四种电极纹理:一次把材料变量做成对照实验

座圈上的四对电极不是同样的东西。它们的位置相同、尺寸相近,唯一系统性的差别是表面纹理:平面、正弦、金字塔、梯形。四种纹理对应四种皮肤接触方式,官方在前作里已经讨论过纹理对信号质量的影响,这份数据集把这组对照原样搬进了公开数据。

通道 纹理 形状描述 设计意图
A1 平面 平整表面 基准组,接触面积最大
A2 正弦 波浪状起伏 增加局部压力点
A3 金字塔 尖锥阵列 穿透体毛,接触更集中
A4 梯形 平顶台状 介于平面与尖锥之间

这四路并行采集带来一个罕见的性质:同一次会话里,四路差异主要来自纹理,而不是人、体位或时间。跨纹理比较不必担心个体差异混入。

4.3 四路差分信号在文件里长什么样

四路信号占第 6 至第 9 列,取值都是 0 到 1023 的整数。不同纹理的读数并不同步:§2.3 的片段里 A1 从 427 走到 697,A3 几乎停在 511 到 526 之间,这种差异正是纹理与接触状态造成的。

通道 列位置 原始范围 换算后范围
A1 第 6 列 0 至 1023 负 1.5 至 1.5 毫伏
A2 第 7 列 0 至 1023 负 1.5 至 1.5 毫伏
A3 第 8 列 0 至 1023 负 1.5 至 1.5 毫伏
A4 第 9 列 0 至 1023 负 1.5 至 1.5 毫伏
现象 可能原因 处理建议
某路恒定不变 电极未接触或通道故障 先看方差,再决定是否丢弃
某路幅度明显偏小 纹理与体毛不匹配 记录为质量分层依据
四路基线不同 电极极化电位差异 各自去均值,不要共用基线
某路出现方波跳变 接触瞬断后恢复 按跳变点切段

4.4 案例:67 号受试者的两次会话与一份 12 导联参考

§4.4 的案例取第 67 号受试者。她是三十岁女性,体重七十七千克,身高一百六十一厘米,在元数据表里对应两条记录:67_1 与 67_2,说明她坐了两次;ECG_REF 目录里还有一份 67_2.XML,说明第二次会话同时做了十二导联。

属性 值 为什么值得注意
编号 67 单条记录与参考文件可交叉定位
会话数 2 可做同人跨会话比较
参考 仅第二次 参考不覆盖全部会话
四路信号 齐全 可做纹理内部对照

这个案例把重复测量、参考配对、四纹理并行三种结构凑在了一起,因此能回答一个别处不好回答的问题:同一个人两次坐下,四路信号的相对优劣是否稳定。若第一次 A3 最好、第二次变成 A1 最好,纹理结论就只能按会话描述,不能按人推广。

import numpy as np
import matplotlib.pyplot as plt

def load_exp(path):
    #-- 头两行是注释,np.loadtxt 默认跳过井号行
    x = np.loadtxt(path, delimiter="\t")
    return x

def to_mv(raw):
    #-- 官方换算:取反、归一、去中点、乘 3
    return ((1024 - raw) / 1024 - 0.5) * 3

x1 = load_exp("ECG_EXP/67_1.txt")
x2 = load_exp("ECG_EXP/67_2.txt")
for name, x in (("s1", x1), ("s2", x2)):
    sig = {k: to_mv(x[:, i]) for k, i in zip("A1A2A3A4", range(5, 9))}
    print(name, x.shape[0] / 1000, "s",
          {k: round(float(np.std(v)), 4) for k, v in sig.items()})

这段代码把两次会话的四路信号读进来、换算成毫伏、打印标准差。标准差在这里不是质量指标,只是让人先看清四路之间的量级差异。

案例能回答 案例不能回答
同一人两次会话的信号是否同量级 纹理优劣能否推广到人群
四路在两次会话里的相对排序 哪一路在临床上更接近标准导联
参考段能不能配准到实验段 该受试者的真实心律诊断

4.5 参考系统的价值与陷阱

十二导联参考是最容易被高估的部分。它的价值是给出形态基准:某一路大腿信号若在 QRS 宽度、T 波极性上接近参考的某个导联,论文里只能说「形态上接近」,不能说「等于」。

陷阱 具体表现 应对
时长不匹配 参考十秒,实验最长五分钟 只取实验段中与参考对应的窗口
无同步标记 两套设备独立启动 用 R 波互相关估计时移
体位不同 参考机按临床常规摆位 在方法段声明体位差异
单位不同 实验毫伏,参考微伏 统一换算后再比较
模板缺段 模板尾部以负三万二千七百六十八填充 比较前先剔除哨兵值

最后一条尤其隐蔽。每个导联有两组数组:五千点的十秒波形与六百点的中位模板;模板尾部常用负三万二千七百六十八填充,那是短整型最小值,用作「无数据」标记。直接当信号值送进统计,会得到一条断崖式下跌的曲线。

数组 点数 典型内容
十秒原始波形 5000 连续采样,可含噪声
中位心搏模板 600 一个心搏的平均形态,尾部常带哨兵值
哨兵值 负三万二千七百六十八 表示该点无数据

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

四条边界。 要诊断级形态时:带通把 ST 的慢变化与 QRS 切迹一起削弱,指标只能相对比较。要长时程节律时:单次最长五分钟,覆盖不了昼夜与阵发事件。要人群代表性时:八十六人、单中心、青年为主,按年龄或病种分层后样本迅速掉到个位数。要真实场景时:采集条件比日常理想,衣物、湿度与姿势变化都没有覆盖。

边界 触发条件 替代方案
诊断级形态 需要测 ST 偏移或 QRS 时限 临床十二导联或高采样库
长时程节律 需要数小时以上连续记录 动态心电、贴片式监测
人群代表性 需要按年龄或病种分层 多中心队列
真实场景 需要评估日常依从性 家用部署研究

§5 怎么拿到:从一条命令到可训练张量

5.1 三种取法,取决于你要多少

整包、目录递归、对象存储同步,三条路拿到的是同一份内容。整包 74.6 MB,这个体量下直接下 ZIP 最省事。

#-- 方式一:整包下载(ZIP 约 74.6 MB)
wget -c https://physionet.org/content/tollet/get-zip/1.0.1/ -O tollet.zip

#-- 方式二:只抓实验信号目录,不下载参考 XML
wget -r -N -c -np --cut-dirs=3 https://physionet.org/files/tollet/1.0.1/ECG_EXP/

#-- 方式三:从公开桶同步,适合脚本化流水线
aws s3 sync --no-sign-request s3://physionet-open/tollet/1.0.1/ ./tollet
方式 适合的场景 注意
整包 ZIP 第一次接触、要完整复现 需自行解压
目录递归 只要实验信号或只要参考 注意 --cut-dirs 的层数
对象存储同步 流水线、断点续传 无需账号,但需装 AWS CLI
目录 大小量级 是否必需
ECG_EXP/ 数百兆,单文件约 2.5 MB 主体,必需
ECG_REF/ 数十兆 只有做形态对照时才需要
Script/ 几十 KB 建议一并取,读法有参考价值
DataSet.csv 5.8 KB 必需,人群信息全在这里

5.2 体积与目录的账

未压缩 520.1 MB,压缩后 74.6 MB,压缩比接近七比一——每个采样点都是十进制整数加制表符,冗余很高。

项 数值 口径
未压缩总量 520.1 MB 官方文件列表
ZIP 包 74.6 MB 官方下载按钮
实验信号文件数 145 目录逐项
参考文件数 23 目录逐项
元数据行数 149 条记录 表体行数
单个信号文件 约 2.5 MB 抽样核对

单文件约 2.5 MB,按每分钟六万个采样点、每点十一列估算,五分钟的会话大致就是这个量级:全量读进内存也不过数百兆,不需要流式处理。

估算项 数值 依据
每秒字节数 约 50 字节 十一个短整数加制表符
每分钟点数 60000 1 kHz 乘 60
五分钟点数 300000 上限时长

5.3 读一条实验记录

读文本文件只需三行代码,但三处必须显式处理:跳过头注释、按制表符切分、把整数换算成毫伏。通用心电库读不了,因为文件里没有头文件、增益声明与导联名。

步骤 关键点 常见错误
跳过注释 前两行以井号开头 用固定行号跳过第一行就开读
切分 制表符,不是逗号 用默认空白切分导致列错位
换算 取反、归一、去中点、乘 3 直接用原始整数当幅度
通道选择 第 6 至第 9 列 把 nSeq 当信号
import numpy as np

def read_record(path):
    #-- 井号开头的两行由 loadtxt 自动跳过
    x = np.loadtxt(path, delimiter="\t", dtype=np.int32)
    raw = x[:, 5:9]
    mv = ((1024 - raw) / 1024 - 0.5) * 3
    return {"nseq": x[:, 0], "mv": mv, "fs": 1000}

rec = read_record("ECG_EXP/001.txt")
print(rec["mv"].shape, rec["mv"].min(), rec["mv"].max())
print("nSeq 取值", np.unique(rec["nseq"]))

最后一行打印出来只有十六个 nSeq 值。这不是数据损坏,而是四位计数器的正常回绕。它能做的唯一一件事是查丢包:相邻两行差值不等于 1(按模 16 计),中间就有样本丢失。

检查项 预期 不符时的含义
列数 11 文件被截断或格式变动
nSeq 取值 0 至 15 出现其它值说明解析错位
步长 恒为 1(模 16) 跳变说明丢包
幅度范围 正负 1.5 毫伏内 超出说明未换算或数据异常

5.4 读一份参考 XML

参考文件是 GE 的私有结构,命名空间指向 Sapphire 记录格式。十二个导联各有两个数组:五千点的十秒原始波形与六百点的中位模板,二者都以空格分隔的短整数塞在属性里。

import xml.etree.ElementTree as ET
import numpy as np

def read_ref(path):
    root = ET.parse(path).getroot()
    out = {}
    for e in root.iter():
        #-- 标签带命名空间,按后缀匹配最省事
        if not e.tag.endswith("ecgWaveform"):
            continue
        lead = e.attrib.get("lead")
        size = e.attrib.get("asizeVT")
        v = np.array(e.attrib.get("V", "").split(), dtype=np.int32)
        if size == "5000":
            out[lead] = v
    return out

ref = read_ref("ECG_REF/69.XML")
print(sorted(ref), {k: v.shape for k, v in list(ref.items())[:2]})
属性 含义 取值示例
lead 导联名 I、II、AVR、V1 至 V6
asizeVT 数组长度 5000 或 600
V 样本值,空格分隔 短整数序列
VT 数据类型 xs:short

五千点对应十秒,折算每秒五百点,与实验路的 1 kHz 不同,跨模态比较前必须重采样。六百点模板对应一个心搏,官方脚本硬编码「R 波在模板第 200 点」,换机型即失效。

数组 点数 折算 用途
十秒波形 5000 每秒 500 点 节律与整体形态
中位模板 600 约 1.2 秒 单搏形态比较

5.5 建一张总索引

开始分析前先花十分钟,把元数据、文件清单与参考覆盖拼成一张表。它决定了每行代码能处理哪些记录,也决定了样本量会在哪一步塌陷。

索引列 来源 用途
record_id 文件名 主键
subject_id 文件名下划线前 同人分组
session 文件名后缀 重复会话识别
age、sex、weight、height 元数据表 协变量与分层
has_ref 参考目录是否存在同名文件 决定能否做参考对照
n_samples 读文件行数 时长
shape 数组形状 完整性检查
import csv, re
from pathlib import Path

def build_index(root="tollet"):
    meta = {}
    with open(Path(root) / "DataSet.csv", encoding="utf-8-sig") as f:
        #-- 分号分隔,表头字段带尾随空格
        for row in csv.DictReader(f, delimiter=";"):
            meta[row["ID"].strip()] = {
                k.strip(): (v or "").strip() for k, v in row.items() if k
            }
    refs = {p.stem for p in (Path(root) / "ECG_REF").glob("*.XML")}
    rows = []
    for p in sorted((Path(root) / "ECG_EXP").glob("*.txt")):
        rid = p.stem
        sid = rid.split("_")[0]
        m = meta.get(rid, {})
        rows.append({
            "record_id": rid,
            "subject_id": sid,
            "has_ref": rid in refs,
            "age": m.get("Age"),
            "sex": m.get("Gender"),
            "weight": m.get("Weight"),
            "height": m.get("Height"),
        })
    return rows

idx = build_index("tollet")
print(len(idx), sum(r["has_ref"] for r in idx))
常见问题 表现 处理
表头尾随空格 Weight 取不到值 读入时统一 strip
BOM 首列名带不可见字符 用 utf-8-sig 打开
参考缺失 has_ref 为假 做参考对照时过滤
会话后缀 同人出现多行 以 subject_id 聚合

5.6 切窗与切分:别让同一分钟同时进训练与测试

单条记录最长五分钟,切窗是必然的。问题在于切分单位:如果按窗随机划分,同一条记录相邻的两窗会同时出现在训练与测试里,两者共享绝大部分样本,评测结果会明显虚高。

切分单位 泄漏风险 适用场景
随机按窗 高,相邻窗高度重叠 不推荐
按记录 低 单次会话任务
按受试者 最低 跨人泛化评估
按会话 中 同人跨会话研究
import numpy as np

def windows(sig, fs=1000, win=10.0, step=5.0):
    #-- sig 形状为 采样点 乘 4,单位毫伏
    L, S = int(win * fs), int(step * fs)
    out = []
    for i in range(0, sig.shape[0] - L + 1, S):
        w = sig[i:i + L].astype("float32")
        if np.isnan(w).any():
            continue
        out.append(w)
    return np.stack(out) if out else np.zeros((0, L, sig.shape[1]))

def split_by_subject(rows, frac=0.2, seed=0):
    subs = sorted({r["subject_id"] for r in rows})
    rng = np.random.default_rng(seed)
    rng.shuffle(subs)
    cut = int(len(subs) * frac)
    test = set(subs[:cut])
    return ([r for r in rows if r["subject_id"] not in test],
            [r for r in rows if r["subject_id"] in test])
参数 常见取值 影响
窗长 5 至 30 秒 太短丢节律信息,太长样本少
步长 窗长的一半 步长越小样本越多,泄漏风险越高
标准化 按通道各自去均值 四路基线不同,不可共用
切分 按受试者 结论最保守,也最可信

5.7 六个最容易出错的地方

其一,把 nSeq 当时间轴。 它是四位计数器,每十六个样本回绕一次,当横坐标会得到一条周期性归零的锯齿。

其二,用原始整数当幅度。 0 到 1023 是编码,不是微伏也不是毫伏。不换算就做阈值检测,阈值只能按编码定,换批数据即失效。

其三,把四路当四导联。 四路是同一部位的四种纹理,形态高度相关。当独立导联做空间重建,等于假设四个几乎重合的观测点能张成三维空间。另外三条——忽略哨兵值、未配准就逐点比较、把五分钟当固定长度——同下表。

错误 症状 修法
nSeq 当时间轴 横坐标每十六点归零 用行号除以采样率
原始整数当幅度 幅度在数百量级 按官方公式换算毫伏
四路当四导联 通道间相关极高 按纹理分组,不做空间重建
忽略哨兵值 均值出现巨大负偏 先剔除负三万二千七百六十八
未配准就逐点比较 相关系数接近零 先用 R 波估计时移
固定长度切窗 末尾残缺 丢弃或补齐并标记

§6 与库内词条的关系

6.1 关系图谱

这份库在站内处在三个标签的交界:心电信号、可穿戴传感、心血管疾病。它与临床心电库的关系是信号同源,与可穿戴类的关系是场景同源,与生物识别类的关系是方法同源。

关系类型 相关词条方向 具体关系
信号同源 各类心电数据库 同为体表电位,但导联体系不同
场景同源 可穿戴与家庭监测资源 同为非临床环境采集
方法同源 心电生物识别研究 同一团队的前作即身份识别
硬件同源 开源生物电前端相关资源 同为 BITalino 系采集
人群对照 健康志愿者队列 同为便利样本,非病例对照

6.2 检索路径

想找「能用大腿或坐姿取心电的数据」,路径是从生理信号进,按可穿戴传感筛;想找「带标准十二导联参考的非常规导联数据」,路径是从心电信号进,按参考配对筛。两条路径都会落到这份库,但关心的字段完全不同。

检索意图 关键词组合 落点
非常规部位取心电 thigh ECG、off-the-person 本库
干电极材料研究 dry electrode、texture 本库的四纹理设计
家庭场景可行性 home monitoring、toilet seat 本库与座圈类研究
心电身份识别 ECG biometrics 本库的重复会话
关键词组 单独使用的问题
只用 toilet 会混入大量卫浴产品与无障碍设计文献
只用 ECG dataset 会淹没在临床心电库里
只用 dry electrode 会命中材料学论文,不含公开数据
组合三组 命中率最高

6.3 与库内心电词条的分工

库内多数心电词条回答「这一拍是什么」,本库回答「在没有诊室条件的房间里,能不能取到够用的心电」。前者需要标签与导联体系,后者需要现场记录与材料对照。两者叠加,才构成从可行性到诊断的完整链条。

你的问题 该用哪一类
这个心律属于哪一类 带标注的临床心电库
这个部位能不能取到信号 本库
干电极纹理怎么选 本库
诊断级形态测量 临床十二导联库

§7 质量评估与局限性

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

评价之前先把口径摆正:它是可行性证据,不是诊断数据集。用诊断数据集的标准去量,导联不全、标签缺失、量化太浅、人群太窄四条全中,但这四条都不是疏漏,而是设计目标决定的取舍。

评价口径 关注的指标 在本库上的结论
当诊断数据集评 导联完整性、标签密度、量化深度 全部不合格
当可行性证据评 现场真实性、对照设计、可复现性 基本合格
当工程基线评 格式清晰度、读取难度、许可 合格,但许可有分歧

摆正之后真正该问三件事:它保存的采集条件别处能不能再凑齐,四纹理对照是不是同一次坐姿下完成的,缺陷是设计取向还是执行疏漏。

问题 答案 依据
采集条件可否复现 可以,硬件清单完整 官方方法与器件型号
四纹理是否同场 是,四路同步采样 文件列结构
缺陷是取向还是疏漏 多为取向,少数为疏漏 官方说明与目录核对

7.1 五维评分

把数据交换领域常用的 DAIMS 框架借来评分——可发现、可访问、可互操作、可复用、可追溯——这份库的长短分布得很清楚:信息恰恰掉在了「语义」这一层。

维度 评分 依据
可发现 高 有 DOI、有平台收录、有配套论文
可访问 高 无需登录,整包可下
可互操作 低 无标准心电格式,列语义写在 JSON 头里
可复用 中 许可宽松,但需自写解析与清洗
可追溯 中 有机构与伦理批号,无采集日期与设备序列号
维度 具体短板 缓解办法
可互操作 不是 WFDB,也不是 EDF 自行转成 WFDB 再进工具链
可互操作 参考为厂商私有 XML 只提取波形数组,丢弃其余节点
可追溯 无逐条采集日期 按版本与论文时间窗描述
可复用 无官方基线模型 以论文中的质量分析为参照

五项里前两项接近满分,因为它挂在了被广泛索引的平台上;后三项是新库的典型特征:数据干净,语义却留在了各环节工具的私有格式里。

7.2 标注与元数据的真实覆盖

严格说,这份库没有「标注」这个层。它有的是每人六个元数据字段,以及参考 XML 里的机器判读结果:没有逐搏标签,没有节律标签,没有质量分级,也没有诊断结论。

信息层 是否存在 粒度 可用性
人口学元数据 存在 每人一条 直接可用
体格指标 存在 每人一条 直接可用
备注 存在 多数留空 有限
逐搏标签 不存在 无 需自行检测
节律标签 不存在 无 需自行判读
质量分级 不存在 无 需自行定义
机器判读 参考文件内 每份一次 仅 23 条有
官方说法 仓库内说法 差异
平台许可为 CC BY 4.0 README 称仅限研究,禁止再分发 是否允许再分发
ID 为受试者标识 一条记录一个 ID,含会话后缀 是记录键还是人键
性别取 M 或 F 表中取值为 Male 或 Female 取值形式
参考文件含采集时间戳 至少一份文件该字段为空 字段存在不等于已填

这四行不是要找错,而是提醒文档与数据之间存在口径差。遇到这类差异,把两个口径并列写清并注明以哪个为准未知;就许可而言,在作者书面确认前按更严格的一方行动是风险最低的选择。

7.3 已知的、可枚举的偏差

偏差 表现 影响 应对
人群偏差 86 人,青年为主,单国籍 老年与肥胖段代表性弱 明确写成便利样本
场景偏差 卫生间静坐,非真实如厕 高估日常信号质量 在方法段声明
设备偏差 单一前端、单一增益 结论绑定 BITalino 不外推到其它器件
带宽偏差 0.5 至 40 Hz 形态学指标受限 只做相对比较
量化偏差 10 位 分辨率约 2.9 微伏 不做毫伏级精测
参考偏差 仅 23 条,仅十秒 配对样本量小 按案例报告而非统计
标签偏差 无逐搏与诊断标签 无法有监督训练 改做自监督任务
记录数口径 元数据 149 行,信号 145 个 有 4 条只有元数据 以文件为准做索引

八条里前三条是设计取向,改不了;中间三条由硬件与协议决定,只能在分析层面规避;后两条是文档与目录的口径差,建索引时处理掉即可。§4.4 的案例在这八条上都有明确落点:同一个人、两次会话、四路齐全、带参考。

7.4 外部验证矩阵

验证方式 是否可行 说明
与 12 导联形态对照 可行 23 条记录有参考,段级比对
与其它大腿心电数据对照 有限 公开同类数据极少
与消费级手环同期对照 不可行 无同期佩戴记录
重复测量一致性 可行 有重复会话,但仅覆盖部分人
专家二次判读 可行 参考段可重新判读
与病历或诊断对照 不可行 无病历可回溯

第四行是少见的长处:多数公开心电库每人只有一次记录,无法评估同人跨会话的稳定性,而本库有一部分人坐了两到三次。

验证需求 可用样本 结论强度
形态相似性 23 条配对 中等,可做案例报告
同人稳定性 重复会话记录 中等,样本有限
跨人泛化 86 人 弱,人群集中
临床一致性 无 不成立

7.5 它为何能持续:占住了一个没人认真占过的位置

公开心电库里绝大多数是已经标准化的东西:十二导联、动态心电、可穿戴单导联。大腿取心长期停在论文原型阶段,公开数据几乎为零。这份库把「四种纹理、同一坐姿、带部分参考」一次做齐,等于给这个方向立了一个可引用的基线。

它留下来靠三点:格式足够简单,两个文本文件加一份 CSV,半天能读完;平台层面许可允许商用与再分发;上下文足够完整,硬件型号、增益、滤波、伦理批号、招募方式全在页面上,五年后仍能照着复现。至于能不能长成大库,取决于这个方向还有没有人做——这一点数据本身回答不了。

§8 生态位与历史

8.1 历史沿革:从一篇概念验证到一份带 DOI 的数据

这条线可以按「证明什么」分段:先是聚合电极装在座圈上能取到心电,再是取到的信号能用于身份识别,然后是这套东西能产业化,最后才回到数据本身,把采集过程整理成可复用的库。

阶段 证明什么 形态 与本库的关系
概念验证 座圈取心可行 会议或期刊论文 提供方法学基础
身份识别 信号具备区分度 期刊论文 提供任务定义
产业化 材料与结构可落地 会议论文 提供硬件演进
数据公开 采集过程可复用 数据集与数据论文 本库
年份 产出 类型
2021 聚合电极座圈取心的设计与评估 期刊论文
2022 卫生间场景心电身份识别 期刊论文
2023 面向产业化的可行性 会议论文
2024 模板持久性评估 会议论文
2024 不可见生命体征监测,NATO 系列文集 文集章节
2025 PhysioNet 首版数据 数据集
2026 修订版与数据描述论文 数据集与期刊论文

这条时间线解释了一个细节:硬件用现成开发板而非自研板卡,是因为研究重心在电极与结构,用成熟前端能把变量压在电极这一层。

8.2 与前作谱系的差别

同一团队此前还发表过一项面向住院患者的研究,纳入三十名带不同心血管疾病的病人,讨论病理人群下的大腿心电特征。那项工作与本库不是同一批数据:本库是志愿者,那项是患者;本库公开原始波形,那项以分析结论为主。

维度 本库 病理人群研究
对象 86 名志愿者 30 名住院患者
目的 数据公开与可行性 病理条件下的信号特征
标签 仅人口学 含临床分组
是否公开原始数据 是 未见公开
前作 与本库共享的部分 不同之处
2021 概念验证 电极材料与座圈结构 样本极少,无公开数据
2022 身份识别 同一套硬件 目标是分类而非数据
2023 产业化 结构与材料工艺 关注制造可行性
2024 模板持久性 重复会话的思路 关注生物特征稳定性

8.3 生态位:一个「日常物件即传感器」的样本

它不是心电库里的大库,而是「传感器进入家具」这条路线上的第一个公开脚印:把此前只存在于论文原型里的采集方式,变成可下载、可复算、可批评的对象。

参照系 本库的位置 差异
临床心电库 边缘,非标准导联 无诊断价值,有场景价值
可穿戴数据 相邻,同为非临床 采集由家具完成,非穿戴
智能家居健康数据 核心,正是该场景 目前公开数据极少
生物识别数据 相邻,方法同源 可用于模板研究
对比对象 共同点 本库的独特性
手指电极识别库 干电极、off-the-person 接触压力由体重提供,更稳定
智能座圈心衰监测 同一载体 公开了原始波形与四纹理对照
座椅式心电 坐姿采集 座圈位置更固定,重复性更好
床垫式心电 无感、长时 本库时长更短,但对照更完整

8.4 谁在用它,用来做什么

使用者类型 典型用途 需要额外准备
生理信号算法工程师 检测、降噪、质量评估 自建标签与清洗流程
家庭监测产品团队 干电极选型与结构验证 与自家硬件做对照
生物识别研究者 同人跨会话模板研究 选取重复会话子集
教学人员 演示非标准导联与干电极噪声 准备与标准心电的对比图
综述作者 off-the-person 方向的数据点 与其它公开集并列

第二类最容易上手,因为电极选型恰好是这份库唯一做成对照实验的部分;第三类最能挖出别人没注意的结构;第一类会失望,没有标签就做不了有监督训练。

§9 使用指引

9.1 三种角色的路径

角色 起点 第一个产出 常见卡点
算法工程师 先读 §2.2 的列字典与 §5.3 的读取代码 一份带质量标记的索引表 把 nSeq 当时间轴
产品与硬件团队 先看 §4.2 的四纹理对照 一张纹理与信号质量的对照表 跨人比较,混入个体差异
教学人员 先跑 §9.2 的最短流程 一张四路并排的波形图 忘了换算,把编码当毫伏

9.2 一条最短的可用流程

从零到一张四路并排图,四步足够。

#-- 第一步:取一个实验文件与元数据表
curl -sO https://physionet.org/files/tollet/1.0.1/ECG_EXP/67_1.txt
curl -sO https://physionet.org/files/tollet/1.0.1/DataSet.csv

#-- 第二步:装依赖
pip install numpy matplotlib
import numpy as np
import matplotlib.pyplot as plt

x = np.loadtxt("67_1.txt", delimiter="\t", dtype=np.int32)
mv = ((1024 - x[:, 5:9]) / 1024 - 0.5) * 3
fs = 1000
t = np.arange(mv.shape[0]) / fs

fig, axes = plt.subplots(4, 1, figsize=(10, 7), sharex=True)
for k, ax in enumerate(axes):
    ax.plot(t, mv[:, k], lw=0.6)
    ax.set_ylabel("A%d" % (k + 1), fontsize=8)
axes[-1].set_xlabel("seconds")
fig.tight_layout()
fig.savefig("67_1_four_leads.png", dpi=150)

图上若看不到规律的尖峰,先确认取的是第 6 至第 9 列,再确认换算没漏掉乘 3;把四路图与 §4.4 的案例并排放,能看出同一坐姿下四路的幅度与噪声差异。

步骤 检查点 出错的表现
下载 文件行数大于零 拿到的是重定向页面
读取 数组列数为 11 分隔符写错,列数变成 1
换算 幅度在正负 1.5 内 幅度在数百量级
绘图 能看到周期性尖峰 一条平线或纯噪声

9.3 引用方式

字段 内容 用途
数据集 Silva AS, Plácido da Silva H, Correia M, Gonçalves da Costa AC, Laranjo S. tOLIet (version 1.0.1). PhysioNet, 2026 官方指定引用
论文 Silva AS 等. Single-lead Thigh ECG Dataset (tOLIet) with Analysis of BMI Effects on Cardiac Signal Quality. Sci Data 13(1), 2026 方法学引用
标识 DOI 10.13026/411k-1476 精确定位到版本
平台 Pollard T 等. PhysioNet as a global platform for biomedical research. Nature Health, 2026 平台引用
许可 CC BY 4.0 署名要求
场景 建议引用组合
只用了数据 数据集引用加平台引用
用了方法细节 再加数据描述论文
复现实验 三者全引,并写下载日期
商用产品文档 数据集引用加许可说明

最容易漏的是版本:两个版本号只差末位,下载日期不同可能拿到不同内容。

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

检查点 预期 不符时的常见原因 处理
记录数 145 个实验文件 只下了部分目录 重新同步目录
元数据行数 149 条 用逗号解析 改分号并去 BOM
参考覆盖 23 个 XML 目录名大小写写错 用大写 XML 匹配
单文件列数 11 制表符被替换 检查下载是否被转码
采样率 1000 从头信息里读 不要硬编码

第三项值得单独说:参考文件扩展名是大写 XML,而 Python 的 glob 区分大小写,在 Linux 上写 *.xml 一个都匹配不到,脚本不报错,只静默返回空集,后续对照分析全部跳过。

静默失败 症状 排查方式
参考匹配为空 has_ref 全为假 打印匹配到的文件数
元数据键不匹配 年龄全为空 对比 ID 首尾空白
通道取错列 波形像台阶 打印前五行原始值

9.5 三类人群的最短路径

只想要一张图。 装 numpy 与 matplotlib,读一个文件,画四路。不需要元数据,也不需要参考文件。

要一份可训练的张量。 先建索引,按受试者切分,再按十秒窗切片并逐通道标准化。关键不是窗长,而是切分单位。

要做电极纹理比较。 取重复会话子集,在同一会话内比四路的信噪比或检出率,再跨会话看排序是否稳定;§4.4 的案例给出了最小单元。

路径 最少步骤 主要风险
只看图 读一个文件并绘图 没换算,幅度失真
建张量 索引、切分、切窗、标准化 按窗随机切分导致泄漏
纹理比较 选重复会话,四路互比 跨人比较混入个体差异

9.6 复现性清单:别人能不能照你的描述重建

必写项 为什么必须写 常见缺漏
使用的记录编号 文件名本身不表意 只写「若干条」
会话是否重复 同人多次会话影响切分 未说明
通道选择 四路选哪一路结论不同 只说「大腿心电」
换算公式 不换算则幅度不可比 只写「已预处理」
滤波设置 数据本身已带通 重复滤波
切分单位 按人切与按窗切结论不同 只写「随机划分」
参考配准方法 无同步标记 未交代
下载版本与日期 两个版本并存 只写数据集名

八项里第五项最容易被忽略:数据在采集端已过 0.5 至 40 Hz 带通,分析流程再加一次,QRS 幅度会进一步下降,而方法段里往往只用「带通滤波」一句带过。

§10 AI 使用声明

项目 内容
写作方式 由人工智能辅助撰写,人工校核事实与表述
事实来源 官方项目页、仓库 README、目录清单、元数据表、参考 XML 结构、Europe PMC 摘要
未使用的手段 未做标签频次、空值率或年龄分布等统计,未逐条列举样本
数字口径 官方给出什么就写什么,换算与推算单独标注
不确定项处理 标注「官方未说明」或「读法」,不写成事实
表格中的对照 结构对照为编辑整理,非官方结论
封面图 由生成模型按风格提示词产出,不含真实数据
更新责任 官方页面修订时以官方为准,本页随之更新

常见误读(避坑清单)

说法 实际 证据
tOLIet 是拼写错误 是 toilet 的变体,中段 OLI 大写 官方标题与致谢中的企业名
四路信号是四个标准导联 同一部位四种纹理的差分信号 官方数据描述与列名 A1 至 A4
数据是在真实如厕时采集的 静坐至多五分钟,不在使用过程中 官方 Usage Notes
这是一份病人数据集 志愿者,心脏问题未经专科确认 官方 Methods
有逐搏或心律标注 只有人口学与基本留空的备注 目录与元数据表
参考数据覆盖全部记录 仅 23 条,且只有十秒 参考目录文件数
实验与参考逐点同步 同批记录,无同步标记 官方未提供对齐信息
采样 1 kHz 就有 500 Hz 带宽 带通上限 40 Hz 官方滤波设置
可以直接算 ST 段 10 位量化加带通,精度不足 换算与滤波参数
许可是纯研究用途 平台写 CC BY 4.0 项目页许可栏

FAQ

问:tOLIet 到底怎么读,为什么中间三个字母是大写?
答:官方全名是 tOLIet: Single-lead Thigh-based Electrocardiography Using Polimeric Dry Electrodes。名字是把 toilet 的中段换成大写 OLI,与提供资源的卫浴企业同名。官方没有解释这层关系,因此这只是读法,不宜当事实引用(§3.5)。

问:它和普通心电数据库最根本的区别是什么?
答:采集位置与导联体系。常规库记录的是胸导联与肢体导联,本库记录的是大腿后侧与座圈电极之间的四路差分信号,没有任何一路对应标准导联。它回答的是「这个位置能不能取到心电」,不是「这个心电属于哪一类」。

问:四路信号该怎么用?
答:当四组并行的观测,而不是四个导联。它们的差别在电极表面纹理,形态高度相关。可以做纹理间的质量比较、可以做多路融合的检出率提升,但不要做空间重建或电轴计算(§4.2)。

问:为什么同一个人有好几个文件?
答:重复会话。八十六人共产生一百四十九条记录,一部分人坐了两到三次,文件名以 _1、_2 区分。这是它相对同规模心电库的额外价值,可用于同人跨会话的模板稳定性研究(§4.4 的案例)。

问:备注字段能当标签用吗?
答:不能。备注是自由文本,多数记录留空,填了的也只是一句话描述,既非结构化也不构成诊断。要做有监督学习,只能自建标签,或改用带标注的心电库。

问:十二导联参考能直接拿来对齐吗?
答:不能直接对齐。参考只有十秒,实验段最长五分钟,两套设备独立启动,没有同步标记。可行做法是用 R 波互相关估计时移,再在段级别做形态比较(§4.5)。

问:为什么参考 XML 里会出现负三万二千七百六十八?
答:那是短整型的最小值,被用作「无数据」的哨兵。中位模板的尾部常用它填充。把它当信号值参与统计,会得到断崖式的异常值,读取时必须先剔除(§5.4)。

问:1 kHz 采样是不是意味着可以做高频分析?
答:不是。采样率只决定时间分辨率,实际带宽由 0.5 至 40 Hz 的带通决定。40 Hz 以上没有有效成分,做高频 QRS 或晚电位分析没有意义(§3.3)。

问:能商用吗?
答:平台页面写的是 CC BY 4.0,允许商用,条件是署名;仓库 README 却写仅限研究、禁止再分发。两个口径并存,官方未说明以哪个为准。稳妥做法是先取得作者书面确认(§7.2)。

问:为什么元数据有一百四十九条而信号文件只有一百四十五个?
答:两处口径不同。元数据按记录登记,信号目录按实际归档。差额的四条只有元数据、没有对应文本文件。建索引时应以文件为准,并把差异记进日志(§7.3)。

问:能做心电身份识别吗?
答:可以,而且这是它的设计用途之一。前作已经用同一套硬件做过识别实验,本库的重复会话正好支持同人跨会话的模板研究。但样本只有八十六人,做大规模识别基准不够。

问:和消费级手环的数据比,哪个更适合做产品预研?
答:本库更接近可复现的实验条件:同一硬件、同一坐姿、四纹理对照、带部分参考。手环数据的场景更真实,但变量不可控。做电极与结构的选型,用本库;做真实场景的鲁棒性,用手环或自采数据(§2.5)。

术语表

术语 英文 在本库中的含义
大腿心电 thigh ECG 电极置于大腿后侧取得的心电信号
单导联 single-lead 一对电极之间的电位差,非标准导联
不可见心电 invisible ECG 传感器嵌入家具,人身上无器件
干电极 dry electrode 不需导电膏的电极,靠压力接触
聚合电极 polymeric electrode 以高分子材料制成的电极
电极纹理 electrode texture 电极表面的几何形状,本库四种
座圈 toilet seat 承载电极的家具部件
差分信号 differential signal 两电极之间的电位差
参考心电 reference ECG 临床十二导联,作为形态基准
中位模板 median template 多个心搏逐点取中位数得到的形态
哨兵值 sentinel value 负三万二千七百六十八,表示无数据
前端 analog front end 放大与滤波的模拟电路
增益 gain 本库为一万一千
带通 band-pass 本库 0.5 至 40 Hz
量化位数 bit depth 本库 10 位
采样率 sampling rate 本库 1 kHz
序号 nSeq 四位循环计数器,用于发现丢包
会话 session 一次坐上座圈的完整采集
重复会话 repeat session 同一受试者的第二次或第三次采集
便利样本 convenience sample 非随机抽取的志愿者集合
十二导联 12-lead ECG 标准临床心电导联体系
私有格式 proprietary format 厂商自定义的 XML 结构
配准 registration 把两段信号在时间上对齐
信号质量 signal quality 可检出心搏的比例与噪声水平
生物识别 biometrics 用生理信号做身份判定
可发现 findable DAIMS 维度之一,有无 DOI 与索引
可互操作 interoperable DAIMS 维度之一,格式是否通用
可追溯 traceable DAIMS 维度之一,能否回溯来源

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 86 官方摘要 官方
记录数(声明) 149 官方摘要与元数据表 官方
实验信号文件数 145 目录逐项 官方文件
参考文件数 23 目录逐项 官方文件
女性人数 50 官方摘要 官方
男性人数 36 官方摘要 官方
年龄均值 31.73 官方摘要 官方
体重均值 66.89 官方摘要 官方
身高均值 166.82 官方摘要 官方
信号路数 4 官方摘要与列结构 官方
采样率 1000 官方方法与头信息 官方
量化位数 10 官方方法与头信息 官方
增益 一万一千 官方方法 官方
带宽 0.5 至 40 Hz 官方方法 官方
单次最长时长 五分钟 官方方法 官方
参考段时长 十秒 官方说明与点数 官方
未压缩体积 520.1 MB 官方文件列表 官方
ZIP 体积 74.6 MB 官方下载项 官方
版本 1.0.1 官方页面 官方
伦理批号 INV496 官方伦理段 官方
每级量化幅度 约 2.9 微伏 3 毫伏除以 1024 推导
参考采样 每秒 500 点 5000 点除以 10 秒 推导

附录 B:数字的来源分层

层级 含义 本页涉及的数字
官方页面 PhysioNet 项目页直接给出 人数、性别构成、均值、许可、版本、体积
官方文件 目录清单、README、元数据表、XML 结构 文件数、列结构、字段取值、点数
论文摘要 Scientific Data 与 Europe PMC 摘要 用途定位与质量分析的题材,不作规模来源
推导 由官方数字换算 每级量化幅度、参考采样率、单文件体积估算
读法 依据命名与致谢提出的解释 tOLIet 与卫浴企业同名的推断

前三层可直接引用;第四层可复算,引用时需自行计算;第五层必须写明是推断,不能当官方定义。

附录 C:完整参考文献

序号 文献 用途
1 Silva AS, Plácido da Silva H, Correia M, Gonçalves da Costa AC, Laranjo S. tOLIet (version 1.0.1). PhysioNet, 2026. DOI 10.13026/411k-1476 数据集引用
2 Silva AS, Correia MV, Laranjo SM, Fonseca H, Gonçalves da Costa AC, Plácido da Silva H. Single-lead Thigh ECG Dataset (tOLIet) with Analysis of BMI Effects on Cardiac Signal Quality. Sci Data 13(1), 2026. DOI 10.1038/s41597-026-06713-6 数据描述论文
3 dos Santos Silva A, Almeida H, da Silva H, Oliveira A. Design and evaluation of a novel approach to invisible electrocardiography in sanitary facilities using polymeric electrodes. Sci Rep 11:6222, 2021 概念验证
4 Silva AS, Correia MV, de Melo F, da Silva HP. Identity recognition in sanitary facilities using invisible electrocardiography. Sensors 22(11):4201, 2022 身份识别
5 Pollard T 等. PhysioNet as a global platform for biomedical research. Nature Health, 2026 平台引用
6 Creative Commons. Attribution 4.0 International Public License 许可文本

附录 D:任务代码

一段把全库读成索引、并给出每条记录可用路数的脚本。

import csv
import numpy as np
from pathlib import Path

def scan(root):
    root = Path(root)
    refs = {p.stem for p in (root / "ECG_REF").glob("*.XML")}
    rows = []
    for p in sorted((root / "ECG_EXP").glob("*.txt")):
        x = np.loadtxt(p, delimiter="\t", dtype=np.int32)
        mv = ((1024 - x[:, 5:9]) / 1024 - 0.5) * 3
        #-- 用标准差粗判某路是否接触良好
        usable = [int(np.std(mv[:, k]) > 0.05) for k in range(4)]
        rows.append({
            "record": p.stem,
            "subject": p.stem.split("_")[0],
            "seconds": round(x.shape[0] / 1000, 1),
            "usable": sum(usable),
            "has_ref": p.stem in refs,
            "nseq_ok": bool(np.all(np.diff(x[:, 0]) % 16 == 1)),
        })
    return rows

rows = scan("tollet")
print(len(rows), sum(r["has_ref"] for r in rows))
print([r for r in rows if r["record"] == "67_2"])

脚本里有两处刻意的写法。第一,标准差阈值 0.05 毫伏只用来粗筛接触良好与否,不作为质量结论;不同纹理的正常幅度不同,阈值应按通道分别设定。第二,丢包检查用模十六的差值,因为 nSeq 是四位计数器,正向递增时差值为 1,回绕时差值为负十五,取模后仍为 1。

输出列 含义 用途
record 记录编号 主键
subject 受试者编号 同人分组
seconds 时长 切窗可行性
usable 标准差超过阈值的路数 粗筛
has_ref 是否有参考 对照分析
nseq_ok 是否无丢包 完整性

跑完之后,把 usable 与 has_ref 交叉起来,就得到四类记录:四路齐全且有参考、四路齐全但无参考、部分可用、几乎不可用。§9.5 说的三条路径,起点都是这张表。

附录 E:如果只记五件事

序号 要点
一 这是首个公开的大腿单导联心电数据集,电极嵌在马桶座圈里,人坐下即采集
二 86 名志愿者、149 条记录,四路信号来自四种表面纹理的干电极,非四个标准导联
三 1 kHz 采样、10 位量化、0.5 至 40 Hz 带通,规格接近消费级器件,不是诊断级
四 仅 23 条记录带十秒 12 导联参考,且无同步标记,只能段级比对
五 无逐搏与诊断标签,适合做信号质量、纹理选型、身份识别与可行性论证

编辑说明

本页按 v4 编辑纪律撰写:只写规模、结构、边界三类数字,不做分布统计与逐条样本明细;官方自相矛盾处并列两个口径,不下判断。页面中的量化幅度、参考采样率与体积估算均标注为推导,与官方表述分开。若 PhysioNet 页面修订版本号或更新文件列表,以官方为准,本页随之更新。


相关数据集导航

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

  • cebsdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • cardiac-accel-canine-porcine — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • cinc-2011 — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • butppg — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • cardiowave-portable — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • butqdb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
  • drivedb — 共享标签:生理信号 / 心电信号 / 可穿戴传感
  • physionet-cinc-2017 — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • icentia11k — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病
  • auricle-wearable-cv — 共享标签:生理信号 / 心电信号 / 可穿戴传感 / 心血管疾病

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

返回 AI-Ready 数据集