信息速览
早孕期想验证一套胎心电提取算法,会撞上一件很具体的事:没有尺子。产时的头皮电极可以直接记录胎儿心电,但那是分娩台上的事;孕中期能同时拿到、又能当参考的,只有超声。于是这个领域长期缺一份「同一秒里既有腹壁电极、又有超声参考」的记录。
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 — 共享标签:生理信号 / 心电信号 / 儿科
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

