同一名孕妇的五十五次记录 — NIFECGDB 胎心电库

1 名孕妇 / 55 段记录 / 21 至 40 周 / 1 kHz

来源 https://physionet.org/content/nifecgdb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 14
同一名孕妇的五十五次记录 — NIFECGDB 胎心电库

信息速览

数据集名称同一名孕妇的五十五次记录 — NIFECGDB 胎心电库
数据类型时序信号,波形,元数据,人工标注
规模1 名孕妇 / 55 段记录
接入方式https://physionet.org/content/nifecgdb/1.0.0/
AI 就绪度

同一名孕妇,二十个孕周,五十五段腹壁心电。这是 NIFECGDB 全部的内容,也是它二十年没被替代、也永远不会被当成通用测试集的原因。它由瓦伦西亚大学电子工程系的数字信号处理组在 2003 年冬至 2004 年春采集,2007 年 9 月 6 日由 PhysioNet 以 v1.0.0 发布,DOI 为 10.13026/C2X30H,整包未压缩 372.6 MB,ODC-BY 1.0 开放。

每段记录同时含两路胸导与三或四路腹导:胸导取的是母体心电,腹导取的是母体心电与胎儿心电在同一块腹壁上的叠加。采样 1 kHz、量化 16 位、带宽 0.01 至 100 Hz,采集时 50 Hz 工频陷波即已开启。文件是 EDF/EDF+,孕周以「周+天」的形式直接写在患者标识字段里,另配逐段心搏标注。全库没有同步胎儿头皮电极,没有脉冲多普勒,也没有出生后随访——这一点决定了它能评什么、不能评什么。

把它当成一把尺子最合适:尺子只有一把,刻度却很密。你要衡量的是同一条分离算法在孕周推进、电极挪位、胎心逐渐增强的条件下是否稳定,而不是它在不同人身上是否都灵。一屏速览见下表。

维度 内容
全名 Non-Invasive Fetal Electrocardiogram Database
常用缩写 NIFECGDB
发布方与版本 PhysioNet,2007 年 9 月 6 日,v1.0.0
DOI 10.13026/C2X30H
采集单位 瓦伦西亚大学电子工程系数字信号处理组(GPDS)
采集时间 2003 年 11 月至 2004 年春
受试者 1 名孕妇
孕周跨度 21 至 40 周,逐周采集
记录数 55 段
导联构成 2 路胸导 + 3 或 4 路腹导(多数 4 路)
采样与量化 1 kHz,16 位,0.01 至 100 Hz,50 Hz 陷波常开
文件格式 EDF/EDF+
标注 每段一份 .qrs 心搏标注
胎儿参考信号 无
整包体量 372.6 MB(未压缩)
许可 Open Data Commons Attribution License v1.0

§1 它要解决的具体麻烦

1.1 一句话结论:它测的是同一个人身上的时间变化,不是不同人之间的差异

母胎心电分离是典型的盲源分离问题:腹壁上测到的电位里,母体心电的幅度通常是胎儿心电的数倍到数十倍,而两者的心率、波形、出现时刻都不同却又重叠。算法要做的,是从混合信号里把胎儿的 QRS 找出来。要判断一个算法好不好,只有两条路:要么找很多人来测泛化,要么找一个人连续测很久来测稳定性。NIFECGDB 走的是后一条,而且走得很彻底——它把同一个人在二十个孕周里的腹部信号全部摊开,让使用者能看见胎儿心电从几乎不可见,一路长到可以被单独识别的全过程。

这条路线的价值在于变量被压到了最少。人群差异、体质差异、胎位差异、设备差异全部消失,剩下的只有孕周这一个自变量。当你把某段记录上的分离失败归因于「算法对低信噪比不鲁棒」时,你可以立刻去翻同一个人的早期记录,看它是从哪一周开始失效的。这种可追溯性,是横断面库给不了的。

代价同样彻底:样本量是一。任何需要跨受试者统计的结论,在这份数据上都做不出来。

1.2 三条常见的错误期待

常见期待 实际情况 后果
以为这是「多名孕妇的胎心电测试集」 全部 55 段来自同一人 报告出的泛化指标没有意义
以为附带的 .qrs 是胎儿心搏金标准 官方只写「心搏标注」,未指明对象 用它算胎心检出率会得到系统性偏差
以为孕 21 至 40 周覆盖了孕期全程 只覆盖中晚孕,且只有一个人 早孕期结论不能外推,人群结论更不能

第一条最常犯。数据包小、下载快、记录整齐,很容易被当成「胎心电入门的标准测试集」直接塞进评测流程,然后在一份 n=1 的数据上报出一个四位数百分比的准确率。这个数字本身没有错,错在它被当成了人群性能。

第二条更隐蔽。多数使用者在拿到 EDF 文件和同名的 .qrs 之后,会默认标注对应胎儿心搏,因为库名里写的是 fetal。但记录里明明有两路胸导,母体 QRS 才是最容易标、也最常被标的那一类。在没有官方说明的情况下,任何以 .qrs 为真值的胎心指标都建立在假设之上。

第三条属于范围误读。官方写的是 21 至 40 周,这已经覆盖了中孕到足月,看起来很长;但它是同一个人的二十周,而不是二十个孕周各若干人。孕周维度上的覆盖度,不等于人群维度上的覆盖度。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
一段能跑通分离算法的真实腹壁心电 55 段,导联清晰、格式标准 够
观察胎心电随孕周增强的过程 21 至 40 周逐周记录 够,且是它最独特的资产
评测算法在低信噪比下的退化曲线 早期记录胎心极弱,天然形成难度梯度 够
训练一个可用的深度分离模型 约十小时量级、单受试者 不够
报告跨人群的泛化性能 单受试者 不够
计算胎儿心搏的检出率与阳性预测值 无胎儿金标准 不够
做胎儿心律失常分析 无节律诊断标注 不够
验证母体心电减除后的残差质量 有胸导可做母体参考 够

最后一行值得展开。两路胸导的存在,让这份数据成为一个「自带母体参考」的库:你可以先用胸导估出母体 QRS 的时刻,再在腹导上做模板减除,得到的残差就是胎儿成分的近似。这条路径不需要任何胎儿金标准就能自我校验,也是它在教学场景里长期被使用的原因。

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

你的处境 它能帮你什么 下一步该做什么
刚写完一个母胎分离算法,想找真实数据跑通 55 段 EDF+ 可直接读入,无需预处理 先在孕周最晚的几段上验证,再往早期推
论文需要一张「随孕周变化」的图 逐周记录天然支持时间轴作图 明确写出 n=1,不要写成队列趋势
想给学生演示母胎心电叠加是什么样 胸导与腹导同文件并列,对比直观 配一段胸导与腹导的同步波形即可
在做可穿戴腹部心电的设备验证 电极位置逐次变动,接近真实佩戴条件 注意不同记录的通道不可直接对齐
需要一个有胎儿金标准的评测集 给不了 改用带直接胎心电的库
想预训练一个通用心电模型 数据量太小 用大库预训练,用它做下游验证

1.5 一句话判断

它是一份纵向的、单人的、没有标准答案的腹壁心电长卷;用它衡量算法的稳定性恰好,用它衡量算法的普适性则从一开始就问错了问题。

1.6 不适合谁:四条边界

边界 说明
不适合做人群泛化评测 单受试者,任何跨人结论都缺依据
不适合做胎儿心搏精度的真值评测 无胎儿金标准,标注对象未明示
不适合直接训练大模型 约十小时量级,参数规模远超数据承载力
不适合早孕期研究 起点为孕 21 周,早孕期信号不在覆盖范围内

还有一条软边界:它也不适合做「多导联空间分布」的研究。腹导只有三到四路,且位置在孕周之间被有意挪动过,通道之间不构成固定的空间阵列。想研究导联优化的人,需要的是固定几何布局的多导记录,而不是这份。

§2 数据构成与规格

2.1 一次采集的物理布置

采集用的是一台 g.BSamp 生物电放大器,电极为 Ag-AgCl 型。胸壁上贴两枚,取母体心电;腹壁上贴三到四枚,取母胎混合心电。官方明确写了一句很关键的话:电极位置在不同记录之间被调整过,目的是改善信噪比。这句话解释了两件事——为什么同一个人的腹导在不同孕周不能当作同一通道处理,以及为什么这个库的通道命名只有序号而没有解剖定位。

通道名 位置 主要成分 记录中的出现情况
Thorax_1 胸壁 母体心电为主 全部记录
Thorax_2 胸壁 母体心电为主 全部记录
Abdomen_1 腹壁 母体 + 胎儿心电混合 全部记录
Abdomen_2 腹壁 母体 + 胎儿心电混合 全部记录
Abdomen_3 腹壁 母体 + 胎儿心电混合 全部记录
Abdomen_4 腹壁 母体 + 胎儿心电混合 多数记录
EDF Annotations 非电极 EDF+ 标注通道 全部记录

