早孕期胎心电遇上多普勒 — NInFEA 多模态库

39 名孕妇 / 60 段记录 / 27 路 2048 Hz

来源 https://physionet.org/content/ninfea/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 12
早孕期胎心电遇上多普勒 — NInFEA 多模态库

信息速览

数据集名称早孕期胎心电遇上多普勒 — NInFEA 多模态库
数据类型时序信号,波形,元数据,原始数据链接
规模39 名孕妇 / 60 段记录(同一孕妇可贡献一至三段)
接入方式https://physionet.org/content/ninfea/1.0.0/
AI 就绪度

早孕期想验证一套胎心电提取算法,会撞上一件很具体的事:没有尺子。产时的头皮电极可以直接记录胎儿心电,但那是分娩台上的事;孕中期能同时拿到、又能当参考的,只有超声。于是这个领域长期缺一份「同一秒里既有腹壁电极、又有超声参考」的记录。

NInFEA 就是把这件难事做成了常规操作。39 名孕妇,孕 21 至 27 周,每人躺上超声检查床,胸前背后贴三十个电极,胸上绑一条呼吸带,医生用探头对准心尖五腔切面,然后电极和超声一起开录。60 段记录,27 路 2048 Hz 电生理,配一张同步的多普勒频谱图和一份采集当场的孕期与胎位登记。

它既不是产时库,也不是合成库。它是一份早孕期、心脏结构正常、机器可读、许可宽松的对照记录,价值全部押在「多普勒与电极在同一时刻」这一件事上。一屏速览见下表。

维度 内容
全名 NInFEA:Non-Invasive Multimodal Foetal ECG-Doppler Dataset for Antenatal Cardiology Research
中文意译 面向产前心脏病学研究的多模态非侵入式胎心电—多普勒数据集
发布方 PhysioNet(RRID:SCR_007345)
采集机构 卡利亚里大学电气与电子工程系、布罗祖医院小儿心脏病与先天性心脏病科
作者 Danilo Pani、Eleonora Sulas、Monica Urru、Reza Sameni、Luigi Raffo、Roberto Tumbarello
首次上线 2020 年 11 月 12 日,版本 1.0.0
配套论文 Scientific Data 8:30(2021),DOI 10.1038/s41597-021-00811-3
受试者 39 名孕妇,孕 21 至 27 周,胎儿心脏结构正常
记录段数 60 段(同一孕妇 1 至 3 段)
电生理通道 27 路(腹壁单极 22、背部单极 2、胸部双极 3)
采样与位深 2048 Hz,22 位,量程 300 毫伏峰峰
附加通道 呼吸 1 路、未使用 4 路、锯齿波 1 路、触发 1 路,合计 34 行
参考模态 同步经腹脉冲多普勒,宽幅位图,包络 284 点每秒
单段时长 7.50 至 119.80 秒,均值 30.6 秒
体积 解压后 2.0 GB,ZIP 792.9 MB
许可 ODC-BY 1.0,免注册
DOI 10.13026/c4n5-3b04(1.0.0)、10.13026/393a-ky74(最新)

§1 它要解决的具体麻烦

1.1 缺的不是算法,是一个能对上号的时刻

从腹壁电极里分出胎心电,方法已经很多:盲源分离、模板减除、自适应滤波、低秩分解。每一种都能在自己的数据上报出高检出率,但两篇论文的表格并排放就没法比——数据、预处理与指标定义全都不同。

比不可比更麻烦的是无法证伪。算法说这里有一个胎心 R 波,你凭什么说它错了?没有独立参考时唯一裁判是人眼,而胎心只露出几微伏小尖时人眼并不可靠。既然孕中期拿不到心电金标准,就退一步,用物理上独立、临床认可、时间同步的机械参考。

多普勒频谱里每一个心动周期都有清晰的形态:舒张期两个正向峰(E 峰与 A 峰,代表心室被动充盈与心房收缩),收缩期一个反向的单相波(V 波,代表主动脉射血)。A 峰对心房、V 波对心室,两者之间的间隔就是机械层面的房室传导时间。这份数据把电极和这条频谱放在同一根时间轴上,等于给「这个尖到底是不是一次心室激动」提供了一个外部的、不依赖算法的裁判。

1.2 三条常见的错误期待

第一条,期待它是「带标注的胎心电库」。 名称里有 ECG,容易被读成一份腹壁心电加心电真值的配对集。实际不是:库里没有 .qrs、没有 .atr、没有任何逐搏注释文件,60 段记录只有编号。唯一的参考是多普勒图像,而图像要经过包络提取、峰值检测、时间对齐之后才能变成一串时刻。

第二条,期待它是产时或围产期的监护数据。 它的孕周是 21 至 27 周,采集场景是超声检查床上的静息半坐位,单段最长不到两分钟。产后监护、分娩监护、连续数小时的那种记录,在它的设计里根本没有位置。这一点与库内另一批产时库的差别不是样本量,而是场景。

第三条,期待 60 段就是 60 个独立个体。 60 段来自 39 人,有人录了三段。这三段是同一孕妇在不同时刻的重复采集,共享体型、电极贴合状态、胎位与胎心节律特征。把它们当独立样本做交叉验证,等于让同一个人的数据同时进训练集和测试集。

期待 为什么会产生 实际是什么 会不会误事
带心电真值的配对集 名称里的 ECG 与「数据集」连读 只有多普勒这一路机械参考 会,直接决定实验能不能做
产时或连续监护数据 与产科监护库的联想 诊室静息、单段数十秒 会,场景不匹配
60 个独立个体 段数被当成人数 39 人,最多一人三段 会,交叉验证会泄漏
一份可以直接喂进网络的张量 期待「AI-Ready」等于开箱即用 双精度二进制加位图,需自建标签 会,预处理工作量被低估
病理性胎心的样本 医院来源暗示有病例 全部为心脏结构正常胎儿 会,做异常检测会无正例

1.3 它能给到的与给不到的

你的需求 它给的 够不够
检验提取算法的逐搏检出率 每段都有同步多普勒,可人工或半自动判读 V 峰当参考 够,这是它存在的理由
检验算法在房室传导异常上的表现 多普勒能读出 A–V 间隔,可用于机械层面的节律分析 有条件够,但库内无病例
电极配置的优化研究 24 路单极覆盖腹背,空间冗余高,可降采样重构多种配置 够,这是它第二项独有价值
胎儿心电形态学(P/QRS/T 时限) 27 路原始信号,2048 Hz 带宽约 550 Hz 有条件够,需自行提取并验证
母体呼吸对胎心电的调制研究 独立的胸带呼吸通道 够,且是少见的附加值
真实世界的运动伪影与电极脱落 静息状态采集,伪影少 不够,脏数据不是它的目标
病理性心律的检测基准 全部为健康胎儿 不够,结构上做不到
长时程趋势或昼夜节律 单段不超过两分钟 不适用

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

你的处境 它能帮你什么 下一步该做什么
你写了一套盲源分离,苦于没有独立参考,只能贴几张波形图 提供同一时刻的多普勒频谱,检出与漏检都能定位到具体哪一搏 先做一段的对齐,确认时延量级,再全库铺开
你在比较几种电极配置,但只有一套硬件 24 路单极可按空间子采样重构成多套文献配置 用固定子集划分做对比,别每次重新挑电极
你要研究母体呼吸如何调制腹壁基线 呼吸带与电生理同一时钟采集 先验证呼吸相位与基线漂移的锁相关系
你在做可穿戴胎心监护,想知道商用贴片的电极数够不够 30 电极的高密度布局可裁剪到 6 电极以下 按目标产品的电极位裁剪后重跑,看性能掉多少
你在教生物医学信号处理,需要一个「同一事件两种模态」的直观例子 一段记录可同时展示电、机械、呼吸三条时间线 取 §4.3 的案例,把三条线画在同一时间轴上
你在找早孕期胎心电的公开数据做预训练 60 段真实记录、许可宽松 注意样本量小,预训练价值有限,更适合做微调或验证集

1.5 一句话判断

它不是一把刻度更细的尺子,而是在原来没有尺子的地方,立了一根可以从另一个物理量读数的标杆。

1.6 不适合谁:四条边界

不适合需要病理性样本的人。 入组标准写得很清楚:胎儿在心脏学意义上健康。团队给的理由也直白——样本量小,病理情形在库里会代表性不足,与其放几个说不清的例子,不如一个都不放。要做心律失常检测,得去别的库。

不适合把多普勒当心电金标准的人。 电激动与机械收缩之间没有严格固定的时差,机械事件的时间分辨率也受帧率与扫掠速度限制。论文自己承认:除了专家目视,找不到一条严格的判据来认定「这一搏可接受」。把 V 峰的时间戳直接当 R 峰用,误差会以数十毫秒计。

不适合需要连续监测的人。 单段最长不到两分钟,多数只有半分钟。做长时程基线漂移、睡眠分期、宫缩监测,它一段都撑不住。

