信息速览
同一名孕妇,二十个孕周,五十五段腹壁心电。这是 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 — 共享标签:生理信号 / 心电信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