需要说明的是,EDF+ 格式会把标注作为一路「信号」写进文件,因此用通用 EDF 阅读器打开时看到的通道数会比电极数多一。这一点在统计导联数时最容易出错:一个含四路腹导的文件会显示七个通道,其中一个是标注,不是电极。

2.2 记录字典

字段 位置 含义 取值示例
文件名 文件系统 记录编号 ecgca102
患者标识 EDF 头,第 8 至 87 字节 性别与孕周,孕周为「周+天」 Gestation_22+1
记录标识 EDF 头,第 88 至 167 字节 采集起始日期 Startdate 16-NOV-2003
起始时刻 EDF 头,第 176 至 183 字节 采集开始时间 21.49.00
记录段数 EDF 头,第 236 至 243 字节 数据记录块个数 45
段长 EDF 头,第 244 至 251 字节 每块秒数 6
通道数 EDF 头,第 252 至 255 字节 含标注通道 6 或 7
通道标签 每通道 16 字节 电极名 Thorax_1
物理单位 每通道 8 字节 微伏 uV
物理上下限 每通道 8 字节 量程 -2.5 至 2.5
数字上下限 每通道 8 字节 量化范围 32767
前置滤波 每通道 80 字节 硬件滤波设置 HP:0.01Hz LP:100Hz NF:50Hz
采样数 每通道 8 字节 每块采样点 6000
心搏标注 同名 .qrs 文件 WFDB 注释,时间分辨率 1000 二进制

表格里「段长」与「记录段数」相乘才是单段时长。以 ecgca102 为例,45 块乘以 6 秒得 270 秒,即四分半;ecgca115 是 146 块乘以 5 秒,约十二分钟。官方对此的表述是「记录时长不等」,没有给出总时长,也没有给出最短与最长的界限。按 1 kHz、16 位、五到六路折算,每分钟约 0.6 至 0.7 MB,整包 372.6 MB 对应全库十小时上下——这个数字是折算值,官方未直接公布。

2.3 一条记录的完整解剖

以 ecgca102 为例,把它的 EDF 头按字段拆开,能看到这份数据的全部结构信息都压在文件头里,正文没有任何额外索引。

0       X F X Gestation_22+1
88      Startdate 16-NOV-2003 X X X
168     16.11.03        176  21.49.00
184     1792            192  EDF+C
236     45              244  6
252     6
通道 1  Thorax_1    uV  -2.5   2.5   32767  HP:0.01Hz LP:100Hz NF:50Hz  6000
通道 2  Thorax_2    uV  -2.5   2.5   32767  HP:0.01Hz LP:100Hz NF:50Hz  6000
通道 3  Abdomen_1   uV  -2.5   2.5   32767  HP:0.01Hz LP:100Hz NF:50Hz  6000
通道 4  Abdomen_2   uV  -2.5   2.5   32767  HP:0.01Hz LP:100Hz NF:50Hz  6000
通道 5  Abdomen_3   uV  -2.5   2.5   32767  HP:0.01Hz LP:100Hz NF:50Hz  6000
通道 6  EDF Annotations

这段结构说明三件事。孕周不需要去别处查表,它就写在患者标识里,格式固定为「Gestation_周+天」。记录日期写在记录标识里,因此整库的时间轴可以完全不依赖文件名而重建。滤波参数被逐通道写进文件头,意味着任何复现实验都能知道信号在数字化之前经历过什么——0.01 Hz 高通、100 Hz 低通、50 Hz 陷波,三道都在硬件里完成,没有留下未滤波的原始版本。

这也是一条边界:如果研究的是 50 Hz 以上的胎儿心电高频成分,这份数据帮不上忙,因为它在采集时就已经被切掉了。

你想问的问题 头字段能否直接回答 需要读哪个字段
这段是孕几周 能 患者标识
这段是什么时候采的 能 记录标识与起始时刻
这段有多长 能,需做乘法 段数与段长
电极贴在哪里 不能 无此字段
采集时胎儿什么体位 不能 无此字段
信号经过哪些滤波 能 每通道前置滤波

2.4 五个规格参数

参数 官方值 对使用的含义
采样率 1 kHz 胎儿 QRS 主频在数十赫兹量级,1 kHz 足够;但高频细节不如 2 kHz 级记录
量化位数 16 位 腹导上胎儿成分幅度小,16 位留有足够动态范围
带宽 0.01 至 100 Hz 基线漂移被压到极低,代价是极低频的胎动伪迹也被部分削弱
工频陷波 50 Hz,常开 欧洲电网环境下的必要处理,但不可关闭、不可复原
导联数 2 胸 + 3 或 4 腹 母体参考充分,胎儿空间信息有限

值得单独说的是 0.01 Hz 这个高通截止。它低到几乎不损失任何心电成分,同时又足以把电极极化带来的缓慢漂移压住。在腹壁记录里,基线漂移往往比胎儿 QRS 大一个数量级,这个设置实际上替使用者省掉了去基线这一步。反过来说,如果你的算法本身就包含去基线模块,用这份数据做消融会看不出差别,因为前置滤波已经把这件事做完了。

2.5 与同类资源的字段差异

维度 NIFECGDB 带直接胎心电的库 带多普勒参考的库 合成库
受试者数 1 通常为个位数 数十 不适用
腹导数 3 或 4 4 至 8 十余路以上 可配置
采样率 1 kHz 1 kHz 级 1 至 2 kHz 可配置
胎儿金标准 无 有,头皮电极 有,多普勒 有,生成时已知
纵向跨度 二十周 单次 单次 不适用
母体参考 有,2 路胸导 有 有 可配置

这张表里没有一行是「更好」或「更差」,只有「不同」。胎儿金标准这一列决定了能不能算检出率,纵向跨度这一列决定了能不能画时间曲线,两者不可兼得,也很少有库同时具备。

§3 它记录的是什么:一个人、二十周、一根曲线

3.1 单受试者设计到底意味着什么

在临床试验里,n=1 是病例报告;在信号处理里,n=1 是受控实验。同一件事的两种读法,取决于你想控制什么、想观察什么。NIFECGDB 的采集者显然选了后一种读法:他们把可能干扰判断的因素一个个按下去,只留下孕周在动。

被按下去的变量 按下去的方式 留下的变量
个体差异 只采一个人 孕周
设备差异 全程同一台 g.BSamp,同一批 Ag-AgCl 电极 电极位置
滤波设置差异 三道硬件滤波固定,不随记录改变 胎心幅度
采集时间差异 逐周进行,间隔近似固定 母体状态
判读标准差异 单一标注流程,注释者清单只列一类 信号本身

这张表的右列就是这份数据的自变量。你在它上面做实验,等于在一个其他条件都被钉死的台架上换载荷,得到的曲线干净、可比、可解释。代价是这条曲线只描述一个人。

你想要的结论类型 单人纵向能否支持 需要补什么
算法随信噪比下降的退化形态 能 无需补充
胎心电幅度随孕周的增长趋势 能,但只对这个人 需要多人才谈得上趋势
算法在人群中的平均表现 不能 换多受试者库
电极位置对分离效果的影响 能,且是少见的可用资源 无需补充
母体心率变化对分离的干扰 能 无需补充

3.2 孕周是怎么进入数据的

很多数据集把孕周放在单独的元数据表里,NIFECGDB 没有。它把孕周直接写进了 EDF 头的患者标识字段,格式固定为「Gestation_周+天」。这个做法在 2003 年是省事,在今天是方便——文件自己带着时间戳,不需要任何外部索引就能把五十五段排成一条时间轴。

记录 患者标识原文 解析出的孕周 记录起始日期
ecgca102 Gestation_22+1 孕 22 周 1 天 2003 年 11 月 16 日
ecgca115 Gestation_27+6 孕 27 周 6 天 2003 年 12 月 28 日
ecgca997 Gestation_23+6 孕 23 周 6 天 2003 年 11 月 23 日
ecgca776 Gestation_33+4 孕 33 周 4 天 2004 年 2 月 6 日
ecgca436 Gestation_31+4 孕 31 周 4 天 2004 年 1 月 23 日

从这五行可以读出两件事。第一,编号不是按孕周递增的,ecgca997 的孕周比 ecgca115 早,说明文件名里的数字与时间顺序无关,排序必须靠孕周字段。第二,日期与孕周是自洽的:从 11 月 16 日的 22 周 1 天,到 2 月 6 日的 33 周 4 天,中间隔 82 天,孕周推进 11 周 3 天,即 80 天,误差在两天以内。这种自洽性意味着你可以放心用日期做交叉校验,而不必担心字段错位。