不适合想省掉预处理的人。 双精度二进制要自己写读盘、位图要自己抽包络、两路时钟要自己对齐、临床信息要去论文表格里抄。它给的是原料和一把螺丝刀,不是装配好的成品。

§2 数据构成与规格

2.1 四个目录,两套并行格式

解压后根目录只有七项:四个子目录、一份记录清单 RECORDS、一份校验和 SHA256SUMS.txt、一份许可全文 LICENSE.txt。四个子目录分成两组平行结构——同一段信号用两种格式各存一份,同一段多普勒单独存成图片。

路径 内容 文件数 用途
bin_format_ecg_and_respiration/ 1.bin 至 60.bin 60 原生 64 位双精度,保精度首选
wfdb_format_ecg_and_respiration/ 1.dat/1.hea 至 60.dat/60.hea 120 WFDB 32 位单精度,接现成工具
pwd_images/ 1.bmp 至 60.bmp 60 多普勒宽幅频谱图
code/ 三个 .m 与一张院徽 4 读盘、图形界面、包络提取
根目录 RECORDS、SHA256SUMS.txt、LICENSE.txt 3 清单、校验、许可

RECORDS 只有一种写法:wfdb_format_ecg_and_respiration/1 到 /60,逐行一段,不带任何字段。也就是说,清单只告诉你 WFDB 那一套有多少段,不告诉你 bin 有多少段、位图有多少段。三套文件的对应关系完全靠编号对齐——1.bin、1.hea、1.bmp 说的都是同一段记录。编号是唯一的主键,而这个主键在三个目录里靠文件名重复,不在任何一张表里显式声明。

2.2 通道与字段的完整字典

一段记录在 WFDB 头文件里占 35 行:首行是记录级信息,其后 34 行一路一行,末尾是若干注释行。首行的四个字段是全库通用的读法入口。

位置 字段 记录 1 的取值 含义
首行第 1 列 记录名 1 与文件名一致,纯编号
首行第 2 列 信号数 34 34 行,含未使用通道
首行第 3 列 采样率 2048 Hz
首行第 4 列 采样点数 57490 57490 ÷ 2048 ≈ 28.07 秒
信号行第 1 列 数据文件 1.dat 34 行共用同一个文件
信号行第 2 列 存储格式 32 WFDB 的 32 位单精度浮点
信号行第 3 列 增益与基线 1119216.6963(598581736)/uV 物理单位微伏
信号行第 4–6 列 保留字段 0 0 0 未使用
信号行第 7 列 首样本 AD 值 各行不同 与基线的差即首点物理值
信号行第 8 列 校验和 各行不同 16 位和校验
信号行第 9 列 信号名 见下表 全库统一命名

34 行信号名不是随手起的,前缀就说明了这一路的身份。这套命名只在 WFDB 版本里有,bin 版本没有任何名字,通道位置靠序号推断。

行号 信号名 电极位置 类型 作用
1–22 uni_abd1 … uni_abd22 母体腹部,避开髂嵴与肋区 单极,平均参考 胎心电主战场
23–24 uni_abd23、uni_abd24 母体背部 单极,平均参考 提供空间互补视角
25–27 bi_tho1 … bi_tho3 母体胸部,六个电极成三对 双极 母体心电参考,三路不共面
28–31 dc1 … dc4 无 未使用 采集了但未接信号
32 matrsp 胸带 单极 呼吸
33 saw 设备内部 内部信号 锯齿波,对齐用
34 sync 设备内部 内部信号 触发,对齐用

这张表解释了常被问到的数量差:摘要说 27 路电生理,头文件说 34 行,两者都对。27 是有效电生理通道,34 还把呼吸、四路空置与两路对齐信号算了进去。

四路 dc 通道有个细节值得记一笔:它们的增益被写成 1(-2147483647),首样本是 -2147483647,也就是整数下限。这不是数据异常,而是「这一路没有有效量程」的表示法——没有接电极,就没有可信的标定系数,程序只好填一个退化值。读到这一列时不要试图反算物理量,会得到无意义的数。

2.3 一条记录的完整解剖

以记录 1 为例(完整拆解见 §4.3 的案例)。它是同一名孕妇三段记录里的第一段,孕 27 周,28.07 秒,57490 个采样点,34 路。头文件开头几行长这样:

1 34 2048 57490
1.dat 32 1119216.6963(598581736)/uV 0 0 570611155 -418 0 uni_abd1
1.dat 32 2945014.8402(-680710953)/uV 0 0 -440193259 -21873 0 uni_abd2
1.dat 32 2603227.3398(291541283)/uV 0 0 -43647673 -8424 0 bi_tho1
1.dat 32 257343.306(-1822531429)/uV 0 0 -1940225782 31198 0 matrsp
1.dat 32 69273666.0323(-69273666)/uV 0 0 -1593294319 -29912 0 saw
#-- 其余 28 行同构,仅信号名与增益不同

第一行给出记录级参数。后面每一行是一路:共用 1.dat,以 32 位浮点存储,单位微伏,增益各不相同——uni_abd1 是 1119216.6963,matrsp 只有 257343.306,saw 是 69273666.0323。增益差异极大说明各路的 AD 满量程设置不同,读盘时必须逐路按自己的增益换算,不能用统一系数。

头文件末尾的注释行记录了另一件事:设备偏置被扣掉了,扣了多少逐路列出。

#-- NInFEA - Non-Invasive Multimodal Foetal ECG-Doppler Dataset
#-- The following device voltage offsets (in uV) have been removed
#-- uni_abd1=9114
#-- uni_abd11=-47070
#-- bi_tho1=-59
#-- matrsp=172598
#-- 其余 29 路同样逐行列出

这一步很关键。Porti7 直流耦合、无高通,电极与皮肤的半电池电位会以毫伏量级挂在基线上;第一路的偏置就有九千多微伏,与胎心电的几十微伏不在一个量级。扣掉之后逐路写进注释,可复查可还原,比悄悄滤波透明。

记录 1 的二进制文件大小可以做一次算术校验:头部 24 字节(8 字节采样率、8 字节通道数、8 字节采样点数),数据区 8 字节 × 34 路 × 57490 点。24 + 8 × 34 × 57490 = 15,637,304,与服务器返回的 Content-Length 完全一致。这条恒等式是全库通行的:只要知道某段的采样点数,就能预测它的大小,反之也能从头文件缺失时用文件大小反推。

import numpy as np

#-- 原生 bin 布局:3 个 8 字节头 + 8 字节 × 通道 × 采样点,全为小端
with open("1.bin", "rb") as f:
    fs = float(np.frombuffer(f.read(8), dtype="<f8")[0])
    n_ch = int(np.frombuffer(f.read(8), dtype="<u8")[0])
    n_s = int(np.frombuffer(f.read(8), dtype="<u8")[0])
    raw = np.frombuffer(f.read(), dtype="<f8")

sig = raw.reshape(n_s, n_ch).T       #-- 逐样本交错写入,故先 reshape(n_s, n_ch) 再转置
print(fs, n_ch, n_s, sig.shape)      #-- 2048.0 34 57490 (34, 57490)
print(sig[0, :5])                    #-- 第一路前五个采样点,单位微伏

2.4 段与人的结构,而不是时长的分布

60 段记录挂 39 名孕妇,结构上分三种:只录一段的、录两段的、录三段的。录三段的那位贡献了记录 1 到 3,时长分别约 28 秒、29 秒、53 秒。同一人的多段并非连续采集,中间可能间隔数分钟,也可能换了探头位置。

分组必须按孕妇而不是按段,否则同一人的三段会分到训练与测试两侧,性能虚高。包内没有孕妇编号,只能靠论文表格还原对应关系。

结构维度 取值 对实验的含义
人数 39 个体层面的有效样本上限
段数 60 段层面的样本数,含重复个体
每段一人的情形 多数 一对一,无分组问题
每段两段的情形 若干 需按人对齐,防止泄漏
每段三段的情形 至少一例(记录 1–3) 同一孕妇、同一孕周、不同时刻
同一孕周内重复 存在 孕周不能当独立分组变量

2.5 与同类资源在字段上的差异

同样是非侵入式胎心电库,字段的组织方式差别很大。最直观的差异是「真值放在哪」:合成库把真值放成另一个文件,头皮电极库把真值放成另一路通道,NInFEA 把真值放成另一张图片。

资源 真值形态 通道规模 记录单位 是否有临床字段
NInFEA 同步多普勒位图 27 路电生理 + 1 呼吸 段,7.5 至 119.8 秒 有,但在论文表格
合成库 各源独立波形文件 34 路 次,固定五分钟 无,全部为参数
头皮电极库 直接胎心电通道 5 路上下 例,数十分钟 有限
心音库 无,靠算法自证 1 至 2 路音频 人,数分钟 有人口学

第二处差异是元数据的承载方式。多数库把孕周与诊断写进头文件注释或附一份 CSV,读进来就是一张表;这里全部写在论文的表 3 里,包内没有对应文件。

