信息速览
OB-1 Fetal ECG Database 是 PhysioNet 上一份为胎儿窘迫研究准备的产时信号库。它的标题里只有「胎心电」四个字,实际内容却是两路同步电信号:经胎头电极取得的胎儿心电,和同时记录的子宫肌肉电活动。库的设计目标写在官方摘要第一句里——支持对电子胎心监护中那些非平稳信号做更进一步的处理,从而把「胎儿是不是缺氧了」这件事从经验判断变成可计算的判断。
它的规模与它的抱负不成比例。官方说已收集一百套以上的资料,每套覆盖一次完整的住院分娩过程,通常长达几个小时,并附有母体与新生儿的临床资料;但公开目录至今只有一条记录。这个落差不是页面的疏忽,而是这个库的当前状态:样本已放出来,主体仍在建设中。
因此这篇词条要回答的不是「这个库有多大」,而是「这个库现在是什么、以后可能成为什么、以及在这一刻它能替你做什么」。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | OB-1 Fetal ECG Database(官方页题头);同一项目的展示页标题写作 OB-1 Database |
| OB 指什么 | 官方未展开;按英文命名惯例应指 obstetrics,即产科,属推论 |
| 托管平台 | PhysioNet,由 MIT Laboratory for Computational Physiology 维护 |
| 版本与发布 | 1.0.0,发布于 2012 年 8 月 3 日 |
| DOI | 10.13026/C2D30V |
| 数据贡献者 | Nancy Oriol、Fred Bennet、Prateek Aggarwal |
| 公开记录数 | 1 条,记录名 p10143 |
| 官方称已收集 | 一百套以上,每套覆盖一次住院分娩全过程 |
| 通道 | 2 路:FECG(胎儿心电)、UC(子宫肌肉电活动) |
| 采样率 | 500 Hz,两路相同 |
| 公开样本长度 | 头文件记一千万零两千余个样本,约合五个多小时 |
| 数据体大小 | 39.1 MB(16 位双通道整型) |
| 标注 | 逐搏注释,注释器名 qrs,清单写作未审核 |
| 临床资料 | 官方称每套附母体与新生儿资料,公开目录中未见 |
| 许可 | Open Data Commons Attribution License v1.0 |
| 原始录制年代 | 二十世纪九十年代中期 |
§1 它要解决的具体麻烦
1.1 它的目标不是「多收一点胎心图」,而是让胎心变异可计算
电子胎心监护在产房里用了几十年,判读方法却长期停留在看图:基线在哪、有没有减速、减速和宫缩是什么关系、变异是窄还是宽。这套判断依赖判读者的经验,不同人看同一段图会给出不同结论,同一个人在不同时间看也会漂移。官方摘要把这个问题说得很直接:胎儿窘迫可能来自产时窒息或缺氧,正确识别它既能防止胎儿致病,也能避免不必要的剖宫产,而「正确识别」恰好是最难的一环。
OB-1 的思路是从信号本身找证据。它不再满足于监护仪输出的那条平滑曲线,而是去记录原始的胎心电与子宫肌电,再在这两个原始信号上计算心率变异性,观察频谱与时域特征如何随缺氧变化,以及胎心变异与宫缩信号之间是否存在可测的相关。这个思路成立的前提,是手里有足够长的、逐搏对齐的、同一次分娩内同步采集的双路信号。
这也解释了为什么它的每套资料要以「一次住院分娩全过程」为单位,而不是以「一段十分钟的片段」为单位。胎儿缺氧是一个过程,不是一个瞬间;变异性的变化要放在整个产程的尺度上才看得见。
1.2 三条常见的错误期待
第一条是把名字读窄。看到「Fetal ECG Database」,很容易以为它是一份胎心电的集合,像成人 Holter 库那样把若干段心电摆在一起供算法练习。实际上它的通道里始终有第二路——子宫肌肉电活动,而且官方对这两路信号的关系有明确主张:缺氧的变化要通过心率变异与宫缩信号的联合观察才能识别。只取其中一路,等于只用了它一半的设计意图。
第二条是把规模想大。PhysioNet 上不少库动辄几百上千条记录,使用者会默认这个库也是。官方那句「已收集一百套以上」恰好强化了这个错觉。但只要打开文件列表就会发现,目录里只有一个数据体、一个头文件、一个注释文件。一百套是采集成果,一条是公开成果,两者之间还隔着一个没有公布时间表的建设工程。
第三条是把标注当金标准。逐搏注释看起来像是专家一个个点出来的心跳位置,实际上注释器清单写的是 unaudited,头文件的辅助字符串写着 gqrs 这个自动检测程序的名字。它是算法产物,不是人工逐搏校对的产物。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 看一份产时双路原始信号的完整结构 | 一条长记录的完整 WFDB 三件套 | 够 |
| 练胎心电提取与 QRS 检测 | 单通道胎心电,自动逐搏标注可作起点 | 勉强够,需自建参考 |
| 研究胎心变异与宫缩的关系 | 两路同步、原始采样、覆盖数小时 | 够做方法学验证 |
| 训练或微调诊断模型 | 无标签、无结局、无临床资料 | 不够 |
| 做人群分层的统计 | 一条记录,无人口学字段 | 不够 |
| 复现某篇胎儿窘迫论文 | 论文所需的多例样本不存在 | 不够 |
| 教学演示 WFDB 读取 | 文件小、通道少、结构清楚 | 够,且很适合 |
| 与现代 CTG 数据集对齐 | 采样率与量纲都不同,需自建映射 | 可以,但要写清楚假设 |
这张表里最值得注意的一行是「研究胎心变异与宫缩的关系」。这正是库的设计初衷,而它是唯一一项在只有一条记录的情况下仍然成立的用途——因为这类研究关心的是两个信号之间在时间上的耦合形态,而不是统计意义上的效应量。
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 刚接手一个胎儿监护算法项目,需要一份真实数据熟悉格式 | 给你一条完整的 WFDB 双通道记录,当天就能跑通读写 | 先读完 §2.3 的解剖,再跑 §5.2 的读取脚本 |
| 手上只有 CTG 曲线数据,想补上原始电信号的视角 | 展示同一次分娩的原始信号长什么样,供你做对照 | 用它写清「曲线何时等于原始信号」的假设 |
| 在做胎心电提取研究,缺产时场景的真实样本 | 提供胎头电极直接测量的胎心电,与腹壁测量不同 | 把它与 §6 里几个腹壁库交叉比较 |
| 需要向评审专家证明方法可行,但没有预算采数据 | 用一条真实记录的完整流程说明可行性 | 说明结论限于单例,不外推到人群 |
| 计划做一个多例回顾研究 | 只能提供格式与流程范本 | 去 §6 找有规模的替代库 |
| 在写一篇关于历史数据抢救的短文 | 提供一段被抢救回来的记录与致谢要求 | 引用时保留 Techfusion Corp. 致谢 |
表格左列写的都是处境,而非特性。同样一条记录,对第一种人是格式样例,对第四种人是论证材料,对第五种人则是门槛。
1.5 一句话判断
它是一条被抢救回来的产时双路原始信号,配上一次尚未完成的采集计划;把它当格式范本和方法学沙盒,物有所值,把它当数据集,你现在拿到的是千分之一。
1.6 不适合谁:四条边界
第一,不适合需要统计功效的人。一条记录给不出任何组间比较,任何以它为样本算出的均值、方差、准确率,都只描述这一次分娩。
第二,不适合需要诊断标签的人。公开目录里没有胎儿窘迫的判定、没有脐血气、没有 Apgar,也没有转剖宫产与否。做有监督学习的人在这里找不到因变量。
第三,不适合把胎心电理解成腹壁采集的人。这里的胎儿心电来自胎头电极,信噪比远高于腹壁电极;直接用它训练出来的提取算法,迁移到腹壁数据上会明显退化。
第四,不适合需要可重复多次测量的人。每次分娩只有一套资料,同一个人无法有第二次,因此凡涉及重复测量一致性的设计都做不了。
§2 数据构成与规格
2.1 三件套与一条流水号
公开目录里的文件一共六个,全部躺在同一个层级,没有子目录。三个是数据文件,三个是清单类文件。数据文件遵循 WFDB 的经典三件套:头文件 .hea 描述通道与采样率,数据体 .dat 存 16 位整型采样,注释文件 .qrs 存逐搏位置。清单类分别是记录清单、注释器清单与校验清单。
记录名是 p10143。前导的字母 p 是 PhysioNet 多年沿用的流水号约定,后面的五位数是原始编号。这个编号里没有任何可解释的字段——不是年份、不是中心号、不是病例分类号,官方也没有说明它的生成规则。
| 文件名 | 大小 | 作用 | 格式 |
|---|---|---|---|
p10143.hea |
88 字节 | 通道定义、采样率、记录长度 | WFDB 头文件,ASCII |
p10143.dat |
39.1 MB | 两路 16 位整型采样交错存 | WFDB 数据体,二进制 |
p10143.qrs |
171.7 KB | 逐搏注释 | WFDB 注释,二进制 |
RECORDS |
7 字节 | 记录清单,只有一行 | 纯文本 |
ANNOTATORS |
31 字节 | 注释器清单,只有一行 | 纯文本 |
SHA256SUMS.txt |
377 字节 | 五个文件的校验和 | 纯文本 |
目录标称解压后总量 39.3 MB。这个数字在 PhysioNet 上属于极小的一档,小到可以在浏览器里点开看清每一个字节,这也意味着把它接进流水线的成本几乎可以忽略。
2.2 字段与记录的完整字典
头文件只有三行,但三行里的每个记号都承载含义,值得逐项摊开。
| 位置 | 记号 | 含义 | 需要留意的地方 |
|---|---|---|---|
| 首行第 1 列 | p10143 |
记录名 | 与文件名同名,无附加语义 |
| 首行第 2 列 | 2 |
信号通道数 | 固定为两路 |
| 首行第 3 列 | 500 |
采样率,单位 Hz | 两路共用,未分别设定 |
| 首行第 4 列 | 10260010 |
每条通道的采样点数 | 约合五小时四十二分 |
| 通道行 1 列 | p10143.dat |
数据体文件名 | 两行重复出现 |
| 通道行 2 列 | 61 |
每采样点存储格式 | 16 位整型,最低位为符号位 |
| 通道行 3 列 | 200 |
每通道采样增益 | 单位与物理量换算需靠这一项 |
| 通道行 4 列 | 16 |
ADC 分辨率,位 | 与存储格式一致 |
| 通道行 5 列 | 0 |
ADC 零点 | 基线与零点重合 |
| 通道行 6 至 9 列 | 0 0 0 0 |
初始值、校验和、块大小、说明 | 全部留空 |
| 通道行末列 | FECG / UC |
通道名 | 语义就在这两个缩写里 |
这张表里最需要解释的是第 2 列的 61。WFDB 对这个字段有一套位编码,个位数字与十位数字分别表示存储字节数与类型;61 表示每个采样点占 16 位,按整型存,且以最低位作符号位。第 3 列的 200 是增益,读取时把整型值除以它得到以毫伏为单位的物理量,这是 WFDB 的通行约定。
2.3 一条记录的完整解剖
把三件套里的信息按读取顺序摆出来,一条记录的全貌就是下面这样。
p10143 2 500 10260010
p10143.dat 61 200 16 0 0 0 0 FECG
p10143.dat 61 200 16 0 0 0 0 UC
第一行是记录级信息,后两行各描述一个通道。读取程序先看第一行拿到通道数与总点数,再逐行取通道名、增益与格式,最后按「采样点交错」的方式从数据体里切出两路序列。
注释文件的头部有一串辅助字符串,它是理解标注来源最直接的线索。
gqrs -r p10143 -f 14:0
这段字符串记下的是生成注释时的命令行:调用 gqrs 程序,对记录 p10143 运行,起始时间点为第 14 分钟。换句话说,注释是从记录的第十四分钟起才开始有的,此前的部分没有逐搏信息。这个细节在官方页面上没有写,只躺在二进制文件的头部。
注释的编码沿用 WFDB 注解格式:每个注解占两个字节,前若干位记类型,其余位记时间增量;遇到需要移动时间指针的注解就累加,遇到搏动注解就落一个心搏位置。
#-- 按 WFDB 注解格式读取逐搏位置
import struct
raw = open("p10143.qrs", "rb").read()
end = raw.find(b"14:0\x00") + len(b"14:0\x00")
body = raw[end:]
words = struct.unpack(">%dH" % (len(body) // 2), body[: (len(body) // 2) * 2])
t, beats = 0, []
for w in words:
code, aux = w >> 9, w & 0x1FF
if code == 59: #-- SKIP:时间前进
t += aux
elif code == 0: #-- 搏动注解
beats.append(t)
#-- 其余类型(辅助信息、时间回退等)此处不取用
print("beats:", len(beats))
这段脚本对公开样本运行的结果是一千一百多个心搏位置。头部那段 -f 14:0 说明注释从第十四分钟开始,而记录总长约五个多小时,所以覆盖的是产程的后半段。
| 组成 | 公开样本中的取值 | 对使用者的意义 |
|---|---|---|
| 通道数 | 2 | 双路同步,不能只读一路 |
| 采样率 | 500 Hz | 胎心电 QRS 宽度足够分辨 |
| 总采样点数 | 10,260,010 | 单通道约五个多小时 |
| 总时长 | 约 5 小时 42 分 | 覆盖产程主体,非片段 |
| 存储格式 | 16 位整型 | 无需浮点转换 |
| 单文件数据体 | 39.1 MB | 可全量入内存 |
| 注释起点 | 第 14 分钟 | 前 14 分钟无逐搏标注 |
| 注释器 | qrs(清单标为未审核) | 自动生成,非人工金标准 |
2.4 从两路信号到两类可算的量
这些字段并不直接给出任何指标,它们只是把原始电压摆在你面前。真正被算出来的是两类东西。
第一类是胎心节律。有了逐搏位置与 500 Hz 的时钟,就能得到一串 RR 间期,再转成瞬时胎心率序列。因为原始信号是电信号而不是监护仪平滑后的曲线,这个序列保留了逐搏之间的完整差异,变异性的高频成分没有被平均掉。
第二类是子宫活动。UC 通道记录的是子宫肌肉的电活动,它不是压力曲线,量纲与宫缩压力计不同;但它与宫缩在时间上是对应的,可以在秒级尺度上判断某一段胎心变化落在宫缩的哪个相位。
| 可算的量 | 来自哪一路 | 时间分辨率 | 典型用途 |
|---|---|---|---|
| 逐搏间期序列 | FECG | 单搏 | 变异分析、减速识别 |
| 瞬时胎心率 | FECG | 单搏 | 基线走势、趋势判断 |
| 频谱与尺度特征 | FECG | 窗口级 | 缺氧相关特征提取 |
| 子宫电活动强度 | UC | 秒级 | 宫缩起止与相位 |
| 胎心与宫缩的耦合程度 | 两路联合 | 节段级 | 官方设定的核心研究问题 |
2.5 与同类资源的字段差异
| 资源 | 记录单位 | 通道 | 频率 | 标注 | 与 OB-1 的差别 |
|---|---|---|---|---|---|
| OB-1(本库) | 一次分娩全过程 | 胎心电 + 子宫肌电 | 500 Hz 原始采样 | 自动逐搏 | 只有一条公开样本 |
| 腹壁胎心电类库 | 若干分段 | 母体腹壁多导 | 数百至千赫兹 | 参考标注 | 采集方式为非侵入 |
| CTG 类库 | 一次分娩 | 胎心率 + 宫缩压力 | 分钟级或更低 | 专家判读 | 已平滑、无原始电信号 |
| 胎心心音类库 | 若干段录音 | 单路声学 | 数千赫兹 | 无逐搏 | 声学而非电学 |
| 合成胎心电库 | 模拟妊娠 | 多路合成 | 可配置 | 完全已知 | 无真实生理变异 |
这五种资源的位置差别很大:声音库给的是机械振动的间接反映,CTG 库给的是监护仪算法处理后的结果,本库给的是侵入式电极的原始电压。它们不是可互相替代的关系,而是同一条处理链上不同深度的切片。
§3 它是谁的、为了什么而存在
3.1 三个人与一次抢救
官方页面列出三位数据贡献者:Nancy Oriol、Fred Bennet、Prateek Aggarwal。页面同时说明,这些贡献者此前已经为同一目的开发过信号处理技术,本库的采集正是为了给那套技术准备数据。也就是说,这三位不是单纯的采集者,而是先有方法、再造数据。
这段历史里还有第四方,而且它的作用不可忽略:这些文件原本录制于二十世纪九十年代中期,之后很多年不可访问,最终是靠 Techfusion Corp. 与 Alfred Demirjian 无偿提供的数据恢复与计算机取证服务才重新读出来。官方明确要求:任何基于这些数据的发表都要致谢这一贡献,并在复制文件时保留链接。
| 角色 | 名称 | 官方表述中的职责 |
|---|---|---|
| 数据贡献者 | Nancy Oriol | 采集与信号处理技术 |
| 数据贡献者 | Fred Bennet | 采集与信号处理技术 |
| 数据贡献者 | Prateek Aggarwal | 采集与信号处理技术 |
| 抢救服务 | Techfusion Corp. | 无偿数据恢复与计算机取证 |
| 抢救联系人 | Alfred Demirjian(马萨诸塞州剑桥) | 与上者同 |
| 发布平台 | PhysioNet | 托管与版本管理 |
把这张表读一遍会发现,一个数据集的「作者」在这件事上是分层的:有做研究的人,有救数据的人,还有托管数据的人。引用时只写前三位,等于承认了研究贡献而抹掉了保存贡献;官方的致谢要求正是为此而设。
3.2 设计的中心问题是缺氧,不是心率
如果只把 OB-1 理解成一份胎心电数据,会错过它最重要的设计选择:它要回答的是「胎儿氧合状态变化能不能从信号上被认出来」。官方摘要里的因果链写得很清楚——胎儿氧合的变化可以通过监测胎心率变异性的频谱与时域变化来识别,也可以通过胎心率变异性与子宫收缩信号之间的相关来识别。
这个表述里有两个前提值得单独拎出来。其一,氧合变化在信号上表现为「变异性的变化」而非「心率的高低」,这决定了分析对象是二阶量而不是一阶量。其二,胎心信号的意义要与宫缩信号联合确定,单独的胎心率曲线不足以判断。这两点合起来,正好解释了为什么这个库必须双通道、必须长时段、必须逐搏。
3.3 一个「在建」的库意味着什么
PhysioNet 上绝大多数条目的页面写的是「已完成、可下载」,本库的页面写的是一句邀请:创建者正在寻找合作者,以完成数据库并利用它研究胎儿窘迫的改进诊断。页面同时说明,除已放出的样本外,其余部分的建设正在进行,包括一百套以上带详细临床信息的附加记录。
这段表述有两层可操作的含义。第一,它是一个开放的合作入口——如果你有产时数据并愿意贡献,这里有明确的接收方与明确的科学问题。第二,它是一个时效性很强的判断:页面上线于二〇一二年,这一版至今没有更新记录,一百套以上的资料至今没有出现在目录中。规划项目时,只能按「现在有一条」来算。
§4 这条样本里有什么、没有什么
4.1 它为什么值得单独拿出来讲
一条记录通常不值得写一节。这条不一样,因为它是这个库目前唯一的实体。它同时承担了三种角色:库的格式说明书、方法可行性的证据、以及使用者对「另一百套会长什么样」的唯一想象素材。
从文件本身能读出几件官方页面没有直接讲的事:记录长五个多小时,说明单套资料确实覆盖产程主体而不是片段;采样率两路都是 500 Hz,说明子宫肌电没有被降采样处理;注释从第十四分钟开始,说明标注流程只覆盖了后段;数据体只有 39.1 MB,说明 16 位整型的压缩效率很高,全量读入毫无压力。
| 从文件读出的事实 | 由哪里读出 | 对规划的意义 |
|---|---|---|
| 单记录时长超过五小时 | 头文件点数与采样率 | 单条数据即可做长时段分析 |
| 两路同频 500 Hz | 头文件两个通道行 | 两路时间轴完全对齐 |
| 注释从第 14 分钟开始 | 注释文件头部辅助串 | 前段无可用标注 |
| 标注由 gqrs 生成 | 注释文件头部辅助串 | 需自行复核 |
| 数据体 39.1 MB | 目录列表 | 单机可全量处理 |
| 增益 200、分辨率 16 位 | 头文件通道行 | 换算物理量需除以增益 |
4.2 它没有的东西
第一,没有临床资料。官方说每套资料附有母体临床数据与新生儿临床数据,但公开目录里六个文件全在,没有一个承载临床信息。这意味着你无法从公开内容中知道这位产妇的孕周、产次、是否用药,也无法知道新生儿结局。
第二,没有诊断标签。胎儿窘迫是这项研究的因变量,但这个因变量在公开目录里不存在。所有关于「这条记录是否缺氧」的判断,都只能由信号本身推出,没有外部参照。
第三,没有采集机构与地理信息。页面提到参与机构曾出具研究伦理批准证书,但没有写出是哪家医院、在哪个城市。数据抢救发生在马萨诸塞州剑桥,那是服务提供方所在地,不是采集地。
第四,没有设备型号与电极规格。胎头电极的型号、监护仪的品牌、放大器的带宽,这些对信号质量有直接影响的信息全部缺失。
4.3 案例:p10143 这条只有一条的记录
下面这条贯穿案例会反复出现,这里先把它的全貌讲清楚。
记录 p10143 是 OB-1 目前唯一的公开样本。它的头文件三行、数据体一个、注释一个,双通道 500 Hz、五个多小时。它的注释从第十四分钟起,由 gqrs 自动检测生成,数量在一千一百上下,与五个多小时的时长相比偏低,这与产程后段的胎心率水平有关。它的数据体大小恰好落在四十兆以内,一个普通工作站读入内存只需要几秒。
这条记录最值得玩味的地方,是它的「完整性」与它的「孤立性」恰好成正比。作为单条记录,它什么都齐:通道、时长、注释、校验和。作为数据集,它什么都没有:没有第二例、没有标签、没有临床字段。任何一种使用它的方式,都必须先想清楚自己用的是它的完整性,还是妄图用它的孤立性去支撑什么结论。
§4.3 的案例在后面的章节里还会以不同角度出现:在 §5.2 里它会变成一段读取脚本的输出对象,在 §7.3 里它会变成偏差清单的证据来源,在 §9.2 里它会变成最短可用流程的输入端。
§5 怎么把它拿到手并跑起来
5.1 下载的三条路
官方给了三种取数方式:网页上的 ZIP 下载、用 wget 递归拉取目录、用 AWS 命令行同步公开桶。三者拿到的内容一样,选择取决于你的环境。
#-- 方式一:递归镜像整个版本目录
wget -r -N -c -np https://physionet.org/files/ob1db/1.0.0/
#-- 方式二:从公开 S3 桶同步,无需凭证
aws s3 sync --no-request-payer s3://physionet-open/ob1db/1.0.0/ ./ob1db/
#-- 方式三:只要单个文件时直接取
curl -O https://physionet.org/files/ob1db/1.0.0/p10143.hea
不需要登录,不需要签署数据使用协议,也不需要填写申请表单。官方的访问政策只有一句:任何人可以访问这些文件,前提是遵守指定许可的条款。
| 取数方式 | 适用场景 | 带宽占用 | 备注 |
|---|---|---|---|
| 网页 ZIP | 一次性获取全部 | 约四十兆 | 需要浏览器可用 |
| wget 递归 | 脚本化镜像、反复同步 | 约四十兆 | 适合放进构建流程 |
| AWS 同步 | 云上批量取数 | 约四十兆 | 公开桶,免凭证 |
| 单文件下载 | 只看头文件或清单 | 字节级 | 排查格式时最常用 |
5.2 用 WFDB 工具读它
Python 环境里最省事的方式是官方 WFDB 包。装好之后三行就能把两路信号读进内存。
#-- 读取双通道信号与逐搏注释
import wfdb
rec = wfdb.rdrecord("p10143", pn_dir="ob1db/1.0.0")
print(rec.fs, rec.sig_name, rec.sig_len)
fecg = rec.p_signal[:, 0]
uc = rec.p_signal[:, 1]
ann = wfdb.rdann("p10143", "qrs", pn_dir="ob1db/1.0.0")
print(len(ann.sample), ann.sample[0], ann.sample[-1])
这里有一个坑:sig_len 是采样点数,不是秒。要得到时长,必须除以采样率。对 p10143 来说,两个数相除的结果超过两万秒,也就是五个多小时。
#-- 由采样点数反推时长,并检查两路是否严格对齐
duration_h = rec.sig_len / rec.fs / 3600
print("时长 %.2f 小时" % duration_h)
assert fecg.shape == uc.shape, "两路长度不一致"
assert ann.sample[-1] < rec.sig_len, "注释越界"
第二个坑在注释单位上。ann.sample 给出的是采样点编号,要换成秒同样要除以采样率;而注释文件的头部又把起点写成了 14:0,即以分钟为单位。两种计时单位混在同一份资料里,写分析脚本时最好在入口统一成秒。
5.3 从原始电压到 RR 间期
拿到逐搏位置后,第一步是算 RR 间期,第二步是剔除明显不合理的值。产时胎心率通常在每分钟一百到两百次之间,换算成采样点,合理的 RR 应落在一个相当宽的区间内。
#-- 由注释得到 RR 间期,并换成毫秒
import numpy as np
rr_samples = np.diff(ann.sample)
rr_ms = rr_samples / rec.fs * 1000.0
keep = (rr_ms > 250) & (rr_ms < 2000) #-- 每分钟 30 至 240 次
rr_clean = rr_ms[keep]
print("原始 %d 个间期,保留 %d 个" % (len(rr_ms), len(rr_clean)))
阈值区间取得宽,是因为产时减速度可以把单次间期拉得很长,收得太紧会把有临床意义的变化当噪声扔掉。这一步只是做粗筛,真正的质量判定要靠信号质量指标,而不是靠间期长度。
5.4 把子宫肌电与胎心对齐
两路信号同频同起点,这是它相对 CTG 类数据的最大结构优势。对齐不需要重采样,只需要用同一个索引。
#-- 在宫缩窗口内取胎心率,做节段级耦合分析
win = 30 * rec.fs #-- 三十秒窗口
starts = ann.sample[:-1]
mask = (starts + win) < rec.sig_len
seg_uc = np.array([uc[s:s + win].mean() for s in starts[mask]])
seg_hr = 60000.0 / rr_clean[:mask.sum()]
print(seg_uc.shape, seg_hr.shape)
这段代码只取每个心搏起点之后三十秒的子宫肌电均值,与同一位置的瞬时胎心率配对。它是一个最简版本,足够验证流程通不通,不足以支撑任何生理学结论——因为窗口长度、对齐策略、基线去除方式都会改变结果,而这些参数在大规模资料上线后才谈得上调优。
5.5 校验与版本固定
目录里附了 SHA256 清单,下载后应当逐个比对,这在长期项目里不是可选项。
#-- 逐个比对校验和
cd ob1db/1.0.0
sha256sum -c SHA256SUMS.txt
#-- 记下版本与 DOI,写进方法段
echo "ob1db 1.0.0 DOI 10.13026/C2D30V" >> provenance.txt
版本固定这件事对这个库格外重要:它的主体还在建设中,一旦那一百套以上资料上线,新版本的内容与规模都会变。把 1.0.0 写进方法段,能保证你三年后复现时拿到的仍是同一条记录。
5.6 一次完整的最小核查
把上面几段串起来,就是一次完整的最小核查:读完头文件确认规模,读完注释确认覆盖范围,算一次间期确认数据可用,比对校验和确认文件完整。
| 核查项 | 命令或代码 | 期望结果 |
|---|---|---|
| 记录数 | 读 RECORDS |
只有一行 p10143 |
| 通道数 | 读 rec.sig_name |
两项,FECG 与 UC |
| 采样率 | 读 rec.fs |
500 |
| 时长 | 点数除以频率 | 超过五小时 |
| 注释起点 | 读注释文件头部辅助串 | 第十四分钟 |
| 注释数量 | 数搏动注解 | 一千一百上下 |
| 文件完整 | 比对 SHA256 | 全部一致 |
§6 与库内条目的关系
6.1 关系图谱
PhysioNet 与整个公开数据生态里,做胎心信号的不止一家。它们的关系不是替代,而是沿着「信号来源—处理深度—采集方式」三条轴分布在不同的位置。
| 库内条目 | 信号类型 | 采集方式 | 相对 OB-1 的位置 |
|---|---|---|---|
| adfecgdb | 腹壁多导胎心电 | 非侵入,含直接参考 | 同平台、不同采集路径 |
| nifecgdb | 腹壁胎心电 | 非侵入,单人多次 | 提供重复测量的可能 |
| fecgsyndb | 合成胎心电 | 模拟生成 | 提供完全已知的真值 |
| fetalheartsounddata | 胎心心音 | 声学,非侵入 | 另一种物理量 |
| uci-ctg | 胎心率与宫缩曲线 | 监护仪导出 | 处理后的下游产物 |
| ctu-uhb-ctg | 产时 CTG 曲线 | 监护仪导出,有规模 | 有标签、有规模的下游产物 |
| mghdb | 重症多参数波形 | 床旁监护,成人 | 同平台的多通道范式参照 |
从这张表能看出一条清晰的分层:合成库给真值但没有真实变异,腹壁库有真实变异但没有逐搏级质控,本库有原始电极信号但只有一条,CTG 库有规模与标签但已经丢掉了原始波形。做任何一项研究,第一步都是在这些位置里选一个,而不是指望某一个位置同时满足所有条件。
6.2 检索路径
如果是从「胎儿监护」这个主题出发找数据,推荐的检索顺序是这样的。
| 你的起点 | 建议下一步 | 理由 |
|---|---|---|
| 想看原始电信号长什么样 | 本库 | 双通道、结构最简 |
| 想训练胎心电提取模型 | adfecgdb 与本库并读 | 一个给参考,一个给场景 |
| 想要有标签的规模数据 | ctu-uhb-ctg 或 uci-ctg | 有结局、有规模 |
| 想验证算法在无噪声下的上限 | fecgsyndb | 真值完全已知 |
| 想研究声学与电学的差异 | fetalheartsounddata 与本库并读 | 同一生理过程两种物理量 |
| 想看多通道同步记录的范式 | mghdb | 同平台、通道更多、有事件标注 |
这条路径的设计意图,是让使用者意识到「本库是链条的起点而不是终点」。从它出发,往上游走去合成库拿真值,往下游走去 CTG 库拿规模与标签,往旁侧走去腹壁库与心音库拿不同采集方式。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这个库打分之前,要先校正一个很常见的误判:把它当作一个「小规模数据集」来评。
小规模数据集的评价逻辑是「样本少但内容齐,适合做预研」。本库的问题不在于样本少,而在于它当前公布的实体与它宣称的实体之间差了两个数量级。如果按小规模数据集来评,它会被判为「可用但有限」;如果按在建项目来评,它的结论是「现在只能用它的格式与流程,不能用它的内容量」。这两种评法给出的行动建议完全不同:前者会让你开始设计实验,后者会让你先去别处找有规模的替代,把本库留作对照。
因此本节所有的评分与偏差清单,都以「当前公开的那一条记录」为对象,不以「未来那一百多套」为对象。任何关于后者的判断都只能是推测,本节不写推测。
7.1 五维评分
若把数据交换标准(DAIMS)常被追问的几个维度——可发现、可访问、可互操作、可复用、可追溯——拿来当评分框架,本库的长短分布得相当不均匀。
| 维度 | 评分 | 依据 |
|---|---|---|
| 可发现 | 中 | 有 DOI、有平台收录、主题标签齐全,但无专门论文 |
| 可访问 | 高 | 免登录、免申请、三件套齐全、附校验和 |
| 可互操作 | 高 | 标准 WFDB 格式,官方工具链直接支持 |
| 可复用 | 低 | 一条记录,无标签,无法支撑统计 |
| 可追溯 | 中 | 有贡献者与抢救记录,无机构与设备信息 |
DAIMS 这套框架关心的正是「这份数据在交换与复用时会不会掉信息」。本库在前两项与第三项上表现很好——格式标准、获取零门槛、校验完整;在第四项上则受制于规模,第五项上受制于元数据。这五项之间不是独立打分再平均的关系:第三项的高分恰恰放大了第四项的低分,因为格式越标准,使用者越容易顺手把它接进流水线,然后在样本量上撞墙。
7.2 两个维度的展开
先看可互操作这一项为什么给高分。WFDB 是一套用了三十多年的格式,Python、MATLAB、C、R 都有成熟读取器,注释编码也有公开规范。本库的三件套符合规范,没有自造字段,没有私有压缩,甚至连头文件里那串命令行参数也是规范允许的注释形式。这种「标准到没有意外」的状态,对流水线是极大的便利。
再看可追溯为什么只给中。贡献者名单、抢救服务、发布平台、DOI,这些都齐全,追溯到一个项目没有问题;但要追溯到具体某一次分娩发生在哪家医院、用的是什么电极、记录时产妇处于产程第几期,就完全无从下手了。可追溯在这份数据上是「到项目为止」,而不是「到样本为止」。
| 维度 | 强项的具体表现 | 短板的具体表现 |
|---|---|---|
| 可互操作 | 官方包三行代码可读 | 通道语义只靠两个缩写 |
| 可追溯 | 贡献者与抢救方均具名 | 无机构、无设备、无孕周 |
| 可复用 | 许可宽松、无附加限制 | 单例无法做统计 |
| 可发现 | DOI 与主题标签齐全 | 无同行评议论文背书 |
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 | 应对 |
|---|---|---|---|
| 规模偏差 | 公开一条,宣称上百 | 任何统计都失去意义 | 只做单例分析与流程验证 |
| 标注偏差 | 自动程序生成、标为未审核 | 逐搏位置可能有漏检与错检 | 自建参考或用形态特征复核 |
| 覆盖偏差 | 注释从第十四分钟开始 | 前段无法做逐搏分析 | 把分析窗口限定在覆盖区内 |
| 采集偏差 | 胎头电极直接测量 | 信噪比高于腹壁,算法迁移会退化 | 写明采集方式,不外推 |
| 时代偏差 | 二十世纪九十年代录制 | 设备与产房流程已变 | 在方法段写明年代 |
| 元数据偏差 | 无孕周、无产次、无结局 | 无法分层、无法做有监督 | 明确写成限制 |
| 通道语义偏差 | UC 是电活动而非压力 | 与 CTG 宫缩曲线不可直接比 | 只用其时间相位,不用其量值 |
| 单例偏差 | 一次分娩不代表任何人群 | 不可外推 | 结论限定在方法与格式层面 |
这八条里,前三条是当前版本的直接后果,第四条与第五条是采集设计的固有属性,后三条是元数据缺口。处理方式也分两类:前三条可以通过换库解决,后五条只能通过写法解决——把它们写进方法段的限制里,而不是在分析里假装不存在。
§4.3 的案例在这里提供了一个具体的证据:那条记录的数据体只有三十九兆,五个多小时,一千一百来个搏动;把它放大到一百套,也不过四吉字节左右的量级。也就是说,本库的短板从来不是存储成本,而是那一百套资料还没上线。
7.4 外部验证矩阵
| 验证方式 | 是否可行 | 说明 |
|---|---|---|
| 与腹壁胎心电库对照形态 | 可行 | 同一生理量,两种采集路径 |
| 与 CTG 库对照节律 | 部分可行 | 需把原始信号降采样成曲线 |
| 专家重做逐搏判读 | 可行 | 记录不长,成本可控 |
| 重复测量一致性 | 不可行 | 每人仅一套 |
| 与临床结局对照 | 不可行 | 无结局字段 |
| 与合成库对照真值 | 可行 | 只验证算法,不验证生理 |
第三行是这个库最现实的一条验证路径:请熟悉胎心电的医师或技师,对覆盖区间内的逐搏位置重新标注一遍,与自动注释对照,得到一份「自动检测在产时场景下的误差画像」。这件事一条记录就能做,而且结果对后面那一百套上线后的工作有直接价值。
7.5 它为何能持续:一份被抢救回来的记录,与一个仍然悬着的承诺
这个库能一直在架,靠的不是规模,而是三件互相支撑的事。
第一,它保存的东西几乎无法再被复制。胎头电极在产程中的连续记录、同时段的子宫肌电、跨越五个多小时的完整时间轴——这类数据在今天的产房里依然难得,因为采集要侵入、要连续、要占设备,伦理与流程成本都高。二十世纪九十年代那批记录能留存下来,本身就是一次偶然。
第二,它的格式成本为零。三件套、标准编码、官方读取器,任何人半小时内就能跑通。这意味着即使只有一条,它也会被当作教学与格式参考反复使用。
第三,它挂着一个未完成的承诺。页面明说在找合作者、在建一百套以上、欢迎贡献数据。这个承诺让它区别于一份封存的存档:它被视为一个可能长大的项目,而不是一件已经完成的藏品。承诺本身不能当数据用,但它解释了为什么这条记录至今仍被保留在架。
§8 生态位与历史
8.1 从产房到失联再到上线
这条时间线不复杂,但每一段都对今天的使用方式有影响。
| 时间 | 事件 | 证据来源 |
|---|---|---|
| 二十世纪九十年代中期 | 原始信号录制 | 官方数据说明 |
| 此后多年 | 文件不可访问 | 官方数据说明 |
| 抢救期间 | Techfusion Corp. 恢复数据 | 官方致谢段 |
| 2011 年 11 月 | 数据体文件时间戳 | 目录列表 |
| 2012 年 5 月 | 注释文件时间戳 | 目录列表 |
| 2012 年 7 月 31 日 | 头文件与清单时间戳 | 目录列表 |
| 2012 年 8 月 3 日 | 1.0.0 版发布 | 官方版本记录 |
| 2019 年 2 月 20 日 | 校验清单时间戳 | 目录列表 |
时间戳这一段值得单独说:数据体、注释、头文件三类文件的修改时间分散在半年多里,说明数据抢救之后还有一个格式转换与整理的过程,不是一次性搬上平台。
8.2 与同期 PhysioNet 条目的差别
同在 PhysioNet 上,九十年代那批波形库多数在二〇〇〇年前后就已上线并定型,本库是个例外:它二〇一二年才上线,而且一上线就是「建设中」。这个时间点使它同时具备两个特征——技术上是老数据,流程上是新条目。
| 对照项 | 多数九十年代波形库 | OB-1 |
|---|---|---|
| 上线时状态 | 已完成 | 建设中 |
| 公开规模 | 与宣称一致 | 远小于宣称 |
| 是否有配套论文 | 常有 | 无 |
| 是否仍在扩充 | 否 | 官方称在建 |
8.3 它在今天的实际生态位
把上面的信息合起来,它在当前生态里的位置可以用一句话概括:它是产时胎心电这条线上唯一提供侵入式原始双路信号的公开入口,也是最不可能被当作主力数据集的入口。
| 需求 | 它是否是最优选择 | 更优选择 |
|---|---|---|
| 原始双路产时信号样例 | 是 | 无同类公开替代 |
| 多例产时研究 | 否 | 产时 CTG 类库 |
| 胎心电提取训练 | 否 | 腹壁类库 |
| 完全已知真值 | 否 | 合成库 |
| 声学胎心研究 | 否 | 心音库 |
| 教学演示 | 是 | 无更简单者 |
8.4 如果那一百套上线了
这一节只做条件描述,不做预测。官方说剩余部分正在建设中,包含一百套以上带详细临床信息的附加记录。如果这些资料真的上线,本库的定位会发生什么变化,取决于三件事。
第一,临床信息的具体内容。如果包含孕周、产次、用药、产程分期与新生儿结局,它就会从「格式样例」变成「可做有监督学习的产时库」,这是质变。如果只包含年龄与性别这类粗粒度字段,它仍然做不了诊断建模。
第二,标注是否重做。如果新的资料仍由自动程序生成逐搏标注且不审核,它的可用性就仍限制在定位层面;如果补上人工校对,它会成为胎心电逐搏检测的重要参考。
第三,是否附一篇方法论文。PhysioNet 条目有没有论文,对使用者的决策影响极大——论文提供了采集协议、排除标准与已知问题,这些正是这份数据现在最缺的。
§9 使用指引
9.1 三种角色的路径
不同的人打开这个库,需要的动作完全不同。
| 角色 | 打开后先做什么 | 建议停留时间 | 最终产出 |
|---|---|---|---|
| 算法工程师 | 下载三件套,跑通读取与注释解析 | 半天 | 一条可复用的读取管线 |
| 临床研究者 | 读官方摘要与数据说明,判断能否支持研究假设 | 一小时 | 一份可行性判断 |
| 教学人员 | 用头文件与注释文件讲 WFDB 结构 | 一课时 | 一份可演示的教学样例 |
算法工程师的路径最短,因为格式标准、文件小、工具成熟。临床研究者的路径最需要克制,因为这个库的名字与研究问题高度相关,很容易让人误以为可以直接开展研究,而实际上要先确认有没有可用的因变量。教学人员的路径最稳,因为它的结构简单到可以当范本。
9.2 一条最短的可用流程
如果要在一刻钟内得到一条可信的输出,按下面的步骤走。
#-- 第一步:取数与校验
mkdir -p ob1db && cd ob1db
curl -O https://physionet.org/files/ob1db/1.0.0/p10143.hea
curl -O https://physionet.org/files/ob1db/1.0.0/p10143.dat
curl -O https://physionet.org/files/ob1db/1.0.0/p10143.qrs
curl -O https://physionet.org/files/ob1db/1.0.0/SHA256SUMS.txt
echo "d47ae3236a9c631da1935dd23dde53f83b392eb7fa8dacb7b0c26dc0a20ae652 p10143.dat" | sha256sum -c -
#-- 第二步:读入、核对结构、算出时长与搏动覆盖
import wfdb, numpy as np
rec = wfdb.rdrecord("p10143")
ann = wfdb.rdann("p10143", "qrs")
assert rec.sig_name == ["FECG", "UC"], "通道名与官方不一致"
assert rec.fs == 500, "采样率与官方不一致"
hours = rec.sig_len / rec.fs / 3600
cover_from = ann.sample[0] / rec.fs / 60
print("时长 %.2f 小时;注释起于第 %.0f 分钟;搏动 %d 个"
% (hours, cover_from, len(ann.sample)))
rr = np.diff(ann.sample) / rec.fs * 1000
print("间期中位数 %.0f 毫秒" % np.median(rr))
这段流程的每一步都在核对一个已知事实,而不是在生产结论。这在只有一条记录时是正确的做法:你的产出应当是对「这份数据是什么」的确认,而不是对「这群患者怎么样」的推断。
| 步骤 | 动作 | 通过标准 |
|---|---|---|
| 取数 | 下载四个文件 | 校验和一致 |
| 读头 | 核对通道名与采样率 | 与官方文档相符 |
| 读注 | 解析注释并计数 | 一千一百上下 |
| 算时长 | 点数除以频率 | 超过五小时 |
| 算间期 | 相邻搏动差值 | 中位数在生理范围内 |
9.3 引用方式
引用这个库需要三层信息:平台的标准引用、数据本身的 DOI、以及官方要求保留的抢救致谢。
数据:OB-1 Fetal ECG Database (version 1.0.0). PhysioNet. 2012.
https://doi.org/10.13026/C2D30V
贡献者:Nancy Oriol, Fred Bennet, Prateek Aggarwal
抢救致谢:数据恢复与计算机取证由 Techfusion Corp. 与 Alfred Demirjian
(Cambridge, MA)无偿提供,须在发表中致谢。
平台: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.
第三行是最容易被漏掉的一行。它不是客套,而是官方的硬性要求;漏掉它,等于把一份被抢救回来的数据当作理所当然存在的资源。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 生成方式 | 由大语言模型起草,人工核对结构与数字 |
| 事实来源 | 仅限官方页面、官方文件服务器上的文件内容、平台引用条目 |
| 数字口径 | 规模、结构、边界三类,未做分布统计 |
| 未核实项 | 临床资料内容、采集机构、OB 全称、一百套资料的字段结构 |
| 潜在错误 | 文件解析所得数字(搏动数、注释起点)依赖解码假设 |
| 更新承诺 | 官方版本或目录变化时,本文相应段落需重核 |
| 适用边界 | 不作为临床决策依据,不替代原始数据说明 |
| 责任声明 | 使用本库产生的任何结论,由使用者自行负责 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是一份有上百例的胎心电库 | 公开目录只有一条记录 | RECORDS 仅一行 |
| OB-1 是某个医学评分量表 | 官方未展开 OB,按惯例是产科缩写 | 官方页题头与摘要 |
| 胎心电是腹壁间接测的 | 官方写胎头电极,属侵入式直接测量 | 摘要首句与数据说明 |
| 两路信号里有一路是宫缩压力 | UC 是子宫肌肉电活动,不是压力 | 头文件通道名与数据说明 |
| 标注是专家逐搏标注 | 注释器标为未审核,由自动程序生成 | ANNOTATORS 与注释头部 |
| 记录从第零分钟起就有逐搏标注 | 注释从第十四分钟才开始 | 注释文件头部辅助串 |
| 每套资料都附有临床数据 | 官方这么说,但公开目录中不存在 | 目录六个文件列表 |
| 采样率可以按通道分别设 | 两路同为 500 Hz,未分别优化 | 头文件两行通道定义 |
| 记录很短,像是片段 | 五个多小时,覆盖产程主体 | 点数除以采样率 |
FAQ
Q1:OB 到底指什么?
官方页面没有任何一处展开 OB 两个字母。从标题、主题标签与摘要内容看,它是产科(obstetrics)的通行缩写,OB-1 即产科系列的第一个库。这属于从命名惯例推出的解释,写论文时不宜当作官方定义引用。
Q2:为什么叫 Database 却只有一条记录?
官方把它定位成一个在建的项目:已收集一百套以上资料,剩余部分正在建设中,先放出一条样本供人试用与对接。名称描述的是项目目标,不是当前内容。按一条规划,按一百套设想,是两种完全不同的做法。
Q3:胎心电是怎么来的?
官方标题写 fetal scalp electrograms,数据说明写「胎儿心电与子宫肌肉电活动」,摘要写「经胎头电极取得」。三者一致指向同一个事实:产程中经胎头电极直接测量,不是腹壁间接测量。
Q4:UC 是宫缩压力吗?
不是。UC 指 uterine muscular activity,即子宫肌肉电活动,记录的是电信号而非压力。它与宫缩在时间上对应,但量纲不同,不能直接与 CTG 的宫缩曲线比较数值,只能比较时间相位。
Q5:注释可靠吗?
注释器清单写作 unaudited beat annotations,注释文件头部显示由 gqrs 程序生成,运行参数还指定了从第 14 分钟开始处理。它是自动检测的结果,适合做定位与后续精修的起点,不适合直接当逐搏真值。
Q6:能直接拿来做胎儿窘迫诊断模型吗?
不能。诊断模型需要因变量,而公开目录里没有任何诊断标签、结局或临床字段。即便把信号特征做得再细,也没有东西可以拿来当目标。
Q7:一条记录能做什么研究?
能做三件事:验证双路信号的耦合分析流程是否可行;评估自动逐搏检测在产时场景下的误差;作为教学与格式范本。这三件都不依赖样本量。
Q8:它和 CTG 数据集怎么分工?
CTG 数据集给的是监护仪算好的曲线,频率低、有标签、有规模;本库给的是原始电信号,频率高、无标签、只有一条。前者适合建模,后者适合理解曲线是怎么来的。
Q9:时长五个多小时是真的吗?
头文件记总采样点 10,260,010,采样率 500 Hz,两者相除得五小时四十二分。这个数字由官方文件直接算出,不是估计。
Q10:许可有什么限制?
ODC-BY 1.0,允许商用、允许再分发、允许改造,条件是署名。除此之外官方还要求致谢数据抢救方 Techfusion Corp. 与 Alfred Demirjian,并在复制文件时保留链接。
Q11:以后会变多吗?
官方说在建设中,但页面上线十余年没有更新记录。按现在的状态,任何按上百例设计的方案都需要一个备用数据源。
Q12:文件为什么这么小?
两路 16 位整型、500 Hz、五个多小时,原始体量就是三十九兆左右。对比动辄数吉字节的影像库,这个体量小到可以在浏览器里逐字节检查。
术语表
| 术语 | 全称或原词 | 含义 |
|---|---|---|
| FECG | Fetal Electrocardiogram | 胎儿心电图信号,本文指胎头电极取得的原始波形 |
| UC | Uterine Contraction / Uterine muscular activity | 官方展开为子宫肌肉活动;通道记录的是电活动 |
| gqrs | — | PhysioNet 的 QRS 自动检测程序,本库注释由它生成 |
| WFDB | Waveform Database | PhysioNet 的波形数据格式与工具集 |
| 逐搏标注 | beat annotation | 每个心搏位置的采样点编号 |
| 注释器 | annotator | WFDB 中产生注释的程序或人工来源 |
| 未审核 | unaudited | 注释未经人工核对,仅经自动流程产生 |
| 胎头电极 | fetal scalp electrode | 产程中置于胎头、直接取得胎儿心电的电极 |
| 产时 | intrapartum | 分娩进行期间,与产前相对应 |
| 胎儿窘迫 | fetal distress | 胎儿在宫内处于缺氧或酸中毒风险的临床状态 |
| 心率变异性 | heart rate variability | 相邻心搏间期的波动,反映自主调节 |
| 非平稳信号 | nonstationary signal | 统计特性随时间变化的信号 |
| 采样率 | sampling rate | 每秒采样点数,本库为 500 Hz |
| 增益 | gain | 整型采样值与物理量的换算系数 |
| 数据抢救 | data recovery | 从失效介质中恢复文件的过程 |
| 计算机取证 | computer forensics | 对存储介质做结构化恢复与验证的技术 |
| 心搏检出 | QRS detection | 从心电中定位每个心室除极时刻 |
| 间期 | RR interval | 相邻两次心搏的时间差 |
| 减速 | deceleration | 胎心率相对基线的暂时下降 |
| 基线 | baseline | 胎心率在一定窗口内的稳定水平 |
| 耦合 | coupling | 两个信号在时间上的关联程度 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 公开记录数 | 1 | RECORDS 文件 |
官方文件 |
| 官方称已收集 | 一百套以上 | 官方数据说明 | 官方页面 |
| 通道数 | 2 | 头文件首行 | 官方文件 |
| 采样率 | 500 Hz | 头文件首行 | 官方文件 |
| 总采样点数 | 一千万零两千余 | 头文件首行 | 官方文件 |
| 单通道时长 | 约 5 小时 42 分 | 点数除以频率 | 换算 |
| 数据体大小 | 39.1 MB | 目录列表 | 官方页面 |
| 解压总量 | 39.3 MB | 目录页 | 官方页面 |
| 搏动注解数 | 约 1,137 | 注释文件解析 | 换算 |
| 注释起点 | 第 14 分钟 | 注释头部辅助串 | 官方文件 |
| 增益 | 200 | 头文件通道行 | 官方文件 |
| 分辨率 | 16 位 | 头文件通道行 | 官方文件 |
| 版本 | 1.0.0 | 版本记录 | 官方页面 |
| 发布日期 | 2012-08-03 | 版本记录 | 官方页面 |
| DOI | 10.13026/C2D30V | 页面侧栏 | 官方页面 |
附录 B:数字的来源分层
官方页面与官方文件这一层,是本篇所有规模与结构数字的基础:记录数、通道数、采样率、点数、文件大小、许可、版本日期,全部落在这一层,可以逐一打开核对。
论文摘要这一层,本篇只用到平台级引用条目(PhysioNet 的 Nature Health 文章),并未找到针对本库的专门论文。欧洲 PMC 检索未返回与该库直接对应的条目,因此本篇没有任何来自同行评议论文的库级数字。
未核实这一层包括:临床资料的具体字段、一百套以上资料的采集机构与地理分布、胎头电极与监护仪型号、产程分期信息、以及 OB 的官方全称。这些内容在任何公开来源中都找不到,本篇按要求标注为未核实,不做补全。
附录 C:完整参考文献
| 编号 | 文献 | 类型 | 链接 |
|---|---|---|---|
| R1 | OB-1 Fetal ECG Database v1.0.0 | 官方项目页 | https://physionet.org/content/ob1db/1.0.0/ |
| R2 | 记录 p10143 头文件 | 官方数据文件 | https://physionet.org/files/ob1db/1.0.0/p10143.hea |
| R3 | 记录清单 RECORDS | 官方数据文件 | https://physionet.org/files/ob1db/1.0.0/RECORDS |
| R4 | 注释器清单 ANNOTATORS | 官方数据文件 | https://physionet.org/files/ob1db/1.0.0/ANNOTATORS |
| R5 | 校验清单 SHA256SUMS | 官方数据文件 | https://physionet.org/files/ob1db/1.0.0/SHA256SUMS.txt |
| R6 | PhysioNet 平台引用条目 | 期刊文章 | https://doi.org/10.1038/s44360-026-00096-z |
| R7 | ODC-BY 1.0 许可原文 | 许可文本 | https://opendatacommons.org/licenses/by/1-0/ |
| R8 | WFDB 格式与工具文档 | 软件文档 | https://physionet.org/content/wfdb/ |
附录 D:任务代码
下面的脚本把「取数、核对、算时长、算间期、输出摘要」串成一条命令,可直接在装载了 wfdb 包的环境里运行。
#-- 一体化核查脚本:核对结构并输出摘要
import numpy as np
import wfdb
RECORD = "p10143"
PN = "ob1db/1.0.0"
rec = wfdb.rdrecord(RECORD, pn_dir=PN)
ann = wfdb.rdann(RECORD, "qrs", pn_dir=PN)
checks = {
"channels_ok": rec.sig_name == ["FECG", "UC"],
"fs_ok": rec.fs == 500,
"len_ok": rec.sig_len == 10260010,
"ann_inside": ann.sample[-1] < rec.sig_len,
}
for k, v in checks.items():
print("%-12s %s" % (k, "PASS" if v else "FAIL"))
rr_ms = np.diff(ann.sample) / rec.fs * 1000.0
print("时长 %.2f 小时" % (rec.sig_len / rec.fs / 3600.0))
print("搏动 %d;间期中位数 %.0f 毫秒" % (len(ann.sample), np.median(rr_ms)))
print("注释起于第 %.0f 分钟" % (ann.sample[0] / rec.fs / 60.0))
运行输出会告诉你四件事:通道名是否与官方一致、采样率是否一致、总点数是否一致、注释是否越界。只要这四项都通过,你就确认了手上这份文件与官方声明的是同一份数据。
#-- 记录一次核查结果的指纹,便于日后复现
python3 check_ob1db.py | tee ob1db_check_$(date +%F).log
sha256sum p10143.dat >> ob1db_check_$(date +%F).log
附录 E:如果只记五件事
第一,OB-1 是一个「已经采集但还没有上线」的产时信号库,公开的只有一条记录 p10143,别被名字里的 Database 骗了。
第二,它的两路信号是胎头电极取得的胎儿心电与子宫肌肉电活动,采样率 500 Hz,同频同步,时长五个多小时。
第三,它的逐搏标注由 gqrs 自动生成、标为未审核,并且从第十四分钟才开始,做逐搏研究要先自建参考。
第四,公开目录里没有任何临床资料与诊断标签,所以它现在只能当格式范本与方法学沙盒。
第五,引用时别忘致谢 Techfusion Corp. 与 Alfred Demirjian,那是让这份数据重新可读的人。
编辑说明
本页所有事实性表述都以官方项目页与官方文件服务器上的文件为准;凡页面与文件不一致处,两说并列为两口径,不做裁判。文件解析所得数字(搏动数、注释起点)依赖对 WFDB 注解格式的解码假设,若有偏差,以官方文件原始字节为准。OB 的全称、采集机构、临床资料字段、以及一百套以上资料的结构,均为未核实项,本文不作推测性补全。页面上线至今未见版本更新,若官方目录或版本发生变化,§2、§7、§8 的相关段落需重核。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- tpehgdb — 共享标签:生理信号 / 心电信号 / 电子健康记录
- osv — 共享标签:生理信号 / 电子健康记录 / 时序数据
- cinc-2015 — 共享标签:生理信号 / 心电信号 / 电子健康记录 / 时序数据
- mover — 共享标签:生理信号 / 心电信号 / 电子健康记录 / 时序数据
- mimic-iv-ext-ecg-glucose — 共享标签:生理信号 / 心电信号 / 电子健康记录 / 时序数据
- cpsc — 共享标签:生理信号 / 心电信号 / 时序数据
- uci-ctg — 共享标签:生理信号 / 电子健康记录 / 时序数据
- sicdb — 共享标签:生理信号 / 电子健康记录 / 时序数据
- charisdb — 共享标签:生理信号 / 心电信号 / 时序数据
- alott — 共享标签:生理信号 / 电子健康记录 / 时序数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