解析步骤 做法 注意点
取患者标识 读 EDF 头第 8 至 87 字节 字段用空格补齐,需先 strip
提取孕周 匹配 Gestation_ 之后的部分 格式为「数字+数字」,加号是分隔符
换算天数 周数乘 7 再加天数 用于排序与回归
取采集日期 读第 88 至 167 字节的 Startdate 格式为「日-月缩写-年」
校验 日期差与孕周差应一致 偏差大于三天说明有记录缺失或标注异常

3.3 同一根导联上的两个心跳

腹导上同时存在两个心电:母体的幅度大、节律稳,胎儿的幅度小、频率高。二者在时域上不规则地互相穿插,在频域上又有重叠,这就是分离问题难的地方。

特征 母体心电 胎儿心电
心率量级 每分钟六十至九十次 每分钟一百一十至一百六十次
腹壁上的幅度 大,通常为主导成分 小,常被淹没
波形清晰度 高,QRS 尖锐 低,随孕周与胎位变化
在胸导上的可见性 清晰可见 不可见
随孕周的变化 基本稳定 逐渐增强

把母体与胎儿两种成分放进真实采集环境,还要再叠几层干扰,下面按能否被硬件滤波处理排列。

干扰来源 表现 在 0.01 至 100 Hz 带宽内的处置
基线漂移 缓慢起伏,幅度可大于胎心 被 0.01 Hz 高通压住
工频干扰 50 Hz 正弦 被硬件陷波切掉
肌电噪声 高频随机,孕妇移动时明显 部分落在带内,无法去除
电极接触噪声 突发跳变 落在带内,需人工剔除
胎动伪迹 低频大幅波动 部分被高通削弱,残余仍在

上表最后两行是这份数据里真正需要人工判断的部分。官方没有提供质量分级,也没有标出坏段,使用者拿到的是原始记录,得自己看波形决定哪几段能用。这一点在计算任何指标之前都必须先做,否则一段电极脱落造成的平坦线会把统计结果拉偏。

3.4 五十五段是怎么排的

官方的描述是「逐周采集,部分孕周采集了两段以上」。这句话对应两种可能的排布:一种是固定每周一次、偶尔加采;另一种是不定期随访、凑够五十五段。从日期跨度看,二十周对应五十五段,平均每周接近三段,说明采集密度高于每周一次。

排布问题 官方表述 可从文件推出的部分
采集频率 逐周,部分周两次以上 五十五段分布在二十周内,密度高于每周一次
是否有中断 未说明 日期连续,未见以月计的空档
是否有重复采集 有,部分周两段以上 可由同周多段比对
编号规则 未说明 编号与时间顺序无关
单段时长 不等 数分钟至十余分钟

平均密度这件事值得多想一步。如果真是每周一次,二十周最多二十段;实际有五十五段,意味着很多孕周采了两到三段。这对做纵向分析的人是好消息:同一孕周内的多次采集,可以拿来估计「同一孕周内的变异」,把孕周效应和日内变异分开。官方没有点明这一点,但数据结构支持这种用法。

分析目标 需要的结构 这份数据是否支持
孕周效应 每孕周至少一段 支持
孕周内变异 同孕周多段 支持,部分孕周有两段以上
日内变异 同日多次 不支持,未见同日重复
长期趋势 跨月连续 支持,跨五个月
个体基线 单人重复测量 支持,这正是它的强项

3.5 你能从一条记录里读出什么

把一段记录打开,能回答的问题和不能回答的问题界限分明。

问题 能否从单段记录回答 依据
这段录音里胎心在不在 能,晚期记录肉眼可辨 腹导波形
胎心率是多少 能,但需先分离 分离后的 R 峰间隔
母体心率是多少 能,胸导直接可读 胸导波形
母胎心率比是否稳定 能 两路 R 峰序列比对
胎儿心律是否整齐 勉强能,缺诊断标注 需自行判读
胎儿有无结构异常 不能 无心电以外的信息
出生结局如何 不能 无随访
电极具体贴在哪 不能 只有序号,无解剖定位

最后一行容易被忽略。腹导的名字只有 Abdomen_1 到 Abdomen_4,没有「左侧腹」「脐下」这类定位。加上官方说位置逐次调整过,任何假设「Abdomen_1 在所有记录中对应同一解剖位置」的分析都会失准。做导联间相关性研究时,必须把这一点写进限制条件。§4.3 的案例正是三路腹导的记录,它和四路记录之间的差别,就是只看通道数看不出来的那部分。

§4 它最独特的东西:二十周纵向

4.1 纵向设计在信号处理里的用处

横断面数据回答「现在怎么样」,纵向数据回答「怎么变成现在这样」。对母胎分离来说,后一个问题更重要,因为胎儿心电在腹壁上的可检测性本身就是随孕周变化的:早期几乎不可见,晚期清晰可辨。一个只在晚期记录上验证过的算法,很可能在早期完全失效,而使用者往往不知道失效点在哪里。

用途 横断面库 本库
报一个平均性能 可行,样本多 意义有限
画出性能随孕周变化的曲线 不可行 可行
定位算法的失效孕周 不可行 可行
研究电极位置的影响 需专门设计 天然具备
研究个体内的稳定性 不可行 可行

把纵向价值落到具体问题上,能跑出结果的只有下面四类。

纵向分析能问的问题 需要的比较对象 本库的可用样本
同一算法在孕 22 周与 38 周差多少 两个孕周的记录 两端都有
胎心幅度从哪一周开始超过噪声 逐周序列 逐周记录
电极挪位是否立刻改变分离难度 相邻两次记录 位置变动处可比
母体心率是否随孕周漂移 逐周胸导 逐周胸导

4.2 电极为什么要挪

官方原话是电极位置被改变以改善信噪比。这句话背后是一个很实际的问题:随着孕周推进,胎儿心脏在腹壁上的投影位置会移动,原来贴着信号最好的位置,几周后可能就变差了。采集者于是不断地挪电极去找最佳点。

孕周阶段 胎儿心脏相对腹壁的位置 电极策略的含义
孕 21 至 24 周 位置低,接近耻骨上方 电极偏下更易取到信号
孕 25 至 30 周 逐步上移 需要重新寻找最佳点
孕 31 至 36 周 接近脐周 电极多集中在腹部中段
孕 37 至 40 周 位置相对固定,但胎位变化大 信号质量受胎位影响明显

位置一挪,麻烦就落到使用者这边,下面四条按遇到的先后排列。

对使用者的影响 具体表现 应对
通道不可跨记录对齐 Abdomen_1 在不同记录中解剖位置不同 只在单段内做空间分析
通道数不一致 部分记录三路腹导,多数四路 取交集或按记录分别处理
信噪比不可比 挪位本身改变了信号质量 把位置变动当作混杂因素报告
电极极性未标注 未说明各导联的参考与方向 不做跨导联的极性推断

第三行是最麻烦的。如果你把二十周的记录拼成一条时间序列,然后声称「信噪比随孕周改善」,这个结论里混进了电极挪位的贡献。稳妥的写法是把它写成「在电极位置随孕周调整的采集条件下,观测到的信噪比变化」,而不是纯粹的生理趋势。

4.3 案例:孕 22 周 1 天的那一段 ecgca102

ecgca102 是全库最早的记录之一,孕 22 周 1 天,2003 年 11 月 16 日采集。它只有三路腹导,六路通道(含标注),45 个数据块、每块 6 秒,合计 270 秒。文件 2.6 MB,是全库最小的几个之一。

属性 值 意义
记录编号 ecgca102 编号与时间无关
孕周 22 周 1 天 接近全库起点
腹导数 3 少数三导记录之一
总通道数 6 2 胸 + 3 腹 + 1 标注
时长 270 秒 四分半
文件大小 2.6 MB 最小档
标注 同名 .qrs,878 字节 心搏标注

这段记录适合当入门样本:文件小、下载快、结构完整,而且处在胎心电最弱的阶段。任何分离算法在这里能跑出可辨认的胎儿 QRS,基本说明它在低信噪比下有一战之力。反过来,如果算法在晚期记录上表现很好、在这里完全失效,你就能确定它的失效边界在孕 22 周之前。

§5.3 的代码就用这一段做示例,因为它的通道数少、头信息干净,最容易看清结构。§9.2 的最短流程同样以它为起点,跑通之后再换到晚期记录上对比,是最省时间的验证顺序。

4.4 无参考信号的代价

你想算的指标 需要什么 本库有没有
胎儿 QRS 检出率 胎儿心搏真值 没有
胎儿 QRS 阳性预测值 胎儿心搏真值 没有
母体 QRS 检出率 母体心搏真值 有胸导,可自建
分离后残差能量 胎儿成分估计 只能间接
胎心率误差 胎心真值 没有

没有真值就只能换一套评价办法,常见的有五种,可信度一列是编辑判断。