信息项 论文表 3 有 头文件有 数据包内独立文件
孕周 有,精确到周加天 无 无
母体年龄 有 无 无
身高体重 有 无 无
既往妊娠数 有 无 无
高危妊娠标记 有 无 无
妊娠糖尿病 有 无 无
子痫前期 有 无 无
胎方位与胎位 有,如 vertex LOP 无 无
设备偏置扣除值 无 有,逐路 无
采样点数与时长 部分 有 无

§3 它记录的是什么:同一秒里的电、机械与呼吸

3.1 诊室里的四台设备,缺一台就废

这份数据不是单一设备的产物,是四台设备在一个房间里同时工作、事后拼起来的结果。理解这一点比记住参数更重要,因为数据的每一处「不整齐」几乎都能追溯到某台设备的物理限制。

设备 型号 关键参数 在数据里留下什么
多通道生理记录仪 TMSi Porti7 32 通道同步、2048 Hz、22 位 27 路电生理、呼吸、锯齿波、触发
超声主机 Philips iE33 1680×1050、60 帧每秒、扫掠 75 毫米每秒 多普勒频谱的形态与时间分辨率
视频采集卡 StarTech USB3HDCAP 1080p、60 帧每秒、H.264 编码 频谱图的帧间压缩痕迹
呼吸带 压阻式,接 Porti7 辅助输入 与电生理同一时钟 一路低频呼吸曲线

3.2 三十一个电极怎么贴

电极布置在论文里画了正背面示意图。总数是 30 个信号电极加 1 个参考电极,参考电极贴在母体右髋。这个数字在同类公开库里算高的:多数公开的腹壁胎心电库只有 4 到 8 路,商用贴片设备普遍在 6 路以内。

分区 电极数 接入方式 编号 设计意图
母体腹部 22 单极,平均参考 1–22 覆盖大面积腹壁,避开髂嵴与肋区
母体背部 2 单极,平均参考 23–24 提供与腹部正交的视角
母体胸部 6 三对双极 25–27 三路不共面的母体心电参考
右髋 1 信号地 参考 统一参考电位

三路胸部双极不是冗余。只给一路参考时,母体心电在腹壁上的投影只能按比例缩放;给三路非共面参考,才可能做真正的空间投影。这是相对商用贴片的实质优势,不只是「电极多」。

腹部 22 个电极按固定间距铺开,理由有两个:能通过空间子采样重构出文献里的多种低维配置;探头压腹造成局部伪影时,仍有其他通道可用。第二条很实在——探头不压就没有图像,被压住的电极必然受影响,冗余是唯一解。

3.3 记录仪前端:为什么是 2048 Hz 和 22 位

Porti7 的参数表里有几个数字值得单独拿出来讲,因为它们直接决定了这份数据能回答什么问题、不能回答什么问题。

参数 取值 含义 对使用的实际影响
采样率 2048 Hz 每通道同步采样 胎心电 QRS 时限约 40 至 60 毫秒,够分辨
输入带宽 约 550 Hz 受内部抽取滤波器限制,约 0.27 倍采样率 高于 550 Hz 的成分不存在,别做高频分析
位深 22 位 量化台阶约 71.5 纳伏 几十微伏的胎心电有足够动态范围
量程 300 毫伏峰峰 前端满量程 电极极化电位可能顶到边界
耦合方式 直流耦合,无高通 基线随电极电位漂移 必须自己设计高通,且要小心相位

2048 Hz 是采样率,不等于可用带宽。实际上限约 550 Hz,更高的成分在采集时就被抽取滤波器滤掉了。做 QRS 形态够用(诊断级心电通常到 150 Hz),研究更高频的肌电或接触噪声则无从下手。

直流耦合是另一个必须记住的点。设备不滤除基线,所以原始信号里挂着电极与皮肤之间的直流电位差,量级可达毫伏。团队在发布前把每路的偏置减掉了,减法在头文件注释里逐路写明。但「减掉一次性偏置」不等于「滤掉漂移」——记录过程中基线仍会缓慢移动,做逐搏分析前仍需高通。论文的提取流程用的是 0.05 至 250 Hz 的带通,这是一个可以直接照抄的起点。

3.4 一段视频怎么变成一张频谱图

多普勒的原始产物是一段视频,不是数字信号。要把视频变成可分析的数据,中间有四步图像处理,每一步都留下痕迹。

步骤 操作 参数 产物
拆帧 视频逐帧解出 60 帧每秒 数千张单帧位图
裁切 只保留频谱区域 人工框定 去掉了二维扇形图与标尺
挑帧 按更新前沿回卷到最左侧挑非冗余帧 按扫描推进节奏 去掉重复帧,保留推进帧
拼接 横向首尾相接 无缝对齐 一张极宽的频谱长图

拼好的图横轴是时间、纵轴是速度,明暗边界就是频谱包络。团队另附了一个包络提取脚本:二维大津法取全局阈值做二值化,再用面积开运算去掉小于 70 像素的连通块,顺手滤掉机器自带的点状网格线,最后沿每一列取上下边界。

包络的等效采样率是 284 点每秒。这个数字不是设计出来的,是算出来的:图的横向像素密度乘以扫掠速度的倒数。284 点每秒对胎心率(约 110 至 160 次每分,即 1.8 至 2.7 赫兹)足够,但对 QRS 形态学远远不够。所以多普勒只能当节律参考,不能当形态参考。

3.5 两台设备凭什么对齐

超声主机和生理记录仪不能直接同步,官方说得很直接:无法为长时程采集做硬件同步,因此同步在事后完成。做法是在 Porti7 上同时录两路内部信号——一路锯齿波,一路触发。

信号 形态 周期 作用 失效时的后果
锯齿波 saw 线性上升后回落 固定 提供连续的时间标尺,可检测丢点与漂移 无法发现采样中断
触发 sync 脉冲 与采集卡事件对应 标记视频开始的时刻 电与机械的时间轴整体错位
呼吸 matrsp 低频起伏 与呼吸同周期 独立的生理节律参照 少一个交叉验证的锚点

对齐精度的上限由触发事件的时间分辨率决定,不是 2048 Hz 的采样间隔。电生理一侧精确到零点几毫秒,但两条时间轴之间的相对位置,误差在毫秒到数十毫秒量级。做延迟类分析不能忽略,做有无判定则无关紧要。

论文里给的判据是「小于 200 毫秒即视为同一次心室激动」。这个阈值本身就是对对齐误差的承认——如果两路完全同步,阈值可以收到几十毫秒。

3.6 呼吸那一路为什么值得单列

多数胎心电库不带呼吸。这一路的存在看似边角,其实是这份数据少见的附加值。

用途 为什么需要呼吸通道 数据支持程度
解释基线漂移 呼吸引起的胸腹形变会改变电极与心脏的相对位置 够,同钟采集可直接做相干分析
呼吸性窦性心律不齐 胎心率随呼吸(实为胎动与母体状态)波动 有条件够,需先分出胎心节律
母体心电幅度调制 吸气时胸廓扩张,母体心电在腹壁的投影随之变化 够,三路胸导可交叉验证
伪影归因 判断某段突变是胎动还是母体深呼吸 够,是最实用的用途

第四行是日常用得最多的。腹壁信号里出现一段大幅波动时,先看呼吸通道有没有同步的大起伏,能省掉很多猜测。这也是为什么它值得单独成一路,而不是被并进某个「其他」通道。

§4 它最独特的东西:把机械参考装进电生理记录里

4.1 为什么是脉冲多普勒,而不是胎心监护或 M 型

早孕期能当参考的模态不止一种。团队在方法节里把候选逐个否掉,理由写得很具体,值得完整转述,因为这决定了这份数据的适用面。

候选模态 能回答什么 不能回答什么 团队的选择
胎心监护(CTG) 胎心率曲线、宫缩 单个心动周期的形态与房室关系 弃用,晚孕才常规做,且只有心率
M 型超声 心脏结构径线、粗略节律 机械事件的时间边界不清晰,间隔测不准 弃用,时间分辨率不足
连续波多普勒 高速血流 无距离选通,混入多源血流 弃用,取样容积不可控
脉冲多普勒 特定取样容积内的血流速度随时间变化 绝对时间精度受帧率与扫掠限制 采用,心尖五腔切面

弃用胎心监护的理由最干脆:它给的是心率曲线,不是单个心动周期的波形,能说心率 140,说不出这一搏前有没有心房收缩。弃用 M 型是因为灰阶图上的心肌边界模糊,人工划线的主观误差就吃掉了要测的间隔。多普勒胜在取样容积可控,取样框跨二尖瓣与主动脉瓣,房室关系写在同一张频谱上。

这个选择也解释了为什么孕周必须是 21 至 27 周。取样容积要放准,胎儿心脏得够大;而再晚一些,胎脂会屏蔽胎心电。两个约束一夹,窗口就只剩这七周。