替代做法 怎么做 可信度
用胸导做母体参考 胸导 R 峰对齐后模板减除 高,母体成分可靠
用互相关系数做自洽检验 多腹导分离结果应一致 中,一致不等于正确
与公开算法对比 同一段跑多个算法看分歧 中,只反映算法间差异
用晚期记录当参照 胎儿信号强、肉眼可查 中,仍需人工判读
用合成数据做交叉验证 在合成库上调参再迁移 低到中,域差异大

第三行是很多论文实际采用的做法:没有真值,就比算法之间的一致性。这种做法的说服力有限,因为多个算法可能共享同一个错误假设。更稳的是第五行加第一行的组合——先在合成数据上验证方法,再用胸导参考在真实数据上确认母体成分被正确去除,把「胎儿成分正确」这一步留给有金标准的库去证。

4.5 反事实:如果它是十个人的二十周

设计 样本量 能回答的问题 数据规模
单人二十周(本库) 55 段 时间维度上的稳定性 十小时量级
十人各两周 约 140 段 有限的个体间比较 数十小时
十人各二十周 约 550 段 时间与个体双维度 上百小时
百人各一次 100 段 人群分布 数十小时

这不是在说本库应该做成第四种。采集成本决定了 2003 年只能做第一种:一个孕妇愿意连续二十周每周到实验室躺着做几分钟记录,已经是相当高的配合度;要凑十个人做同样的事,伦理审批、随访脱落、设备占用都会成倍上升。理解了这一点,就不会把「只有一个受试者」读成疏忽,而会读成一种在约束下的取舍。

§5 怎么拿到:从 372.6 MB 的包里取出你要的那一段

5.1 三条取数路径

路径 命令形态 适用场景 是否需要账号
网页整包 下载 ZIP 一次性拿全量 否
wget 递归 按目录镜像 只要部分文件 否
S3 同步 匿名同步桶 脚本化、可断点 否

三条路径拿到的内容完全一致,没有需要申请的受限部分。整包 372.6 MB,含 55 个 EDF、55 个 .qrs、一份 RECORDS、一份 ANNOTATORS 和一份校验和清单。若只需要几段做试验,递归下载比整包更快。

#-- 只取记录清单与标注者清单,先看清结构
curl -sO https://physionet.org/files/nifecgdb/1.0.0/RECORDS
curl -sO https://physionet.org/files/nifecgdb/1.0.0/ANNOTATORS
wc -l RECORDS
#-- 镜像整个目录到本地,已存在的文件自动跳过
wget -r -N -c -np https://physionet.org/files/nifecgdb/1.0.0/ -P ./nifecgdb
#-- 用 AWS 命令行匿名同步,支持断点续传
aws s3 sync --no-sign-request s3://physionet-open/nifecgdb/1.0.0/ ./nifecgdb --region us-east-1

5.2 先把文件头读出来

在写任何分离代码之前,先确认你能正确读出通道、单位与孕周。这一步做对,后面所有统计才不会错位。

#-- 读 EDF 头,打印通道、单位、孕周与时长
import mne

raw = mne.io.read_raw_edf("nifecgdb/ecgca102.edf", preload=False, verbose=False)
print("通道:", raw.ch_names)
print("采样率:", raw.info["sfreq"])
print("单位:", {ch: raw.get_channel_types([ch]) for ch in raw.ch_names[:1]})

#-- 孕周写在测量日期字段之外的原始头里,用底层接口取
import pyedflib
f = pyedflib.EdfReader("nifecgdb/ecgca102.edf")
print("患者标识:", f.getPatientName())
print("记录标识:", f.getRecordingAdditional())
print("起始时间:", f.getStartdatetime())
f.close()
读到的字段 期望值 常见偏差
通道数 6 或 7 把标注通道算成电极
采样率 1000.0 单位被读成 kHz
患者标识 Gestation_22+1 被解析成空串
记录标识 Startdate 16-NOV-2003 只取到 Startdate 一词
物理单位 uV 被读成 mV 导致幅度差三个数量级

下面三段代码全部以 §4.3 的案例所用的那段记录为输入对象,它的通道数少、头信息干净,跑通之后再换成晚期记录,差异才看得清。

5.3 用胸导定位母体心搏

两路胸导是这份数据的隐藏福利。母体 QRS 在胸导上干净可辨,把它检出来,就等于拿到了腹导上母体成分的时间戳。

#-- 在胸导上检母体 R 峰,作为后续减除的时间基准
import numpy as np
from scipy.signal import find_peaks

fs = int(raw.info["sfreq"])
thorax = raw.get_data(picks=["Thorax_1"])[0]
thorax = (thorax - thorax.mean()) / thorax.std()

peaks, _ = find_peaks(thorax, height=2.0, distance=int(0.33 * fs))
print("母体心搏数:", len(peaks))
print("平均心率:", round(60 * fs / np.median(np.diff(peaks)), 1), "bpm")
参数 取值 理由
极性 正峰 胸导 QRS 方向固定
高度阈值 2 倍标准差 高于噪声,低于 T 波误检
最小间隔 0.33 秒 对应 180 bpm 上限,留足余量
处理对象 归一化后的胸导 消除增益差异

5.4 在腹导上做模板减除

拿到母体心搏时刻之后,最简单的分离就是模板减除:把每个心搏前后的片段取平均,得到母体 QRS 模板,再在腹导上逐点减掉。这个方法粗糙,但足以把母体成分压下去一大截,让胎儿成分露出来。

#-- 以胸导 R 峰为锚,在腹导上做母体模板减除
abd = raw.get_data(picks=["Abdomen_1"])[0]
half = int(0.25 * fs)

beats = np.stack([abd[p - half:p + half] for p in peaks if half < p < len(abd) - half])
template = beats.mean(axis=0)
residual = abd.copy()
for p in peaks:
    if half < p < len(abd) - half:
        residual[p - half:p + half] -= template

print("原始标准差:", round(abd.std(), 2))
print("残差标准差:", round(residual.std(), 2))
观察项 减除前 减除后
母体 QRS 幅度 主导 明显压低
胎儿 QRS 可见性 基本不可见 部分记录可辨
基线稳定性 尚可 出现台阶伪迹
适用记录 全部 母体节律稳定者效果最好

第三步的台阶伪迹是模板减除的固有缺陷:每个心搏减掉的模板一样,但实际波形每次都有差异,残差里就留下与心搏同步的小台阶。这些台阶在频域上会落在胎儿 QRS 附近,容易被误当成胎儿心搏。使用这个方法时,任何检出的胎心都必须回到波形上人工确认。

5.5 读 .qrs 标注

#-- 读 WFDB 注释,时间分辨率 1000 表示毫秒级
import wfdb

ann = wfdb.rdann("nifecgdb/ecgca102.edf", "qrs")
print("标注点数:", len(ann.sample))
print("标注符号集合:", set(ann.symbol))
print("前十个位置:", ann.sample[:10])
字段 值 说明
采样点 整数序列 相对记录起点的位置
符号 单一类别 官方清单只列一类心搏标注
时间分辨率 1000 注释器时间单位,非采样点
标注对象 未明示 需自行核对是母体还是胎儿

第四行必须反复强调。ANNOTATORS 文件只有一行,写的是「qrs beat annotations」,没有说明标的是谁的心搏。记录里同时有胸导与腹导,如果标注来自胸导,那它就是母体心搏;如果来自腹导,则可能只标了清晰可辨的那一类。使用前先取一段标注,把位置对齐到胸导波形上看——如果每个标注点都恰好落在胸导 QRS 上,答案就明确了。

5.6 常见报错与处置

现象 原因 处置
通道数比预期多一 EDF+ 把标注写成通道 按名称剔除 EDF Annotations
读出的幅度异常小 单位被当成 mV 按 uV 重新换算
孕周字段为空 患者标识被空格截断 取原始字节再 strip
时间轴对不上日期 起始时刻按本地时区解析 固定用记录内时间
标注点越界 注释器时间分辨率被当成采样率 按 1000 而非 1000 Hz 解读
某段信号平坦 电极接触不良 该段剔除,不要填补

最后一行不是技术问题,是判断问题。官方没有提供质量标记,平坦段、跳变段、脱落段都要自己认。在三十秒内看一眼包络就能大致筛出来,比事后追查指标异常省事得多。

#-- 用校验和确认下载完整,避免半包导致的读取失败
cd nifecgdb && sha256sum -c SHA256SUMS.txt --quiet && echo "整包完整"

§6 与库内同域资源的关系

6.1 关系图谱

安放这份数据的位置,要同时看三个坐标:受试者数、有无胎儿参考、是否纵向。同库里的五个邻居各自占据不同角落,没有一个与它重合。