4.2 心尖五腔切面上到底读出什么

频谱横轴是时间,纵轴是速度,零线在中间。一个正常心动周期在图上留下三个可辨认的波,它们的极性取决于胎位——血流朝向探头为正,背离为负,所以同一套生理在不同记录里可能上下颠倒。

波 出现时相 生理对应 极性 能用来判断什么
E 峰 舒张早期 心室被动充盈 与 A 峰同向 舒张功能,E/A 比值
A 峰 舒张晚期 心房收缩 与 E 峰同向 心房是否活动
V 波 收缩期 主动脉射血 与 E/A 反向 心室是否活动
间隙 A 与 V 之间 机械房室传导 无 房室传导时间是否延长

正常胎儿的房室传导是 1:1,每个 A 峰后跟一个 V 波且间隔稳定。一旦出现 A 峰后无 V 波、或 V 波提前且形态异常,就是机械层面的节律问题,而这恰是非侵入式心电最难自证的部分。

4.3 案例:记录 1 的三条时间线

拿记录 1 走一遍完整链路,比抽象描述清楚得多。这一段来自一名 27 周孕妇,是同一人三段记录中的第一段,28.07 秒,57490 个采样点。

第一条线是电。34 行里前 24 行是腹背单极,第 25 至 27 行是三路胸导,第 32 行是呼吸。腹壁信号里主导的是母体心电,幅度大、节律稳,胎心电藏在两搏之间,幅度小一个量级。三路胸导的存在就是为了这一步:先在胸导上把母体心电的骨架找准,才谈得上从腹壁把它减掉。

另有一处容易忽略:同一段记录里逐路增益并不相同,头文件里第一路是 1119216.6963,第二路是 2945014.8402。不逐路换算就读数值,跨通道比较会得到完全错误的结论。

第二条线是机械。1.bmp 是一张极宽的频谱长图,横轴覆盖同样的 28 秒。每个心动周期在图上留下「M 形加一个反向单相波」的图案,M 形的两个峰是 E 与 A,反向的那个是 V;V 波出现的时刻,就是心室真正射血的时刻。

第三条线是对齐。saw 是锯齿波,sync 是触发脉冲。两者一起把视频的起点钉在电生理时间轴的某个采样点上。没有这两路,前两条线只能各自成立,无法互相印证。

记录 1 的要素 数值或形态 在分析里的角色
编号 1(同人三段之首) 主键,三个目录共用
孕周 27 周整 分层变量
采样点数 57490 决定时长与文件大小
时长 28.07 秒 约 65 搏(按 140 次每分估)
通道行数 34 含 4 路空置与 2 路对齐信号
有效电生理 27 路 算法输入
二进制大小 一千五百六十三万七千三百零四字节 可反推采样点数
多普勒图像 一张宽幅位图 机械参考
对齐锚点 saw 与 sync 把两条时间轴钉在一起

案例之所以选记录 1,还有一个原因:它是三段同人记录里最短的一段,28 秒、约 65 搏,跑一遍提取算法只要几秒,适合当调试的第一块砖。等流程在这段上跑通了,再换到最长的那一段(约 120 秒)看稳定性,顺序反了会浪费大量时间在排查环境问题上。

4.4 团队自己跑过一次对照

数据集论文做了一次内部验证:用开源流程从原始多通道里提胎心电,再把自动检出的 R 峰与人工判读的多普勒 V 峰比对,判定同一搏的阈值设为 200 毫秒。

指标 定义 中位数 读法
准确率 Acc 命中 ÷(命中 + 误检 + 漏检) 0.79 等价于机器学习里的临界成功指数
灵敏度 Se 命中 ÷(命中 + 漏检) 0.97 真搏几乎都能找到
阳性预测值 PPV 命中 ÷(命中 + 误检) 0.81 报出来的搏里约两成是误报
可提取比例 无严重噪声污染的段占比 95.5% 绝大多数段能跑通

这组数字的结构比数值本身更有信息量。灵敏度 0.97 而阳性预测值 0.81,说明这套流程倾向于多报:宁可错杀不可放过。准确率中位数 0.79 落在中间,正是高灵敏加中等精确的必然结果。做算法对比时,如果只报灵敏度,会显得比这套基线好得多;三个数一起报,才是可比的。

95.5% 意味着约二十分之一的段落跑不出可信结果,原因多是电极贴合不良或探头压迫造成伪影。60 段不等于 60 段都能用。

流程本身也写清楚了:0.05 至 250 Hz 带通,从一路胸导检出母体 R 峰,用周期成分分析做减除,剩下的多通道信号送进 JADE 做盲源分离,再用自动排序挑出胎心分量,最后用模板匹配检 R 峰。每一步的代码都在开源电生理工具箱里,可以逐段复现。

4.5 拿机械当电学参考的三处软肋

多普勒是这份数据最独特的地方,也是它最容易被过度解读的地方。三处软肋必须摊开。

软肋 机制 后果 缓解办法
电机械延迟不固定 从除极到射血要经过兴奋收缩耦联,个体与状态间有差异 V 峰不能当 R 峰的时间戳 只用于二值判定,不做毫秒级间期
时间分辨率受限 60 帧每秒的视频,加上 75 毫米每秒的扫掠 峰值定位误差在十毫秒量级 用包络插值,报告误差带
判据靠人眼 官方承认找不到严格的自动接受准则 不同标注者会有分歧 固定一名判读者,或做双人一致性

第一处最要紧。既然有心电又有机械,算一下电机械延迟似乎很自然;但这个延迟随心率、收缩力、取样位置变化,库内又没有独立电学真值可用来分离,算出来的数混淆了生理变异与对齐误差,无法归因。

第二处的量级要记住:频谱的横向分辨率由扫掠速度与像素密度共同决定,加上 60 帧每秒的采样,单个峰的定位精度约十毫秒,而电生理侧是零点五毫秒。跨模态的精细测量会被粗的那一侧卡住。

第三处是方法学上的诚实。论文原文的意思是:由于机械活动与电活动之间没有严格固定的时间关系,除了专家目视,找不到一条严格的准则来判断「这个 QRS 是否可接受」。这句话应当被完整引用,而不是简化成「已用多普勒验证」。

4.6 电极冗余能换回什么

30 个信号电极的布局,最直接的用处是可以「往回裁」。文献里出现过的二十种腹壁配置,多数电极数在 16 以下,其中四种用到 32 个或更多。团队画了对照图,把自己的高密度布局按文献配置逐一套用,说明哪些电极会被选中、哪些被弃用。

目标配置 需要的电极数 本库是否覆盖 用途
商用贴片(如 3 至 5 电极) 少于 6 覆盖 验证消费级设备的上限
常规研究配置 8 至 16 覆盖 与多数论文可比
高密度腹部阵列 22 至 32 覆盖 电极位置优化研究
含背部参考的配置 加 2 覆盖 空间滤波
需要心外膜或食管导联 不适用 不覆盖 侵入式,超出范围

「可以裁」这件事的实际价值在于可比性。若一篇论文用的是 8 电极配置,另一篇用 16 电极,通常无法直接比较,因为数据不同。在本库上,可以把同一段记录裁成两种配置,输入完全相同,只有电极集不同——这才是干净的消融实验。裁剪时要注意:论文给的对应关系是几何上的,实际贴合误差仍在,裁出来的「8 电极配置」只是近似复现。

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

5.1 三条取数路径,代价各不相同

PhysioNet 的项目页给了三种拿法:浏览器下载整包 ZIP、用 wget 递归镜像、用 AWS 命令行从公开桶同步。三种拿到的内容完全一致,差别只在断点续传与带宽。

路径 命令形态 适合谁 代价
整包 ZIP 页面按钮,约 793 兆 一次性拿全量 不能断点续传,断了重来
wget 递归 wget -r -N -c -np 只想要某几个子目录 会抓目录索引,多几次请求
AWS 同步 aws s3 sync 加免签名参数 脚本化、批量、可续传 需要装 AWS 命令行
单文件直取 直接请求 files/... 路径 只想试一段 最省流量,但要自己拼路径

第四种最常用:先取 1.hea、1.bin、1.bmp 三个文件,不到二十兆就够确认格式读得动。

5.2 目录长这样

ninfea/1.0.0/
├── RECORDS                  #-- 60 行,只列 wfdb 那套
├── SHA256SUMS.txt           #-- 逐文件校验和
├── LICENSE.txt              #-- ODC-BY 1.0 全文
├── bin_format_ecg_and_respiration/
│   ├── 1.bin                #-- 64 位双精度,24 字节头
│   └── 其余 59 个 .bin
├── wfdb_format_ecg_and_respiration/
│   ├── 1.hea                #-- 35 行头文件,34 路
│   ├── 1.dat                #-- 32 位单精度
│   └── 其余 59 组
├── pwd_images/
│   ├── 1.bmp                #-- 宽幅频谱图
│   └── 其余 59 个 .bmp
└── code/
    ├── ReadBinaryFile.m     #-- bin 读盘
    ├── Interfaccia_dataset.m#-- 图形界面,双模态同步滚动
    └── envelope_extraction.m#-- 多普勒包络

5.3 只取一段的最小命令

#-- 建目录并只抓第 1 段的三件套,不碰其余 59 段
mkdir -p ninfea/1
base="https://physionet.org/files/ninfea/1.0.0"
curl -L -o ninfea/1/1.hea "$base/wfdb_format_ecg_and_respiration/1.hea"
curl -L -o ninfea/1/1.bin "$base/bin_format_ecg_and_respiration/1.bin"
curl -L -o ninfea/1/1.bmp "$base/pwd_images/1.bmp"
curl -L -o ninfea/RECORDS "$base/RECORDS"
ls -l ninfea/1

#-- 需要全量时改用同步,支持断点续传
aws s3 sync --no-sign-request \
  s3://physionet-open/ninfea/1.0.0/ ./ninfea-full/

5.4 到手先校验,别急着读

cd ninfea-full
#-- SHA256SUMS.txt 里的路径相对于包根,直接校验即可
sha256sum -c SHA256SUMS.txt 2>&1 | tail -5
#-- 只看失败项;全通过时该行输出为空
sha256sum -c SHA256SUMS.txt 2>&1 | grep -v ': OK$' | head

校验这一步在 2 GB 的量级上不是形式主义,§4.3 的案例里那笔字节账就可以当对照。三个目录各自有 60 个文件,只要有一个在传输中截断,读盘时要么报长度不符,要么静默读出半段数据——后者的后果更糟,因为波形看起来是「正常的」,只是短了。

5.5 读 WFDB 那套,顺手把通道切开

import wfdb
import numpy as np

rec = wfdb.rdsamp("wfdb_format_ecg_and_respiration/1", physical=True)
sig, fields = rec
print(fields["fs"], fields["sig_len"], len(fields["sig_name"]))
print(fields["sig_name"][:3], fields["sig_name"][-4:])

#-- 按名字取,不要按位置硬编码,方便以后换记录
idx = {n: i for i, n in enumerate(fields["sig_name"])}
abd = sig[:, [idx[f"uni_abd{k}"] for k in range(1, 23)]]   #-- 22 路腹壁
tho = sig[:, [idx["bi_tho1"], idx["bi_tho2"], idx["bi_tho3"]]]
resp = sig[:, idx["matrsp"]]

print(abd.shape, tho.shape, resp.shape)
#-- (57490, 22) (57490, 3) (57490,)
print(np.percentile(np.abs(abd), 99))   #-- 仅用于确认量级,不是分析结论

注意 physical=True 这一步。头文件里每路的增益都不同,若用 physical=False 拿到的是 AD 整数,跨通道根本不可比。即便用了 physical=True,也要确认 fields["units"] 里确实是微伏——四路空置通道的单位仍是 uV,但量程退化,读出来是一个常数,不应参与任何统计。

5.6 抽多普勒包络

import numpy as np
from PIL import Image

img = np.array(Image.open("pwd_images/1.bmp").convert("L"))
h, w = img.shape
#-- 全局阈值:取灰度中位数附近,等价于对整幅图做一次粗二值化
thr = np.median(img) * 0.85
mask = img > thr

upper = np.full(w, np.nan)
lower = np.full(w, np.nan)
for x in range(w):
    col = np.flatnonzero(mask[:, x])
    if col.size < 3:            #-- 该列几乎无信号,判为空
        continue
    upper[x] = col.min()
    lower[x] = col.max()

#-- 像素行号转速度需要标尺,这里只保留像素坐标
print(w, h, np.nanmean(upper), np.nanmean(lower))

这段代码刻意没有做面积开运算与网格线剔除。真实使用时,机器自带的点状网格会污染阈值,官方脚本用 70 像素的面积阈值把它们去掉。照抄官方脚本比自研更快,尤其当你要处理全部 60 张图时。

包络抽出来之后还要转成物理量。纵轴像素到速度的换算依赖机器设置(量程、基线位置),这些参数没有写进数据包,只能从图上自带的刻度标注反推。这是这份数据的一处实操门槛:频谱图的数值标定不是现成的。

5.7 把两条时间轴钉在一起

import numpy as np
import wfdb

rec = wfdb.rdsamp("wfdb_format_ecg_and_respiration/1", physical=False)
sig, fields = rec
idx = {n: i for i, n in enumerate(fields["sig_name"])}
fs = fields["fs"]

sync = sig[:, idx["sync"]].astype(float)
saw = sig[:, idx["saw"]].astype(float)

#-- sync 是脉冲,取上升沿;相邻沿之间的间隔应稳定
edges = np.flatnonzero((sync[1:] > 0) & (sync[:-1] <= 0)) + 1
print("边沿数", edges.size, "首个边沿时刻", edges[0] / fs)

#-- saw 是锯齿,检测回落的跳变即为周期起点
jump = np.flatnonzero(np.diff(saw) < -np.abs(np.diff(saw)).max() * 0.5) + 1
print("锯齿周期数", jump.size, "平均周期(秒)", np.diff(jump).mean() / fs)

#-- 把多普勒图的第 0 列对齐到首个 sync 边沿所在的采样点
t0 = edges[0] / fs
print("多普勒时间原点(秒)", round(t0, 3))

对齐的结果是一句很朴素的话:多普勒图的第 0 列,对应电生理信号的第多少个采样点。得到这个偏移之后,两条时间轴就可以用同一个秒数索引。但正如 §3.5 说过的,这个偏移的精度只到毫秒级,不要在此基础上做亚毫秒的跨模态测量。

5.8 读取阶段最容易踩的六个坑

现象 原因 处理
读出来全是常数 读到了 dc1 至 dc4 四路空置通道 按名字取通道,不按位置
通道间数值差两个量级 忘了 physical=True,或在做 AD 值比较 统一换算到微伏
时长比预期短 用 bin 的采样点数去算,却读了 wfdb 的 两种格式的采样点数应一致,先核对
基线大幅漂移 设备直流耦合,偏置只扣了一次 自己做高通,起点 0.05 Hz
多普勒图糊成一片 阈值取在灰度均值而非中位数附近 改用大津法或官方脚本
对齐后整体错位 用了 sync 的下降沿 统一用上升沿,并核对边沿间隔

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

6.1 关系图谱

同域里有四份常被拿来比较的资源:一份合成电、两份心音、一份子宫电。把它们与本库摆在一起,先看总表,再逐条说清分歧点。

资源 采集对象 孕周 物理量 参考信号 与本库的关系
NInFEA 39 名孕妇 21 至 27 周 腹壁电位 + 多普勒 同步脉冲多普勒 本词条
FECGSYNDB 无真人,10 例模拟 不适用 模拟电位 各源独立波形(完美真值) 同一物理量,一对一替身
FPCGDB 26 名孕妇 31 至 40 周 心音 无,靠算法自证 同一器官,不同物理量
IIScFHSDB 60 名孕妇 31 至 40 周 心音 无,附病历胎心率 同上,晚孕版本
ICEHG DS 91 次妊娠 足月为主 子宫肌电 无,按临床结局分组 同一时期,不同器官

与 FECGSYNDB 的分歧是「合成对真实」。 那份库的 34 路信号全部由模拟器算出,真值来自「源文件本来就在」,代价是没有一个人。本库反过来:39 个真人,真实电极、真实胎位、真实呼吸,代价是真值只是一条机械曲线。两者的用途因此不重叠——要在极端信噪比下做压力测试,合成库更好用,因为可以随意调档;要论证算法在真人身上站得住,只能靠本库这一类数据。

对比项 FECGSYNDB NInFEA
信号来源 模拟器生成 真人采集
真值完备度 逐点完美,含母体与胎儿各源 仅机械参考,无电学真值
可控性 事件、信噪比、重复三维可调 不可调,只能按已有条件分层
人群意义 无,十组参数 有,但 39 人且全部健康
体积 33.3 GB 2.0 GB

与 FPCGDB 的分歧是「电对声」。 心音图记录的是瓣膜关闭的机械振动,用麦克风或电子听诊器拾取,带宽窄、通道少、易受母体心音与环境噪声干扰。它和本库共享一个目标(从母体干扰里捞出胎儿的周期),但物理通道完全不同:心音是声压,本库是电位,两者不能互相换算,也不能互相替代。FPCGDB 的孕周是 31 至 40 周,本库是 21 至 27 周,正好错开。

对比项 FPCGDB NInFEA
换能器 心音探头 体表电极 + 超声探头
通道数 1 路音频 27 路电生理 + 1 呼吸
采样率 333 Hz 2048 Hz
孕周 31 至 40 周 21 至 27 周
能给出 QRS 形态 不能 能