资源 受试者 导联 采样率 胎儿参考 纵向 与它的关系
NIFECGDB 1 名孕妇 2 胸 + 3 或 4 腹 1 kHz 无 二十周 本词条主体
NInFEA 39 名孕妇 27 路 2048 Hz 脉冲多普勒 单次 横向补人群,纵向缺
adfecgdb 5 例 腹导 + 直接胎心电 1 kHz 胎儿头皮电极 单次 唯一有创金标准
nifeadb 26 段 腹导 1 kHz 级 无 单次 补节律异常病例
fecgsyndb 合成 可配置 可配置 生成时已知 不适用 补训练量
fpcgdb 心音 不适用 不适用 心音参考 单次 换模态,不重叠
fetalheartsounddata 心音 不适用 不适用 心音参考 单次 换模态,不重叠
icehg-ds 孕期电生理 多路体表 未在此展开 视原始研究 单次 场景相邻,任务不同

前四行构成一条完整的评测链:用合成库训模型,用本库测孕程稳定性,用 NInFEA 测人群泛化,用 adfecgdb 测有金标准时的绝对精度。后三行不在这条链上——心音与孕期电生理是另外两个模态,与腹壁心电不构成替代关系。

6.2 与 NInFEA 的差别:一个铺时间,一个铺人群

这两份数据最容易被混为一谈,因为它们都叫非侵入式胎儿心电,都挂在 PhysioNet,都开放下载。把关键维度并排放,差别立刻显出来。

维度 NIFECGDB NInFEA
受试者 1 名 39 名
记录数 55 段 60 段
孕周 21 至 40 周 21 至 27 周
导联 2 胸 + 3 或 4 腹 27 路体表
采样率 1 kHz 2048 Hz
量化 16 位 22 位
胎儿参考 无 脉冲多普勒
呼吸信号 无 有
采集地 西班牙瓦伦西亚 意大利卡利亚里
发布年 2007 2020

四个差别值得单独说。导联数:27 路对 5 至 6 路,前者能做好多导空间滤波与盲源分离,后者只能靠时间域方法。采样率:2048 Hz 保留了更宽的高频,1 kHz 在胎儿 QRS 主频上够用但上限更低。参考信号:多普勒给出了独立于心电的胎心时刻,这是能算检出率的前提,本库没有。孕周段:NInFEA 集中在孕 21 至 27 周的早中孕,本库一路铺到足月,后段是对方的空白。

你的任务 该选哪个 理由
多导盲源分离 NInFEA 27 路才有空间自由度
单导或双导时域分离 本库 通道少,正好对应可穿戴场景
计算胎心检出率 NInFEA 有独立参考
画孕程变化曲线 本库 覆盖到足月
早孕期信号研究 NInFEA 本库起点为孕 21 周
电极位置影响研究 本库 位置逐次调整

6.3 与 adfecgdb、nifeadb 的分工

adfecgdb 的价值在于那根头皮电极:它在分娩时直接贴在胎儿头皮上,取到的是不受母体干扰的胎儿心电。有了它,胎儿 QRS 的真值就是确定的,任何分离算法都能算出确切的检出率与阳性预测值。本库没有这一层,因此在「绝对精度」这件事上无法与它竞争。

维度 NIFECGDB adfecgdb
胎儿参考 无 头皮电极直接记录
能否算检出率 不能 能
采集场景 产前随访 分娩期
孕周 21 至 40 周 足月临产
记录数 55 段 5 例
纵向信息 有 无

nifeadb 补的是另一块:节律异常。它的记录来自有胎儿心律失常的病例,配合心电标注可以研究节律问题。本库的五十五段来自一次正常妊娠,没有心律失常的标注,也没有诊断结论。

维度 NIFECGDB nifeadb
病例性质 单例正常妊娠 心律失常病例
节律标注 无 有
用途 分离算法稳定性 节律判读
样本量 55 段 26 段
纵向 二十周 单次

6.4 与合成库、心音库的边界

fecgsyndb 是合成数据:胎儿与母体心电分别生成再按已知比例叠加,因此每个采样点的成分都是已知的。它的作用是把训练量补足,把本库补不了的「大样本」这件事接过去。代价是合成信号的统计特性与真实腹壁记录有差距,直接迁移会掉点。

资源 模态 真值来源 典型用途 与本库的关系
fecgsyndb 合成腹壁心电 生成参数 预训练、消融 互补,不替代
fpcgdb 胎心音图 同步心电或标注 心音分析 不同模态
fetalheartsounddata 胎心音 采集时记录 心音检测 不同模态
icehg-ds 孕期电生理 原始研究设计 孕期电生理研究 场景相邻

心音类资源常被误认为胎心电的替代品。两者测的是不同物理量:心音是机械振动的声学记录,心电是电活动。心音能给出心率和节律,但给不出波形形态,也无法用于评价心电分离算法。把三者放在一起比较「谁更好」,是把不同量纲的东西放在同一把尺子上。

6.5 组合使用的三条路线

路线 组合 适用目标
训练加验证 fecgsyndb 预训练,本库验证孕程稳定性 论文里的主实验
稳定性加泛化 本库测单人纵向,NInFEA 测多人横断 强调鲁棒性的工作
相对加绝对 本库测算法间差异,adfecgdb 测绝对精度 需要报告检出率的工作

三条路线都建立在一个前提上:同一套预处理。本库的硬件滤波(0.01 至 100 Hz、50 Hz 陷波)与其他库不同,跨库比较前必须先对齐带宽与重采样,否则差异里混进了预处理差异。这一点在写论文的方法节时应当明确交代。

6.6 检索路径

想找什么 在库内怎么找 在本库怎么找
同类胎心电资源 按生理信号加儿科标签 不适用
单人纵向数据 按受试者数为 1 筛 RECORDS 只有 55 行
有金标准的胎心电 找带直接胎心电的记录 本库无
特定孕周记录 按孕周字段筛 解析患者标识
特定导联数记录 按通道数筛 读 EDF 头通道数

找到之后的下一步通常是跨库对照。跨库之前有四件事必须先对齐,否则比出来的差异讲不清来源。

跨库前必须对齐的四项 本库的设定 不对齐的后果
采样率 1 kHz 重采样错误会改变 QRS 宽度
带宽 0.01 至 100 Hz 高频差异被算成算法差异
陷波 50 Hz 常开 跨库比较混入工频处理差异
导联数 5 至 6 路 多导算法无法直接套用
#-- 按孕周把五十五段排成时间轴,输出记录名与孕周天
python3 - <<'PY'
import re, urllib.request
recs = urllib.request.urlopen("https://physionet.org/files/nifecgdb/1.0.0/RECORDS").read().decode().split()
rows = []
for r in recs:
    req = urllib.request.Request("https://physionet.org/files/nifecgdb/1.0.0/" + r,
                                 headers={"Range": "bytes=0-511"})
    h = urllib.request.urlopen(req).read()
    m = re.search(r"Gestation_(\d+)\+(\d)", h[8:88].decode("latin1"))
    if m:
        rows.append((int(m.group(1)) * 7 + int(m.group(2)), r))
for days, name in sorted(rows):
    print(days, name)
PY

§7 质量评估与局限性

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

很多质量讨论会把「样本量小」直接判成缺陷,这个判断在本库上会造成误判。它的问题不是「小」,而是「小得没有替代品」:二十周逐周的单人记录,在公开资源里找不到第二份。所以下面的评分不按样本量扣分,而按「它声称要做的事做到了没有」来评。它声称要做的是「供信号分离算法测试」,这件事它做到了;它没有声称要做人群研究,因此不在这项上扣分。

第二个需要校正的是「无金标准」。没有金标准不等于没有价值,只等于不能算绝对精度。大量方法论工作需要的恰恰是相对比较:同一段数据上,A 算法比 B 算法好多少。这个结论不需要金标准,只需要同一段数据。

7.1 五维评分

按 DAIMS 框架的五个维度打分,满分五分。

维度 分数 一句话理由
可发现性 4 PhysioNet 主站收录,DOI 稳定,检索容易
可访问性 5 匿名下载,无申请,无数据使用协议
互操作性 4 EDF+ 与 WFDB 双标准,工具链成熟
可复用性 4 许可宽松,结构自解释,孕周内嵌
可溯源性 3 无专门数据论文,采集细节仅见于页面短文

五个维度里有三个被扣过分,逐项说清扣在哪里。

维度 扣分点 影响
可发现性 页面为 2007 年体例,字段说明简略 新使用者需要摸索
互操作性 标注对象未明示 需自行核对
可复用性 电极位置无解剖标注 空间分析受限
可溯源性 无独立数据描述论文 引用时只能引平台论文

7.2 分数背后的取舍

可访问性给满分没有争议:点开就能下,不需要注册,不需要签署任何协议,连邮箱都不用留。这在今天的医学数据里已经少见。

可溯源性给三分是这份数据最实在的短板。官方页面只有几段文字,没有数据描述论文,没有采集流程图,没有伦理审批编号,没有标注者资质说明。使用者想知道电极到底贴在哪里、标注是谁做的、判读标准是什么,都找不到答案。这不是责备,2007 年的数据发布惯例本就没有今天这么细;但对今天的使用者来说,这意味着复现细节只能靠推测。

你想知道的事 官方有没有说 能不能从文件推出
电极解剖位置 没有 不能
标注者是谁 没有 不能
标注对象 没有 可以间接核对
单段准确时长 没有 可以算
采集时的胎位 没有 不能
伦理审批 没有 不能

7.3 已知的、可枚举的偏差

偏差 性质 后果
单受试者 设计选择 人群结论不可得
单中心 设计选择 设备与操作习惯单一
中晚孕起止 设计选择 早孕结论不可得
无胎儿参考 设计选择 绝对精度不可得
电极位置变动 采集现实 通道不可跨记录对齐
无质量标记 采集现实 坏段需自行剔除
无随访 采集现实 无法关联出生结局
标注对象未明示 文档缺失 真值使用有风险

前四项是设计选择,不该被读成缺陷;后四项是采集与文档的现实,使用者必须自己处理。区分这两类,是评价这份数据时最容易做错的一步。

7.4 外部验证矩阵

验证方式 能否在本库完成 说明
与有创胎心电对照 不能 无同步头皮电极
与多普勒对照 不能 无同步胎心监护
与出生结局对照 不能 无随访
算法间一致性 能 同一段跑多个方法
母体成分去除效果 能 胸导可作为参照
多导一致性 能 三到四路腹导互校
与合成数据对照 能 在合成库上调参后迁移

真正能做的验证只有后四项,且都建立在「相对」而非「绝对」之上。写论文时应把这层限制讲清楚,不要用「验证了算法的准确性」这种表述——本库能验证的是一致性与稳定性,不是准确性。

想表达的结论 可用的措辞 不可用的措辞
算法间有差异 在同一段真实记录上,甲方法优于乙方法 甲方法准确率更高
分离有效 母体成分被显著压低 胎儿信号被准确还原
孕程影响 检出稳定性随孕周变化 检出率随孕周上升
数据适用 适用于真实腹壁信号的可行性验证 适用于临床胎心监护

7.5 它为何能持续:因为它是唯一一份把孕程拉满的公开腹壁心电

支撑因素 具体表现
不可替代性 二十周逐周单人记录,公开资源中未见同类
获取零门槛 匿名下载,许可宽松
格式长寿 EDF+ 与 WFDB 都是三十年不过时的标准
教学价值 结构简单,适合入门演示
引用惯性 长期被方法论工作当作标准测试段

这五条里,第一条是根。数据集的寿命很少由质量决定,多由稀缺性决定。一份可以被十份更新的数据替代的库,五年就没人下载了;一份怎么都替代不了的库,即使文档粗糙、样本极小,也会一直有人用。

7.6 与替代方案的取舍

如果你在意 本库的表现 更好的选择
样本量 弱 合成库或多受试者库
时间跨度 强 无替代
绝对精度 不可得 带直接胎心电的库
导联空间信息 弱 多导阵列库
上手速度 强 无替代
文档完整度 弱 近年发布的新库

§8 生态位与历史

8.1 时间沿革

时间 事件
2003 年 11 月 首段记录采集,孕 22 周 1 天
2004 年春 末段记录采集,孕 40 周
2007 年 9 月 6 日 PhysioNet 发布 v1.0.0
2008 年 2 月 记录清单更新
2008 年 3 月 心搏标注补齐
2019 年 2 月 校验和清单更新

从采集到发布隔了三年多,从发布到现在近二十年,版本号一直是 1.0.0。没有修订版,没有勘误,也没有新增记录。这种「一次发布、长期不动」的状态在 PhysioNet 上很常见,好处是引用稳定,坏处是早期文档的粗糙之处再无机会改进。

8.2 在 PhysioNet 胎心电谱系里的位置

世代 代表资源 特征
第一代,2000 年代 本库 单人或少数受试者,无参考信号,验证算法可行性
第二代,2010 年代 带直接胎心电的库 引入有创参考,可算绝对精度
第三代,2020 年代 多模态库 电、机械、影像同步,多受试者

本库属于第一代。第一代的特点是「先证明这件事能做」,而不是「把这件事做到最好」。理解了这层代际关系,就不会拿第三代的标尺去量它——它本来就不是用来做多模态对齐的。

8.3 三代技术各自解决什么

待解决的问题 第一代的做法 后续世代的补法
腹壁信号里有没有胎心 单人长时间记录,肉眼确认 多受试者统计确认
分离算法能不能跑 提供真实混合信号 提供真值以量化
胎心随孕周怎么变 逐周记录 多模态同步观测
算法在人群中稳不稳 不解决 多受试者库
电极怎么贴最好 位置逐次调整 固定阵列加优化设计

8.4 它被怎么用

官方页面没有列出使用这份数据的工作清单,也没有附数据描述论文。社区引用通常走两条路:一条是引用 PhysioNet 平台论文加本库 DOI,另一条是在方法节里直接写数据来源而不单独引用。前一种是规范做法,后一种在实际论文里更常见。

用途类别 典型做法 需要注意
分离算法对比 取若干段做统一评测 说明选了哪几段、为什么
教学演示 用早期段展示低信噪比 说明 n=1
预处理流程验证 用固定滤波设置的记录省去调参 不要把硬件滤波当算法贡献
可穿戴设备验证 借电极位置变动模拟佩戴差异 电极不是可穿戴电极

第三行值得警惕。本库的信号在采集时已经过 0.01 至 100 Hz 带通与 50 Hz 陷波,任何「我们的去噪模块提升了多少」的结论,都必须先说明基线里已经含有什么,否则提升可能只是重复劳动。

8.5 二十年后它还剩什么

资产 二十年后是否仍有效
孕程纵向结构 有效,且仍稀缺
EDF+ 格式 有效
每段心搏标注 有效,但对象需澄清
1 kHz 采样 有效,上限偏低但够用
电极位置信息 已失效,无解剖记录
文档细节 已失效,无处补充

文档缺失的代价可以具体量化。下表按「复现一项工作需要额外做什么」排列,越往下越难绕过。

缺失的文档 复现时多花的时间 能否绕过
电极解剖位置 每次换库都要重新判断导联含义 不能
标注判读标准 只能靠对齐波形反推 部分可以
采集时的胎位 无法解释个别段的异常 不能
伦理审批信息 二次发表时需自行说明 不能

8.6 与同期单受试者数据集的共性

这类数据在 2000 年代并不罕见:一个愿意配合的研究对象、一台实验室里的放大器、一批逐次累积的记录,最后整理成一个公开包。它们的共同点是结构干净、文档简略、规模极小,且几乎都成了教学素材。

共性 表现 对今天的影响
结构干净 通道少、命名规整、无冗余 上手快
文档简略 只有页面短文,无论文 复现细节缺失
规模极小 十余小时以内 只能验证不能训练
长期在线 挂在公共仓库不动 引用稳定

§9 使用指引

9.1 三种角色的路径

角色 目标 建议起点 预计工作量
学生 看懂母胎心电叠加 孕 22 周段,肉眼对比胸导与腹导 一小时
算法工程师 跑通并对比分离方法 早中晚各取两段 一天
临床研究者 观察孕程变化 全库按孕周排序 两天

三种角色各有各的坑,下面三条按常见程度排列。

角色 最容易犯的错 一句话纠正
学生 把腹导当纯胎儿信号 腹导是母胎混合,先看胸导对照
算法工程师 拿 .qrs 当胎心真值 先核标注归属再算指标
临床研究者 把单人曲线当人群趋势 写明 n=1,只说个体变化

9.2 一条最短的可用流程

步骤 动作 产出
一 下载 RECORDS 与一段 EDF 确认可达
二 读头,核对通道与孕周 结构确认
三 胸导检 R 峰 母体心搏序列
四 腹导模板减除 残差信号
五 残差上检胎心 胎心序列
六 换孕周重复 趋势曲线

整条流程的输入就是 §4.3 的案例那一段,跑完再换到孕 38 周前后的记录,两张图并排放在一起,胎心成分的差别不用解释也能看出来。

#-- 最短流程:一段记录,从读头到胎心序列
import mne, numpy as np, wfdb
from scipy.signal import find_peaks

path = "nifecgdb/ecgca102.edf"
raw = mne.io.read_raw_edf(path, preload=True, verbose=False)
fs = int(raw.info["sfreq"])

#-- 第一步:胸导定位母体心搏
th = raw.get_data(picks=["Thorax_1"])[0]
th = (th - th.mean()) / th.std()
m_peaks, _ = find_peaks(th, height=2.0, distance=int(0.33 * fs))