与 IIScFHSDB 的分歧同样是电对声,但规模不同。 那份库 60 名孕妇、2 千赫兹采样、平均八分钟一段,附人口学与病历胎心率。人数比本库多,时长也更长,但物理量仍是声音,且没有同步的第二种模态。它适合做心音分割与胎心率估计,做不了电生理提取。

对比项 IIScFHSDB NInFEA
受试者 60 名孕妇 39 名孕妇
单段时长 平均约 8 分钟 平均约 30 秒
参考模态 无 同步多普勒
许可 ODC-BY 1.0 ODC-BY 1.0
主要任务 心音分割、胎心率 胎心电提取、节律分析

与 ICEHG DS 的分歧是「看谁」。 子宫肌电记录的是子宫肌层的电活动,20 Hz 采样、三路差分、每条三十分钟,按引产、剖宫产、引产失败转剖三类结局分组。它关心的是子宫什么时候开始有效收缩,本库关心的是胎儿心脏怎么跳。两者的采样率差两个数量级,记录时长差一个数量级,唯一共同点是都发生在孕期。

对比项 ICEHG DS NInFEA
信号源 子宫肌层 胎儿心脏
采样率 20 Hz 2048 Hz
单条时长 30 分钟 7.5 至 119.8 秒
孕周 足月为主 21 至 27 周
结局标注 有,三类分娩结局 无,仅孕期与胎位

还有两份同域资源常被顺带问到,一并说清。NIFEA 是 26 条腹壁记录,专收心律失常胎儿,与本库同属真实非侵入式胎心电,但方向相反:那份要病理,本库只要健康。adfecgdb 只有 5 条,可贵在有头皮电极直接记录,真值是真正的电学真值,代价是产时、样本极少。

资源 与本库最容易被混淆的点 关键区别
NIFEA 都叫非侵入式胎心电,都是真人 NIFEA 收心律失常,本库收健康胎儿
adfecgdb 都有独立参考 adfecgdb 的参考是电学真值,本库是机械参考

四份资源加两份旁证,合起来说明一件事:这个领域没有一份「既有完美电学真值、又有足够真人样本、又覆盖早孕」的数据,每一份都在三者中放弃一项。选哪一份,取决于你的结论需要哪一项。

6.2 检索路径

在自己的库里找同域资源,靠标签比靠关键词稳。本词条打了四个标签,其中「生理信号」「心电信号」是与 FECGSYNDB、NIFEA、adfecgdb 共有的,「多模态」把本库与纯电生理库分开,「儿科」把它与成人电生理库分开。

检索意图 建议条件 会命中什么
找同物理量的真实数据 标签含心电信号,且来源为真人 NIFEA、adfecgdb、本库
找同物理量的合成数据 标签含心电信号,标题含「合成」 FECGSYNDB
找胎心相关的非电信号 标签含生理信号,关键词「心音」 FPCGDB、IIScFHSDB
找孕期但非胎心的电生理 标签含生理信号,关键词「子宫」 ICEHG DS
找带超声参考的数据 关键词「多普勒」或「超声」 本库
-- #-- 同域检索:把胎心电、胎心音、孕期电生理三类一次捞出
SELECT url_name, title, category_tags
FROM ai_ready_dataset
WHERE del_sign = 0
  AND (url_name ILIKE '%fetal%'
       OR url_name ILIKE '%fecg%'
       OR title ILIKE '%胎%')
ORDER BY record_id;

§7 质量评估与局限性

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

评价这份数据时最容易发生的一次误判,是拿「有没有逐搏心电标注」当第一道筛子,筛不过就判为「没标签,价值有限」。这道筛子在这个领域会筛掉几乎所有早孕期数据,因为早孕期本来就拿不到心电真值——能拿到就不会有这份数据。

正确的读法是先问「它提供的是哪一种参考」,再看那种参考能支撑到哪一步。参考分三档:电学真值(头皮电极)、机械参考(多普勒)、无参考(只能靠算法自洽)。三档能做的结论完全不同,混着比会得出荒唐的排名。

参考档位 代表资源 能支撑的结论 不能支撑的结论
电学真值 头皮电极库 逐搏的检出率、形态学参数 早孕期任何结论
机械参考 本库 逐搏是否真实发生(二值) 毫秒级传导间期
无参考 心音库 节律的统计特征 单搏对错的判定

7.1 五维评分

按 DAIMS 的常用维度打分,每项 1 至 5 分,锚定在「早孕期胎心电提取的对照评测」这个用途上:

维度 分数 理由
数据规模 2 39 人、60 段、合计约半小时信号
标注质量 3 有同步机械参考,但无机读标注文件
任务适配 5 早孕期唯一带同步独立参考的公开库
文档完整 4 页面、论文、代码齐备,缺逐条元数据文件
可获取性 5 免注册、2 GB、ODC-BY 1.0

规模分低不是苛刻:60 段加起来不到三十分钟,分层之后每层只剩个位数样本,置信区间宽得没法用。标注分低是因为参考存在但不可机读,多普勒是图片,要变成时刻序列得自己抽包络、自己判峰。

合计 19 分(满分 25)。这个分数结构与合成库正好互补:合成库规模与真值满分、可获取性扣分;本库适配与可获取性接近满分、规模最低。两份数据放在一起看,才构成一个完整的评测栈——先用合成库跑压力,再用本库验证真人。

用途 本库能否胜任 主要短板
算法可行性验证 能 无
算法横向对比 能,前提是用同一套参考 参考需自行复现
统计显著性检验 勉强 段数少,个体重复
人群泛化结论 不能 39 人、单一中心、全部健康
形态学标定 勉强 无电学真值可供校准

7.2 参考到底放在哪一层

库内的参考不是一份标注文件,而是一条并行的记录。理解这一点,才能明白为什么「有参考」和「有标签」在这里不是一回事。