#-- 第二步:腹导模板减除
ab = raw.get_data(picks=["Abdomen_1"])[0]
half = int(0.25 * fs)
segs = [ab[p - half:p + half] for p in m_peaks if half < p < len(ab) - half]
tpl = np.mean(segs, axis=0)
res = ab.copy()
for p in m_peaks:
    if half < p < len(ab) - half:
        res[p - half:p + half] -= tpl

#-- 第三步:残差上检胎心,取 0.25 至 0.6 秒的间隔约束
rr = 60.0 / 140
f_peaks, _ = find_peaks(res, distance=int(0.8 * rr * fs), height=np.percentile(res, 95))
print("母体心搏", len(m_peaks), "胎心候选", len(f_peaks))
print("母体心率", round(60 * fs / np.median(np.diff(m_peaks)), 1))
输出 含义 合理性检查
母体心搏数 应与时长乘心率相符 270 秒约三百次
胎心候选数 应明显多于母体 若少于母体,阈值过严
母体心率 六十至九十 超出说明检错
胎心间期 0.4 至 0.6 秒 超出说明混入伪迹

跑不通的时候,症状比报错更好用,下面五条能覆盖大部分情况。

症状 可能原因 先查什么
胎心候选为零 阈值过高或段内无胎心 换晚期记录重试
胎心候选过多 台阶伪迹被误检 检查模板对齐
母体心率异常 胸导极性反了 看波形主峰方向
残差整体偏移 模板未去均值 对模板做零均值化
某段完全平坦 电极脱落 该段剔除不填补

9.3 引用方式

要素 内容
数据名称 Non-Invasive Fetal Electrocardiogram Database
版本 1.0.0
DOI 10.13026/C2X30H
发布方 PhysioNet
许可 ODC-BY 1.0
建议同时引用 PhysioNet 平台论文
数据:Non-Invasive Fetal Electrocardiogram Database (NIFECGDB), v1.0.0.
      PhysioNet. doi:10.13026/C2X30H
平台:Pollard T, Moody BE, Lehman L, et al. PhysioNet as a global platform
      for biomedical research. Nature Health, 2026. doi:10.1038/s44360-026-00096-z
许可:Open Data Commons Attribution License v1.0

许可要求署名。若在论文、报告或产品中使用,须注明数据来源与许可,且不得暗示原作者为你的结论背书。

§10 AI 使用声明

项目 声明
文本生成 由语言模型起草,经编辑复核
事实来源 仅取 PhysioNet 官方页面、EDF 文件头与记录清单
数字口径 规模与结构取自官方,折算值另行标注
未覆盖内容 未逐条核听全部 55 段波形
未做之事 未训练模型,未复现任何论文结果
判断归属 评分与取舍为编辑判断,非官方结论
更新机制 官方页面变动时人工复核
责任声明 临床决策请以原始数据与专业判断为准

常见误读(避坑清单)

常见说法 实际 证据
「这是胎儿心电数据集」 是母胎混合的腹壁心电,胎儿成分未分离 官方写明腹部信号含母体加胎儿心电
「有五十五名受试者」 一名孕妇的五十五段记录 官方原文为 single subject
「.qrs 是胎心标注」 官方只写心搏标注,未指明对象 ANNOTATORS 仅一行
「采样率 2048 Hz」 1 kHz 官方 Recording information 段
「孕 21 至 27 周」 21 至 40 周 官方 Abstract 段
「有同步胎心监护参考」 没有任何胎儿参考信号 官方未提及多普勒或头皮电极
「数据是近期发布的」 2007 年发布,2003 年采集 页面发布日期与文件头日期
「可以用它训练通用模型」 十小时量级,单受试者 整包 372.6 MB 折算
「50 Hz 干扰要自己滤」 采集时硬件陷波已开 EDF 头 NF:50Hz
「导联位置固定」 逐次调整以改善信噪比 官方明确说明电极位置有变

上表说的是概念误读,下表是据此产生的操作错误,两表对照着看更省事。

容易踩的操作坑 后果 正确做法
把标注通道当电极 通道数多算一路 按名称剔除 EDF Annotations
直接拼二十周做时间序列 混入电极挪位效应 把位置变动列为混杂因素
假设腹导解剖位置固定 空间分析全错 只在单段内做空间分析
用 .qrs 算胎心检出率 指标系统性偏差 先在胸导上核对标注归属
拿硬件滤波当算法贡献 消融结论无效 先声明基线已含的滤波
跨库直接比指标 差异含预处理差异 统一带宽与重采样后再比

FAQ

Q1:这个库到底有几名孕妇?
一名。官方原文是 single subject,五十五段记录全部来自同一位女性,从孕 21 周采到孕 40 周。任何把它当成多受试者数据集的用法,从第一步就错了。

Q2:为什么记录数比孕周数多那么多?
因为部分孕周采集了两段以上。二十周对应五十五段,平均每周接近三段,说明采集密度高于每周一次。这对估计孕周内变异是好事,但官方没有说明加采的触发条件。

Q3:有没有胎儿心电的真值?
没有。官方页面没有提到同步胎儿头皮电极、脉冲多普勒或出生后验证,只提供逐段心搏标注。需要真值的评测应改用带直接胎心电的库。

Q4:.qrs 标注的是母体还是胎儿?
官方没有明示,只写「qrs beat annotations」。记录里同时有胸导与腹导,最可能标的是胸导上清晰可辨的母体心搏。使用前应取一段把标注点对齐到胸导波形上核对。

Q5:能直接拿来做深度学习训练吗?
能训练,但不能只靠它。五十五段、单受试者、约十小时量级,只够微调或验证。常规做法是用合成库或多受试者库预训练,再用它做下游验证。

Q6:为什么说采样率 1 kHz 够用?
胎儿 QRS 的主频在数十赫兹量级,1 kHz 采样对应 500 Hz 奈奎斯特频率,余量充足。真正受限的是硬件 100 Hz 低通,高频成分在采集时就已被切除,不是采样率的问题。

Q7:电极位置逐次调整,会影响我做什么?
会影响一切跨记录的比较。Abdomen_1 在孕 22 周与孕 38 周可能对应完全不同的解剖位置,通道之间不构成固定阵列。做空间分析只能在单段内做。

Q8:整包有多大,能不能只下几段?
整包未压缩 372.6 MB。只需要几段时,用 wget 递归或 S3 同步按文件取,比下整包快得多。单个文件多在 2 至 9 MB 之间。

Q9:许可允许商用吗?
ODC-BY 1.0 允许商用,条件是署名。使用时须注明数据来源与许可,且不得暗示原作者为你的结论背书。

Q10:它和 NInFEA 能混着用吗?
可以,但要先对齐预处理。两者采样率、量化位数、导联数都不同,本库还有固定的 50 Hz 硬件陷波。跨库比较前必须统一带宽并重采样。

Q11:为什么没有数据描述论文?
2007 年的发布惯例如此,数据说明直接写在 PhysioNet 页面上,没有单独投稿。引用时通常引平台论文加本库 DOI。

Q12:二十周里有没有中断?
官方没有说明。从文件头的采集日期看,记录连续分布在整个区间内,未见以月计的空档;但某些孕周是否缺失,页面没有交代。

术语表

术语 含义
非侵入式胎心电 从孕妇腹壁间接获取的胎儿心电,不经产道或宫内电极
腹壁心电 贴在腹部电极上记录的电位,含母体与胎儿两种成分
母胎分离 从混合腹壁信号中提取胎儿心电成分的处理
胸导 贴在胸壁的电极,本库中用于取母体心电作为参考

(续)

术语 含义
QRS 波群 心电中代表心室除极的尖锐波形,是心搏定位的主要标志
R 峰 QRS 波群的最高点,心率与节律分析的锚点
模板减除 用平均心搏模板在混合信号上逐搏相减的分离方法
残差 减除母体成分后剩下的信号,近似为胎儿成分

(续)

术语 含义
EDF+ 欧洲数据格式的扩展版,支持标注通道与多信号同步
WFDB 生理信号数据库的通用格式与工具集,标注文件常用其注释格式
注释器时间分辨率 标注文件内的时间单位,本库为 1000
陷波 针对特定频率的窄带滤波,本库用于压制 50 Hz 工频

(续)

术语 含义
工频干扰 电网引起的 50 Hz 或 60 Hz 周期性噪声
基线漂移 电极极化与体动造成的缓慢基线起伏
信噪比 目标信号与背景噪声的功率比,本库中随孕周变化
逐周采集 按孕周每周一次的随访式采集安排

(续)

术语 含义
孕周 以末次月经或超声推算的妊娠时长,本库写作「周+天」
孕 21 至 40 周 本库覆盖的孕周区间,即中孕早期至足月
单受试者设计 全部记录来自同一个体的研究设计
纵向数据 对同一个体在多个时间点重复测量所得的数据

(续)

术语 含义
横断面数据 在同一时间点对多个个体各测一次的数据
头皮电极 分娩时贴在胎儿头皮上的电极,可获得无母体干扰的胎心电
脉冲多普勒 用超声血流频谱间接测定胎心节律的方法,可作独立参考
金标准 被公认为真值的测量方法,胎心电领域通常指直接胎心电

(续)

术语 含义
ODC-BY 1.0 开放数据 commons 署名许可,允许商用与再分发,须署名
DOI 数字对象标识符,本库为 10.13026/C2X30H
匿名访问 无需注册或登录即可下载的开放策略
校验和 用于验证文件完整性的哈希值清单

(续)

术语 含义
DAIMS 数据可访问性与互操作性评估框架,本文按五维打分
可溯源性 数据来源与处理过程可被完整追查的程度
互操作性 数据能否被通用工具直接读取与组合的程度
生态位 一份数据在同类资源分工中占据的不可替代位置

附录 A:核心数字核对表

项 值 来源 来源层级
记录数 55 官方 Abstract 与 RECORDS 官方页面
受试者数 1 官方 Abstract 官方页面
孕周区间 21 至 40 周 官方 Abstract 官方页面
胸导数 2 官方 Recording information 官方页面
腹导数 3 或 4 官方 Recording information 官方页面

(续)

项 值 来源 来源层级
采样率 1 kHz 官方 Recording information 官方页面
量化位数 16 位 官方 Recording information 官方页面
带宽 0.01 至 100 Hz 官方 Recording information 官方页面
陷波 50 Hz 常开 官方 Recording information 官方页面
放大器 g.BSamp 官方 Recording information 官方页面

(续)

项 值 来源 来源层级
电极材料 Ag-AgCl 官方 Recording information 官方页面
格式 EDF/EDF+ 官方 Abstract 官方页面
整包大小 372.6 MB 官方 Files 区 官方页面
许可 ODC-BY 1.0 官方 License 区 官方页面
DOI 10.13026/C2X30H 官方 Discovery 区 官方页面

(续)

项 值 来源 来源层级
发布日 2007 年 9 月 6 日 官方版本区 官方页面
版本 1.0.0 官方版本区 官方页面
首段采集日 2003 年 11 月 16 日 EDF 头 文件内证
末段采集日 2004 年 2 月 6 日(所见样本) EDF 头 文件内证
标注文件数 55 文件目录 官方页面

(续)

项 值 来源 来源层级
单段时长范围 数分钟至十余分钟 EDF 头折算 文件内证
全库总时长 约十小时量级 按体积折算 折算值
母体心率量级 六十至九十 胸导波形 文件内证
胎儿心率量级 一百一十至一百六十 公认生理范围 通用知识
标注时间分辨率 1000 注释文件头 文件内证

(续)

项 值 来源 来源层级
采集机构 瓦伦西亚大学 GPDS 官方 Contributors 区 官方页面
贡献者 Martinez Sober 与 Granado Marco 官方 Contributors 区 官方页面
采集地 西班牙布尔哈索特 官方 Contributors 区 官方页面
数据描述论文 无 官方页面未列 官方页面
伦理审批编号 未提供 官方页面未列 未核实

附录 B:数字的来源分层

层级 含义 本文中的例子
第一层 官方页面明确写出 55 段、1 名、1 kHz、16 位、ODC-BY
第二层 文件内可直接读出 采集日期、每段时长、标注时间分辨率
第三层 由前两层折算或推断 全库总时长、母体心率量级
第四层 未核实 伦理审批、标注者资质、电极解剖位置

三个层级各自对应什么,下面挑四个数字举例。

数字 层级 说明
372.6 MB 第一层 官方 Files 区直接标注
45 块乘 6 秒 第二层 由 EDF 头两个字段相乘得出
约十小时 第三层 按采样率乘导联乘位数折算,未逐条累加
五十五段平均每周近三段 第三层 由总数除周数得出

分层之后的使用规则只有三条,写论文时按层级标注即可。

使用建议 做法
写论文时 第一层直接用,第二层注明由文件头提取
做估算时 第三层必须标注为折算
涉及伦理与合规 第四层不得当作已知事实陈述

附录 C:完整参考文献

官方入口为 PhysioNet 上的 Non-Invasive Fetal Electrocardiogram Database,版本 1.0.0,DOI 10.13026/C2X30H。平台层面的引用为 Pollard 等人在 Nature Health 发表的 PhysioNet 综述。许可全文见 Open Data Commons 的 ODC-BY 1.0 页面。同库内可对照的资源包括 NInFEA、adfecgdb、nifeadb、fecgsyndb、fpcgdb、fetalheartsounddata 与 icehg-ds,各自的采集细节以其官方页面为准。

文献 类型 用途
PhysioNet 页面(v1.0.0) 官方入口 全部规模与规格数字
DOI 10.13026/C2X30H 持久标识 引用与版本锁定
PhysioNet 平台论文 期刊论文 平台层面的规范引用
ODC-BY 1.0 全文 许可文本 使用条件

附录 D:任务代码

任务 输入 输出
批量读头 55 个 EDF 孕周与通道表
逐段分离 单段 EDF 残差信号
汇总作图 残差与孕周 趋势曲线
#-- 批量汇总:遍历全部记录,输出孕周、通道数与时长
import glob, re, pyedflib

rows = []
for path in sorted(glob.glob("nifecgdb/*.edf")):
    f = pyedflib.EdfReader(path)
    m = re.search(r"Gestation_(\d+)\+(\d)", f.getPatientName())
    days = int(m.group(1)) * 7 + int(m.group(2)) if m else -1
    n_ch = sum(1 for lab in f.getSignalLabels() if lab.startswith(("Thorax", "Abdomen")))
    dur = f.getFileDuration()
    rows.append((days, path.split("/")[-1], n_ch, round(dur / 60, 1)))
    f.close()

for days, name, n_ch, minutes in sorted(rows):
    print(f"{days:4d} {name:14s} {n_ch} 路 {minutes:6.1f} 分钟")
print("记录数:", len(rows))
#-- 逐段跑模板减除,收集残差能量随孕周的变化
import mne, numpy as np
from scipy.signal import find_peaks

def residual_ratio(path):
    raw = mne.io.read_raw_edf(path, preload=True, verbose=False)
    fs = int(raw.info["sfreq"])
    th = raw.get_data(picks=["Thorax_1"])[0]
    th = (th - th.mean()) / th.std()
    peaks, _ = find_peaks(th, height=2.0, distance=int(0.33 * fs))
    ab = raw.get_data(picks=["Abdomen_1"])[0]
    half = int(0.25 * fs)
    segs = [ab[p - half:p + half] for p in peaks if half < p < len(ab) - half]
    if len(segs) < 10:
        return None
    tpl = np.mean(segs, axis=0)
    res = ab.copy()
    for p in peaks:
        if half < p < len(ab) - half:
            res[p - half:p + half] -= tpl
    return round(float(res.std() / ab.std()), 3), len(peaks)

for path in sorted(glob.glob("nifecgdb/*.edf"))[:5]:
    print(path, residual_ratio(path))

附录 E:如果只记五件事

要点 一句话
一个人 五十五段全部来自同一名孕妇
二十周 孕 21 至 40 周逐周,纵向是它唯一不可替代的资产
无真值 没有胎儿参考信号,算不了检出率
五至六路 两路胸导加三或四路腹导,1 kHz,EDF+
测稳定性 评算法随孕程的退化,不评人群泛化

编辑说明

本篇的事实基线为 PhysioNet 官方页面 v1.0.0、RECORDS 与 ANNOTATORS 清单,以及若干 EDF 文件头的直接读取。凡官方未写明的项,一律标注为未核实或折算,不做补齐。评分与取舍属编辑判断,与发布方无关。若官方页面后续修订,规模与规格部分需重新核对;采集细节部分因无数据描述论文,短期内不会有新增信息来源。


相关数据集导航

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

  • nifeadb — 共享标签:生理信号 / 心电信号 / 儿科
  • ninfea — 共享标签:生理信号 / 心电信号 / 儿科
  • cinc-2013 — 共享标签:生理信号 / 心电信号 / 儿科
  • pics — 共享标签:生理信号 / 心电信号 / 儿科
  • argo — 共享标签:生理信号 / 心电信号
  • icehg-ds — 共享标签:生理信号 / 心电信号
  • leipzig-heart-center-ecg — 共享标签:生理信号 / 心电信号 / 儿科
  • ehgdb — 共享标签:生理信号 / 儿科
  • wctecgdb — 共享标签:生理信号 / 心电信号
  • aami-ec13 — 共享标签:生理信号 / 心电信号

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

返回 AI-Ready 数据集