参考形态 载体 需要几步才能变成时刻序列 误差来源
多普勒频谱 pwd_images/*.bmp 抽包络、定标、判峰、对齐 阈值、判读者、帧率
呼吸 matrsp 通道 直接可用 无
对齐信号 saw、sync 通道 检边沿 触发抖动
临床信息 论文表 3 手抄或用表格解析 抄录错误
工具 文件名 功能 语言
二进制读盘 ReadBinaryFile.m 按 24 字节头解析 bin MATLAB
图形界面 Interfaccia_dataset.m 频谱图与多路信号同步滚动 MATLAB
包络提取 envelope_extraction.m 二值化、去噪、取上下边界 MATLAB

三个脚本都是 MATLAB,没有官方 Python 版本。重写不难,但要复现官方的面积阈值才能得到一致结果,这一步值得照抄而不是自研。

7.3 已知的、可枚举的偏差

偏差 表现 影响
单一中心 全部来自卡利亚里一家医院 人群、设备、操作习惯均无变异
全部健康 入组即排除心脏病胎儿 无正例,做异常检测无样本
孕周窄 仅 21 至 27 周 结论不能外推到早孕早期与晚孕
段短 7.50 至 119.80 秒 长时程分析无从谈起
个体重复 39 人贡献 60 段 按段统计会高估有效样本
参考非电学 只有机械参考 无法校准形态学
元数据外置 临床信息只在论文表格 复现需手工录入
电极几何固定 所有受试者共用一套布局 体型差异未建模

前四条是设计取舍,后四条是执行层面的欠账。取舍部分没法改,也不该改——收窄孕周正是为了拿到可信的胎心电;欠账部分则可以由使用者自己补,比如把论文表 3 录成 CSV 公开出来。

官方内部存在两处口径差,都不影响使用,但引用时要留意。

项目 口径一 口径二 差额来源
最长一段时长 页面写 119.8 秒 论文表 2 写 119.78 秒 四舍五入位数不同
通道数 摘要写 27 路电生理 头文件 34 行 后者含呼吸、空置与对齐信号

7.4 外部验证矩阵

这份数据在文献里的角色,从公开摘要看集中在三类。

验证角色 典型做法 讲得通的地方 风险
提取算法的真人验证集 在合成库调好参数,到本库复核 真人信号,含真实胎位与呼吸 段短,指标波动大
多普勒信号处理方法的研究对象 用本库的频谱图做包络与峰值检测 图像质量高、有临床标注 只有 60 张图
电极配置优化的实验台 从 24 路里裁出不同子集 输入相同,只变电极集 只能近似复现文献布局

7.5 它为何能持续:早孕期没有第二个可选

这份数据自 2020 年定版后没有扩版,也没有第二版,却在持续被引用。原因不在它完美,而在它占着一个空位:早孕期、真人、有同步独立参考,三个条件同时满足的公开库,至今没有第二个。

需求 供给现状 本库的位置
早孕期真人胎心电 极少,多无参考 唯一带同步多普勒
电学真值 仅产时头皮电极库 不提供
大规模合成 有成熟模拟器 不提供
病理性样本 有专门的心律失常库 不提供

它不需要变好,只需要不被替代。只要还有人要做早孕期胎心电提取,就得来这里取数据;而重建一份同样的数据,要重新组织一次医院伦理、一次设备排期、一次为期一年的采集。这个成本门槛,就是它的生存逻辑。

§8 生态位与历史

8.1 一条从工程系走到超声诊室的路

这份数据不是医院信息科整理的病历导出,也不是设备厂商的副产品。它的起点在卡利亚里大学电气与电子工程系的一个信号处理课题组,落点在布罗祖医院小儿心脏病科的一间超声检查室。

时间 事件 依据
2017 至 2018 年 在布罗祖医院完成全部采集 官方数据描述节
2018 年 EMBC 发表多普勒房室活动自动识别 参考文献 1
2018 至 2020 年 陆续发表包络提取、自适应滤波、小波后处理 参考文献 2 至 7
2020 年 11 月 12 日 PhysioNet 上线 1.0.0 版 项目页发布日期
2021 年 1 月 Scientific Data 发表数据描述论文 DOI 10.1038/s41597-021-00811-3

资金线索也印证了这个路径。项目受意大利国家研究计划 ICT4MOMs 支持(协议号 2017RR5EW3),第一作者获撒丁岛大区博士奖学金资助,另一位作者在法国格勒诺布尔做访问研究期间受欧洲研究理事会 CHESS 项目支持。三个来源都指向「方法研究」,没有一个指向「数据库建设」。

8.2 四个人,四种分工

角色 姓名 单位 贡献
项目统筹 Danilo Pani 卡利亚里大学 构思、组织采集、信号处理
数据生产 Eleonora Sulas 卡利亚里大学 全部技术工具与数据生产
临床采集 Monica Urru 布罗祖医院 部分超声记录与临床支持
临床负责 Roberto Tumbarello 布罗祖医院 部分超声记录、协调科室
硬件 Luigi Raffo 卡利亚里大学 采集方案与记录仪
算法 Reza Sameni 埃默里大学 胎心电提取

8.3 生态位:它站的是「高密度电极加独立参考」这一格

把市面上的同类资源按两个轴摆开——电极密度与参考完备度——本库落在右上角,这是个空位。

资源类型 电极数 参考完备度 孕周 代表
商用贴片 少于 6 无 晚孕、产时 Monica AN24、Novii
商用高密度 27 加地 无 晚孕 Meridian M110
研究级公开库 4 至 8 部分有胸导参考 混杂 多数 PhysioNet 库
本库 30 加 1 同步多普勒 21 至 27 周 NInFEA

表格第三行是它最直接的竞争者。那些库的问题是参考只有母体胸导——母体心电可以减,胎心电的真值没法自证。本库用多普勒补上了这一环,代价是把孕周收窄、时间做短。

维度 商用设备的现实约束 本库的取舍
电极数 受佩戴舒适度限制,通常 6 路以内 30 路,但不追求可穿戴
使用场景 病房、居家、产时 诊室静息
记录时长 数小时至整夜 数十秒
参考 无外部参考 同步多普勒

8.4 版本、DOI 与维护状态

项目 值 说明
当前版本 1.0.0 2020 年 11 月 12 日发布
版本数 1 至今未出第二版
版本 DOI 10.13026/c4n5-3b04 指向 1.0.0
最新 DOI 10.13026/393a-ky74 始终指向最新版
规模 2.0 GB 解压、793 兆压缩 页面标注
校验 SHA256SUMS.txt 逐文件

两个 DOI 的分工要说清:版本 DOI 永远指向 1.0.0,适合写进论文的方法节;最新 DOI 会随版本滚动,适合放在数据可用性声明里。多数期刊要求后者。

§9 使用指引

9.1 三种角色的路径

你的角色 第一步 第二步 停在哪一步就该停
算法研究者 取记录 1 跑通读盘与提取 用多普勒判读做逐搏对照 报出比论文基线更高的指标时,先查对齐
临床研究者 抄论文表 3 建元数据表 按孕周与胎位分层看节律 想推人群结论时
设备工程师 从 24 路里裁出目标配置 比较裁剪前后的检出率 想论证可穿戴续航时

三条路径的共同前提是先把 §4.3 的案例跑通。它只有 28 秒,是验证环境最快的一块砖。跳过这一步直接上全库,出问题时无法判断是环境错还是数据错。

角色 最该用的部分 最该忽略的部分
算法研究者 27 路电生理与同步多普勒 临床表格
临床研究者 孕周、胎位、多普勒频谱节律 通道间增益差异
设备工程师 24 路单极的空间冗余 呼吸与对齐信号

9.2 一条最短的可用流程

#-- 1. 取一段(约 16 兆)
base="https://physionet.org/files/ninfea/1.0.0"
curl -sL -o 1.hea "$base/wfdb_format_ecg_and_respiration/1.hea"
curl -sL -o 1.bin "$base/bin_format_ecg_and_respiration/1.bin"
curl -sL -o 1.bmp "$base/pwd_images/1.bmp"

#-- 2. 读盘并确认规模
python3.11 -c "
import numpy as np
f=open('1.bin','rb')
fs=float(np.frombuffer(f.read(8),'<f8')[0])
nch=int(np.frombuffer(f.read(8),'<u8')[0])
ns=int(np.frombuffer(f.read(8),'<u8')[0])
sig=np.frombuffer(f.read(),'<f8').reshape(ns,nch).T
print(fs,nch,ns,ns/fs)
"

#-- 3. 抽包络,得到机械参考的时间序列
python3.11 -c "
import numpy as np
from PIL import Image
img=np.array(Image.open('1.bmp').convert('L'))
mask=img>np.median(img)*0.85
up=[np.flatnonzero(mask[:,x]).min() if mask[:,x].any() else np.nan for x in range(img.shape[1])]
lo=[np.flatnonzero(mask[:,x]).max() if mask[:,x].any() else np.nan for x in range(img.shape[1])]
np.save('env.npy',np.array([up,lo]))
print(len(up))
"
步骤 耗时量级 常见失败 补救
取数 数十秒 路径拼错,404 用 -w "%{http_code}" 看状态码
读盘 秒级 维度顺序弄反 先 reshape(采样点, 通道) 再转置
抽包络 数秒 图像模式不是灰度 先 convert("L")

9.3 引用方式

官方要求双引用:PhysioNet 项目页与 Scientific Data 论文,缺一不可。

引用对象 内容 用途
PhysioNet 项目页 Pani 等,2020,版本 1.0.0,DOI 10.13026/c4n5-3b04 标明数据版本
原始论文 Sulas 等,Scientific Data 8:30,2021 说明方法与验证
平台引用 PhysioNet 平台论文 部分期刊要求
场合 建议写法
论文方法节 数据集名 + 版本号 + 版本 DOI
数据可用性声明 最新 DOI + 访问日期
致谢 医院与科室全称

许可为 ODC-BY 1.0,允许商用,条件是署名;不要求共享衍生作品,也不要求同许可发布,比 ODbL 宽松。

§10 AI 使用声明

项目 说明
文本生成 由大模型辅助起草,编辑复核事实与表述
数字来源 官方项目页、论文全文、头文件与清单,逐项对应
未核实项 频谱图纵轴的速度标定参数,页面与论文均未给出
未做的事 未下载全量包做逐条统计,未复现论文的提取实验
图像 封面为生成式示意图,非真实数据可视化
引用建议 正式引用请以官方项目页与论文为准
更新责任 数据方改版后以官方页面为准
免责 不构成临床决策依据

常见误读(避坑清单)

常见说法 实际 证据
「带心电标注的胎心电库」 无任何逐搏注释文件,参考是多普勒图像 目录只有 bin、wfdb、bmp、code 四类
「产时监护数据」 孕 21 至 27 周、诊室静息、单段数十秒 官方数据描述节
「60 个受试者」 39 名孕妇,60 段 摘要与论文表 2
「有胎儿心电真值」 只有机械参考,电机械延迟不固定 论文技术验证节自述
「2048 Hz 就能分析到 1 kHz」 输入带宽受抽取滤波器限制在约 550 Hz 方法节前端参数
「多普勒 V 峰就是 R 峰」 两者之间隔着兴奋收缩耦联,时差不定 论文讨论
「可以直接拿来做预训练」 60 段合计不到半小时,规模不够 时长范围
「通道数是 27」 有效电生理 27 路,物理行数 34 行 头文件 34 行信号名
「孕周可以外推到晚孕」 只覆盖胎脂屏蔽之前的窗口 入组标准
「数据包里有孕期信息」 临床信息在论文表 3,包内无独立文件 目录清单

FAQ

它有逐搏的胎儿心电标注吗? 没有。数据包内不含任何心电层面的注释文件,唯一能对号的是同一时刻的多普勒频谱。论文用视觉判读的 V 峰做过一次 QRS 检出评估,那是一次性实验,不是随数据发布的标注。

为什么孕周只到 27 周? 28 周前后胎脂形成,电导率比羊水低两个数量级,会把胎心电衰减到几乎测不到。团队为了让形态学研究站得住,把窗口收在屏蔽之前。

60 段记录等于 60 个人吗? 不等于。60 段来自 39 名孕妇,有人录了三段。按段做交叉验证会让同一个人的数据同时进训练与测试两侧。

为什么同一段有 bin 和 wfdb 两套文件? bin 是原生 64 位双精度,保精度;wfdb 是转出的 32 位单精度,为兼容 PhysioNet 工具链。数值分析优先用 bin。

多普勒能不能当心电金标准? 不能。电激动与机械射血之间隔着兴奋收缩耦联,时差随心率与状态变化,且频谱的时间分辨率只有十毫秒量级。它只能做「这一搏是否存在」的二值判定。

2048 Hz 的采样率意味着能分析到 1 kHz 吗? 不能。输入带宽被内部抽取滤波器限制在约 550 Hz,更高的频率成分在采集时就没了。

库里有病理性胎儿的记录吗? 没有。入组要求胎儿在心脏学意义上健康,理由是样本量小,病理情形会代表性不足。

能直接拿它训练端到端模型吗? 能读进去,但要自己造标签。可用多普勒 V 峰做弱标签,或用传统方法跑一遍当伪标签,两条路都会把误差带进训练集。

频谱图上的速度值怎么换算? 需要纵轴量程与基线位置,这两个参数没有写进数据包,只能从图上自带的刻度标注反推。这是实操中最容易被卡住的一步。

同一名孕妇的多段记录怎么分辨? 包内没有孕妇编号,只能靠论文表 2 的分组标注(如「信号 1–3」)还原。做个体层面分析前,必须先建这张对照表。

术语表

术语 含义 在本库中的具体所指
非侵入式胎心电 从母体体表电极间接获取的胎儿心电 22 路腹壁加 2 路背部单极
母胎心电分离 从腹壁混合信号中分出胎儿成分 论文用周期成分分析加 JADE
胸导参考 母体胸部电极,取母体心电骨架 六个电极组成三路双极
直流耦合 前端不设高通,保留直流分量 偏置以毫伏计,发布前逐路扣除
平均参考 单极通道以全部单极通道的均值为参考 24 路单极共用
抽取滤波 降采样前的抗混叠滤波 把可用带宽压到约 550 Hz
术语 含义 在本库中的具体所指
脉冲多普勒 有距离选通的超声血流测速 心尖五腔切面,取样框跨二尖瓣与主动脉瓣
E 峰 舒张早期被动充盈产生的频谱峰 与 A 峰同向
A 峰 心房收缩产生的频谱峰 用来判断心房是否活动
V 波 收缩期主动脉射血的单相波 用来判断心室是否活动
包络 频谱图上下边界的曲线 等效采样率 284 点每秒
心尖五腔切面 同时显示四腔与主动脉起始部的切面 多普勒取样的标准窗口
临界成功指数 命中除以命中加误检加漏检 论文里的准确率即此定义
术语 含义 在本库中的具体所指
胎脂 覆盖胎儿体表的蜡状物,电导率极低 28 周后屏蔽胎心电的原因
胎方位 胎儿先露部位与母体骨盆的关系 如 vertex(头位)、breech(臀位)
锯齿波 线性上升后回落的内部信号 用于检测采样中断
触发信号 与采集事件对应的脉冲 把视频起点钉在电生理时间轴上
量效标定 频谱图纵轴像素与血流速度的换算 参数未随数据发布,需反推
子采样重构 从高密度电极集中挑出子集模拟低密度配置 可复现文献里的多套布局

附录 A:核心数字核对表

项 值 来源 来源层级
受试者 39 名孕妇 摘要与数据描述 官方页面
记录段数 60 段 摘要、RECORDS 行数 官方页面
孕周 21 至 27 周 摘要、入组标准 官方页面
电生理通道 27 路 摘要 官方页面
采样率 2048 Hz 头文件与摘要 头文件
位深 22 位 摘要与方法节 官方页面
单段时长 7.50 至 119.80 秒 数据描述 官方页面
项 值 来源 来源层级
输入带宽 约 550 Hz 方法节 论文
量程 300 毫伏峰峰 方法节 论文
量化台阶 71.5 纳伏 方法节推算 论文
输入阻抗 10 的 12 次方欧 方法节 论文
电极总数 30 个信号加 1 个参考 方法节与示意图 论文
多普勒帧率 60 帧每秒 方法节 论文
项 值 来源 来源层级
压缩包 792.9 兆 项目页 官方页面
解压后 2.0 GB 项目页 官方页面
许可 ODC-BY 1.0 项目页 官方页面
版本 DOI 10.13026/c4n5-3b04 项目页 官方页面
最新 DOI 10.13026/393a-ky74 项目页 官方页面
可提取比例 95.5% 技术验证节 论文
检出准确率中位数 0.79 表 5 论文
灵敏度中位数 0.97 表 5 论文
阳性预测值中位数 0.81 表 5 论文

附录 B:数字的来源分层

层级 含义 本库中属于这一层的信息
一级 官方项目页直接写明 人数、段数、孕周、通道数、时长范围、许可、体积
二级 同行评议论文写明 前端参数、电极布置、帧率、提取流程、验证指标
三级 文件本身可核对 34 行信号名、采样点数、增益、偏置扣除值、文件大小
项 状态
频谱纵轴速度标定 未核实,页面与论文均未给出
采集卡实际丢帧率 未核实
呼吸带标定方式 未核实
各段是否连续采集 未核实

附录 C:完整参考文献

序 文献 用途
1 Sulas 等,非侵入式多模态胎心电—多普勒数据集,Scientific Data 8:30,2021 数据描述主文献
2 Pani 等,NInFEA 数据描述,PhysioNet,2020,版本 1.0.0 数据入口
3 Sulas 等,胎儿脉冲多普勒房室活动自动识别,EMBC 2018 多普勒分析方法
5 Sulas 等,单参考与多参考自适应滤波比较,EMBC 2019 提取基线
7 Sameni,开源电生理工具箱 OSET 3.14,2018 复现代码

附录 D:任务代码

import numpy as np
import wfdb

#-- 目标:把一段记录切成腹壁、胸导、呼吸三块,并给出时长与文件大小校验
def load(rec_id: int, root: str = "wfdb_format_ecg_and_respiration"):
    sig, f = wfdb.rdsamp(f"{root}/{rec_id}", physical=True)
    idx = {n: i for i, n in enumerate(f["sig_name"])}
    abd = sig[:, [idx[f"uni_abd{k}"] for k in range(1, 23)]]
    tho = sig[:, [idx[f"bi_tho{k}"] for k in range(1, 4)]]
    return {
        "fs": f["fs"],
        "sec": f["sig_len"] / f["fs"],
        "abd": abd,
        "tho": tho,
        "resp": sig[:, idx["matrsp"]],
        "expect_bytes": 24 + 8 * len(f["sig_name"]) * f["sig_len"],
    }

d = load(1)
print(d["fs"], round(d["sec"], 2), d["abd"].shape, d["expect_bytes"])
#-- 期望输出:2048.0 28.07 (57490, 22) 15637304
检查点 期望 不符时的含义
采样率 2048 读错了文件或格式
时长 约 28.07 秒 采样点数不符
腹壁形状 (57490, 22) 通道名索引错
字节数 与文件实际大小一致 下载不完整

附录 E:如果只记五件事

序 一句话
1 它是早孕期唯一带同步独立参考的公开胎心电库
2 参考是机械的,不是电学的,只能判有无,不能量间期
3 39 人 60 段,按段统计会重复计入个体
4 孕周 21 至 27 周是被胎脂屏蔽逼出来的窗口
5 30 个电极的最大价值是能往回裁成低密度配置

编辑说明

本篇的事实取自 PhysioNet 项目页 1.0.0 版、Scientific Data 论文全文、RECORDS 清单与记录 1 的头文件,四者不一致处以文件为准并并列两口径。未下载全量包,未复现论文的提取实验,凡属推断处已在文中标明。数字分层见附录 B。


相关数据集导航

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

  • kiel-cardio — 共享标签:生理信号 / 心电信号 / 多模态
  • eye-tracking-ecg — 共享标签:生理信号 / 心电信号 / 多模态
  • nifecgdb — 共享标签:生理信号 / 心电信号 / 儿科
  • heartcycle — 共享标签:生理信号 / 心电信号 / 多模态
  • nifeadb — 共享标签:生理信号 / 心电信号 / 儿科
  • ephnogram — 共享标签:生理信号 / 心电信号 / 多模态
  • deepfake-ecg — 共享标签:生理信号 / 心电信号 / 多模态
  • ecg-spider-clip — 共享标签:生理信号 / 心电信号 / 多模态
  • cinc-2013 — 共享标签:生理信号 / 心电信号 / 儿科
  • pics — 共享标签:生理信号 / 心电信号 / 儿科

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

返回 AI-Ready 数据集