信息速览
SUFHSDB 是 PhysioNet 上一份不那么显眼的胎心音库:一百零九名孕妇,一百一十九段胎儿心音图,九十二段母体心音,每段九十秒上下。它诞生于伊朗设拉子的一家医院,录制的目的很具体——给「从一路腹部声音里把胎儿心音抠出来」这件事准备原料。
它和许多同类库的差别不在大,而在「整」。同一名孕妇的母体录音与胎儿录音往往成对存在,双胎病例还按医生建议的胎位各录了一遍,另有一张 Excel 表把孕次、体质指数、孕周、胎儿性别与部分 CTG 心率串起来。这套组合让它更像一份完整的小型病例档案,而不是一堆零散的波形文件。
可惜「整」也就到此为止:它没有逐拍标注,没有病理分组,全部来自一家医院。使用者要拿它做事,得先接受它的形状。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Shiraz University Fetal Heart Sounds Database(SUFHSDB) |
| 数据性质 | 真实录音,非合成 |
| 采集机构 | 伊朗设拉子医科大学哈菲兹医院(Hafez Hospital) |
| 提交者 | Reza Sameni、Maryam Samieinasab |
| 采集时间与地点 | 2010 年代中期,伊朗设拉子,单一医院 |
| 采集设备 | 韩国 JABES 数字听诊器,宽频模式,频响 20 赫兹至 1 千赫兹 |
| 录音软件 | Audacity,Windows 电脑 |
| 受试者 | 一百零九名孕妇,年龄 16 至 47 岁,均值 29.3 岁 |
| 母体 BMI | 19.5 至 38.9,均值 29.2 |
| 妊娠类型 | 单胎与双胎混合,双胎七例 |
| 胎儿记录 | 一百一十九段 |
| 母体记录 | 九十二段,来自 91 名母亲 |
| 单段时长 | 平均约九十秒 |
| 采样率与位深 | 一般 16 千赫兹、16 位;少数 44.1 千赫兹 |
| 标注 | 无逐拍标注;附 Excel 表含临床字段与部分 CTG 均值 |
| 体积 | 解压后 789.3 MB,ZIP 632.6 MB |
| 许可与 DOI | ODC-BY 1.0;10.13026/42eg-8e59 |
| 上线时间 | 2017 年 7 月 19 日(1.0.0),2021 年 1 月 8 日(1.0.1) |
§1 它要解决的具体麻烦
1.1 一路声音里有两颗心,得先有材料证明分得开
胎心音里最麻烦的不是噪声,而是另一颗心。母体的瓣膜开合声经腹壁传过来,频段与胎儿心音几乎重叠,幅度往往还更大。想从一路录音里把胎儿的成分剥出来,算法上叫单通道盲源分离(SCBSS),工程上叫「在两个人的心跳里找其中一个」。
这条路要有人先把它走通,就得有一批录音,里面同时有胎心、母心、肠鸣、胎动,而且最好母心那份还有单独录的对照。设拉子这份库就是照着这个需求攒出来的:多数母亲在录胎儿心音之前先录一段自己的心音。这个细节在官方描述里只用一句话带过,但它决定了这份数据后来被怎么用。
| 需求 | 常规做法 | 卡在哪 | 这批录音的位置 |
|---|---|---|---|
| 验证单通道盲源分离 | 自采几段 | 无对照,不知道分出来的是不是母心 | 多数组有母体对照录音 |
| 观察双胎腹部声音 | 文献示意图 | 图是画的,看不到真实叠加 | 七例双胎各录两段 |
| 建立胎心率提取基线 | 合成信号 | 合成信号没有肠鸣与胎动 | 真实录音中含这些干扰 |
| 找到能公开引用的原料 | 各实验室自留 | 不公开、无法复现 | 2017 年起公开在 PhysioNet |
1.2 三条常见的错误期待
第一条,期待它自带逐拍胎心率。 库内的 Excel 表确实有心率一栏,但官方写的是「十秒窗口的平均 CTG 心率」,而且只对有该测量的一部分受试者给出。十秒一个数,九十秒的录音只有九个点左右。拿这个去算逐拍误差,量纲都对不上。真正的逐拍真值要使用者自己从波形里标。
第二条,期待双胎实验是「一次录音两个胎心」。 官方的做法相反:七例双胎按妇科专家建议的胎位分两次采集,每次把听诊器对准一个胎儿,分别存成后缀 -1 与 -2 的两个文件。这么做是为了让每一段里只有一个胎心清晰,代价是失去了「两个胎心在同一路信号里分离」这个更难也更有用的场景。
第三条,期待它是正常人对照库。 库里有临床病史字段,但没有按有无妊娠并发症分层,也没有随访结局。它既不是健康对照组,也不是病理组,而是一份「来了就录」的连续病例集合。做组间比较之前,得先自己把人群说清楚。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 真实胎儿心音的原始波形 | 一百一十九段,覆盖单胎与双胎 | 够,这是核心用途 |
| 单通道分离的母体对照 | 九十二段母体心音,多数与胎心同人 | 大致够,但不保证逐人配对 |
| 逐拍胎心率评测 | 无逐拍标注 | 不够,须自标 |
| 与 CTG 的粗对照 | 部分受试者的十秒均值 | 够做量级校验,不够做误差统计 |
| 临床变量关联分析 | 孕次、BMI、孕周、性别、年龄、病史 | 部分够,部分字段有缺 |
| 病理妊娠研究 | 无分层、无结局 | 不够 |
| 深度学习训练 | 合计约三小时量级 | 不够,量级差一到两个数量级 |
| 算法论文的可引用实验材料 | 固定 DOI、固定许可、版本稳定 | 够,且已经有人在用 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做单通道胎心音分离,需要真实混合信号 | 一百多段真实腹部录音,多数组配母体对照 | 先在有母体对照的受试者上验证分离结果能否对上那段母心 |
| 你写了一个胎心音包络检测器,只在自采数据上试过 | 不同孕周、不同 BMI 的真实录音 | 按 §4.2 的案例先人工标几段 S1,再报检出率 |
| 你要说明算法输入是真实临床录音 | 公开可引用、带 DOI、来自医院 | 在方法节写明用了哪些编号、如何划分训练与测试 |
| 你在评估双胎场景 | 七例双胎、按胎位分别录制 | 把它当「双胎腹部录音的样子」,不要当分离评测集 |
| 你在做生理信号教学 | 六百多兆可整包下完,文件平铺好读 | 用 §9.2 的流程读入并画包络,一节课够用 |
| 你要做人群差异研究 | 单一中心、单一族群 | 不够,需另找多中心数据 |
1.5 一句话判断
它像一份做得很认真、但没有写结论的临床笔记:材料齐、来源清楚、格式规整,可是每个判断都得你自己下。
1.6 不适合谁:四条边界
不适合要标注的人。 逐拍 S1/S2 时间戳、逐拍胎心率、胎儿编号全都没有。任何以「标签已就绪」为前提的流水线,第一步就得先做人工标注与工具链。
不适合要病理谱的人。 没有按并发症分层,没有随访结局,没有健康对照组。想研究胎心音与胎儿窘迫的关系,这里连阴性对照都凑不齐。
不适合要规模的人。 一百一十九段、每段九十秒,合计三小时上下。做算法验证够用,做监督训练远远不够,做自监督预训练也只是勉强。
不适合要双胎分离真值的人。 七例双胎是分两次录的,每段里只有一个胎心是目标。真正的双胎同录场景,这份库给不了。
§2 数据构成与规格
2.1 一个平铺目录与文件名里的两层信息
和许多 PhysioNet 的小型波形库一样,这个库没有子目录。所有 .wav 与 .hea 平躺在根目录,另有四份非信号文件:Excel 表、许可文本、RECORDS 清单、SHA256SUMS.txt 校验和。
身份信息压在文件名里,只有两层:首字母区分胎儿与母体,后面的数字是受试者编号,再往后可能跟一个 -1 或 -2 后缀表示重复或双胎的第二次录制。
| 位置 | 形态 | 取值 | 含义 |
|---|---|---|---|
| 目录 | 无分层 | 根目录 | 全部信号文件平铺 |
| 文件名首字母 | f / m |
两种 | 胎儿记录 / 母体记录 |
| 文件名数字 | NNN |
1 至 112 | 受试者编号 |
| 文件名后缀 | -1 / -2 |
可缺省 | 同一受试者的追加或双胎第二次录制 |
| 扩展名 | .wav / .hea |
两种 | 音频数据与 WFDB 头文件 |
| 根目录其他 | FetalPCGSpreadsheet.xlsx |
18.7 KB | 临床信息表 |
| 根目录其他 | RECORDS |
893 B | 记录清单 |
| 根目录其他 | SHA256SUMS.txt |
30.5 KB | 校验和 |
这种命名的好处是「一眼看出这段是谁的、是胎心还是母心」;缺点是编号并不连续,也并非每个编号都有两种记录。使用者若想按受试者建索引,必须自己把 f 与 m 两套编号对齐后再求交集,交集之外就是只有单侧记录的受试者。
2.2 字段与记录的完整字典
信息分三处存放:文件名、.hea 头文件、Excel 表。三处之间没有外键约束,只有编号这个松散的关联。下表把三处的字段逐一摊开。
| 信息项 | 所在位置 | 取值形态 | 含义 |
|---|---|---|---|
| 记录名 | .hea 首行第 1 列 |
与文件名相同 | 记录标识 |
| 通道数 | .hea 首行第 2 列 |
1 |
单通道 |
| 采样率 | .hea 首行第 3 列 |
16000 或 44100 |
赫兹 |
| 采样点数 | .hea 首行第 4 列 |
各文件不同 | 除以采样率得秒数 |
| 数据文件 | .hea 第二行第 1 列 |
同名 .wav |
指向音频 |
| 存储格式 | .hea 第二行第 2 列 |
WAV 格式码 | WFDB 存储约定 |
| 增益 | .hea 第二行第 3 列 |
各文件不同 | 显示标度换算 |
| 位分辨率 | .hea 第二行第 4 列 |
16 |
16 位量化 |
| ADC 零点 | .hea 第二行第 5 列 |
各文件不同 | 16 位量化的中点 |
| 信号名 | .hea 第二行末列 |
单通道名 | 通道命名 |
| 受试者编号 | Excel 表 | 整数 | 与文件名数字对应 |
| 怀孕次数 | Excel 表 | 整数 | gravid |
| 存活子女数 | Excel 表 | 整数 | alive |
| 流产次数 | Excel 表 | 整数 | abortions |
| 母体 BMI | Excel 表 | 小数 | 体质指数 |
| 孕周 | Excel 表 | 整数 | pregnancy term,单位周 |
| 胎儿性别 | Excel 表 | 分类 | gender of the fetus |
| 母亲年龄 | Excel 表 | 整数 | 岁 |
| 临床病史 | Excel 表 | 自由文本 | 如有则填 |
| CTG 平均心率 | Excel 表 | 数值序列 | 十秒窗口均值,部分受试者有 |
这张表最该留意的是最后两行。临床病史是自由文本且标注了「如有」,意味着缺值不是错误而是常态;CTG 心率是「部分受试者有」,官方没有说明是哪一部分、覆盖多少个窗口。任何把这两列当完整变量使用的分析,都要先自己数一遍非空行,而这个数字官方没给。
2.3 一段录音的完整解剖
以一条胎儿记录为例,它的 .hea 只有两行。第一行说明记录名、单通道、采样率与采样点数;第二行描述该通道的数据文件、格式、增益、位深、零点与信号名。
f17-1 1 16000 1440000
f17-1.wav 16 1.0 16 32768 0 0 Fetal_PCG
这里 1440000 除以 16000 得 90 秒,与官方「平均约九十秒」吻合。不同记录的采样点数并不一致,短的只相当于几十秒,长的接近百秒有余。
用标准工具读出来是这样:
import wfdb
import numpy as np
rec = wfdb.rdrecord("f17-1", physical=True)
print(rec.fs, rec.sig_len, rec.n_sig, rec.sig_name)
#-- 16000 <采样点数> 1 ['Fetal_PCG']
x = rec.p_signal[:, 0]
print(round(len(x) / rec.fs, 1), float(np.min(x)), float(np.max(x)))
#-- 约 90.0 秒,幅度在正负一个显示单位内
只想听或只想看波形时,其实不必经过 WFDB,直接读 WAV 更简单:
import wave
import numpy as np
with wave.open("f17-1.wav", "rb") as w:
fs = w.getframerate()
n = w.getnframes()
ch = w.getnchannels()
raw = w.readframes(n)
x = np.frombuffer(raw, dtype=np.int16)
print(fs, ch, n, round(n / fs, 1))
#-- 16000 1 <帧数> 约 90.0
print(int(x.min()), int(x.max()))
#-- 16 位整数范围内的双边取值
两条路径拿到的样本一致,差别只在呈现:WFDB 按增益把整数换成浮点,WAV 直接给 16 位整数。做频谱分析时用前者方便,做听感检查时用后者贴地。
2.4 四种规模口径
同一个库可以有四种数法,各自回答不同的问题。官方给出的是前两种,后两种是按采样点数折算的。
| 口径 | 数值 | 单位是什么 | 什么时候用它 |
|---|---|---|---|
| 受试者数 | 一百零九 | 人 | 说人群规模时 |
| 记录数 | 一百一十九段胎儿 + 九十二段母体 | 段 | 说样本量时 |
| 单段时长 | 平均约九十秒 | 秒 | 与其它库对比录音习惯时 |
| 累计时长 | 三小时上下 | 小时 | 判断能否做训练时 |
| 体积 | 789.3 MB 解压 / 632.6 MB 压缩 | 兆字节 | 判断下载成本时 |
四种口径之间可以互相验算:一百一十九段乘九十秒约一万零七百秒,合三小时。按 16 千赫兹、16 位单通道折算,每秒三十二千字节,九十万秒字节约合三吉字节;实际解压体积只有七百多兆,说明相当一部分记录的时长明显短于九十秒,或者采样点被压缩过。官方没有列出逐条时长,这个差额只能在使用时自行核对。
2.5 与同类资源的字段差异
| 对比项 | SUFHSDB | IIScFHSDB | FPCGDB | CirCor |
|---|---|---|---|---|
| 模态 | 心音(胎+母) | 心音(胎) | 心音(胎) | 心音(儿童与青年) |
| 受试者 | 一百零九名孕妇 | 六十名孕妇 | 二十六名孕妇 | 九百余名 0 至 21 岁 |
| 记录数 | 一百一十九段胎儿 + 九十二段母体 | 六十段 | 二十六段 | 三千余段 |
| 单段时长 | 约九十秒 | 数分钟 | 约二十分钟 | 数秒至数十秒 |
| 采样率 | 16 千赫兹为主 | 2 千赫兹 | 333 赫兹 | 4 千赫兹 |
| 位深 | 16 位 | 视设备 | 8 位 | 视设备 |
| 母体对照 | 有 | 无 | 无 | 不适用 |
| 双胎 | 七例,分别录 | 无 | 无 | 不适用 |
| 附临床表 | 有 | 有 | 无 | 有 |
| 逐拍标注 | 无 | 无 | 无 | 有周期标注 |
这张表里最能说明定位的是「母体对照」与「双胎」两行。整个 PhysioNet 的胎心音库里,同时提供母体对照录音和双胎病例的,这一份几乎是唯一的选择。代价是单段短、无标注、采样率不算高也不算低,正好卡在「够用但不宽裕」的位置。
§3 它记录的是什么:下腹部九十秒的声音
3.1 一声心音怎么变成一段 WAV
整条链路很短,也很朴素。数字听诊器的膜片贴在孕妇下腹部,把皮肤表面的微小振动转成电信号;设备内部完成放大与模数转换,以宽频模式输出,频响覆盖二十赫兹到一千赫兹;信号经 USB 或音频接口进 Windows 电脑,由 Audacity 录成 WAV;最后按受试者编号命名落盘。
| 环节 | 做了什么 | 留下的痕迹 | 对使用者的影响 |
|---|---|---|---|
| 拾音 | 膜片把腹壁振动转成电信号 | 一路波形 | 无法区分声音来自胎儿还是母体 |
| 放大 | 设备内置前置放大 | 增益未给出物理标定 | 绝对声压无从还原 |
| 滤波 | 宽频模式,20 赫兹至 1 千赫兹 | 通带写进了官方描述 | 带外成分已被设备滤掉 |
| 采样 | 16 千赫兹或 44.1 千赫兹 | 头文件第 3 列 | 奈奎斯特上限 8 千赫兹或 22 千赫兹 |
| 量化 | 16 位 | 头文件第 4 列 | 六万五千余个台阶 |
| 落盘 | Audacity 录为 WAV | 文件名 | 无采集时间戳 |
这条链路里有两个地方值得停一下。一是「宽频模式」:二十赫兹到一千赫兹这个通带对心音来说偏宽——心音的主要能量在几十到几百赫兹,通带把低频的呼吸起伏与高频的部分环境声都放了进来,好处是不预先替使用者做取舍,坏处是「原始」里混着不少可以事后去掉的成分。
二是 16 千赫兹这个采样率。按奈奎斯特定理上限是 8 千赫兹,远高于设备一千赫兹的通带,属于「过采样」。这么做不浪费:过采样让后续的数字滤波有裕量,也让重采样到 4 千赫兹、2 千赫兹这类常用工作频率时不至于引入明显失真。相比 FPCGDB 的 333 赫兹(上限约 166 赫兹),它给了使用者更多的处理自由度。
3.2 干扰不是一种,是几种能叫出名字的
腹部录音里混进来的东西,官方没有逐条列举,但从信号本身与采集方式可以推断出几类,且它们的性质完全不同:
| 干扰源 | 物理来源 | 时间特征 | 能否事后去除 |
|---|---|---|---|
| 母体心音 | 母体瓣膜开合经腹壁传导 | 规律双击,节律稳定 | 难,与胎心同频段 |
| 肠鸣 | 胃肠蠕动与气体移动 | 不规则低频爆发 | 部分可,靠短时能量门限 |
| 呼吸起伏 | 膈肌运动改变腹壁张力 | 缓慢基线漂移 | 可,高通即可压掉大半 |
| 胎动 | 胎儿肢体运动 | 突发宽带冲击 | 部分可,靠瞬态检测 |
| 胎盘血流 | 湍流产生的持续嘶声 | 宽带、平稳 | 难,与目标重叠 |
| 环境噪声 | 病房背景 | 取决于场地 | 难,已混入无法分离 |
六类里只有呼吸起伏能靠一个高通滤波器基本解决,肠鸣与胎动能靠瞬态检测识别出一部分,剩下三类都和目标信号抢频谱。这解释了为什么胎心音的分割比胎心电更难:心电里母体 QRS 与胎儿 QRS 在时间上错开,模板减除就能压掉大半;心音里母体的每一次瓣膜开合都可能与胎儿心音撞在一起,压掉母体的同时必然带走胎儿的一部分。
而这份库恰好提供了检验这件事的条件:多数受试者有一段单独的母体录音。把那段母心的节奏与本段里的干扰对上,就能判断某段干扰来自母亲还是来自环境。这是 §4.2 的案例要展开的做法。
3.3 单通道意味着什么
单通道的第一个限制是没有空间信息。多导联可以用空间滤波或盲源分离,把来自不同方向的成分分开;一路信号做不到,分离只能落在时频域。第二个限制是没有交叉校验:临床上探头松动会立刻在另一路显出来,这里只有一个探头,坏了就是整段不可用,也没有旁证。
还有一点容易被忽略:临床听诊会在腹部四个象限分别听,找出胎心音最清楚的位置;这份库对每名孕妇只记录一个听诊位置,且没有把那个位置写进任何字段。官方只说了「置于下腹部」。这意味着使用者无法判断某段录音里胎心清晰是因为胎位好,还是因为探头贴得准。
反过来说,单通道也降低了门槛:不用考虑通道顺序、不用对齐、不用处理缺失通道,一条曲线读进来就能画。做教学时这是优点,做方法研究时这是硬约束。
3.4 编号不连续:一遍能看出来的结构
把 RECORDS 清单摊开,会发现编号不是从 1 连续排到 112。母体记录的编号有明显跳空,胎儿记录在部分区段是连续的。这种跳空不是错误,而是采集过程的痕迹:有些受试者只录了胎儿、没录母体,有些录了母体却没有可用的胎儿段。
| 观察到的现象 | 官方解释 | 实际含义 |
|---|---|---|
| 母体记录少于胎儿记录 | 多数(91 名)母亲录了母心 | 约十八名母亲没有母体录音 |
| 母体编号有跳空 | 未说明 | 缺的那几号可能是只录了胎心 |
存在 f102 与 f102-1 |
同一受试者两条记录 | 重复录制或双胎 |
存在 f17-1、f17-2 |
双胎按胎位分别录 | 同一孕妇的两个胎儿 |
存在 m19 与 m19-1 |
同一母亲两条 | 重复录制 |
这张表的价值在于提示一件事:受试者数不等于记录数,也不等于配对数。 做「胎心与母心配对」的分析时,可用样本量最多是九十余对,不是一百一十九对;做「每名孕妇一条记录」的分析时,得先决定重复记录怎么合并。
3.5 它记录不了的生理
| 想知道的量 | 这个库能给吗 | 原因 |
|---|---|---|
| 逐拍胎心率 | 不能 | 无标注,需自建 |
| S1 与 S2 边界时刻 | 不能 | 同上 |
| 哪一段属于双胎中的哪一个 | 不能 | 官方未标注 |
| 探头的具体方位 | 不能 | 只写「下腹部」 |
| 宫缩活动 | 不能 | 未记录 |
| 新生儿结局 | 不能 | 无随访 |
| 孕早期胎心音 | 极少 | 孕周分布集中在孕晚期 |
| 母体逐拍心电 | 不能 | 母体也只录了心音 |
最后两行常被忽略。第一条决定了它做不了早孕期研究;第二条决定了它的母体对照只能用于「听感比对」,不能用于心电层面的分割验证——想验证「分离出的母体成分是否与真实母心电一致」,这份库没有母心电。
§4 它最独特的东西:带母体对照的配对录音
4.1 为什么「先录母亲、再录胎儿」这个顺序值得记住
多数胎心音库只录胎儿,母亲的干扰是「混在里面要处理掉的东西」。这份库的做法是反过来:先把母亲的心音单独录一遍,再录胎儿。这个顺序带来两个后果。
其一,母亲那段录音证明了干扰的来源。如果某段胎儿录音里有一段节律性的双击,而同一名母亲的单独录音里恰好在相近频率上有同样的双击,那么这段干扰几乎可以确定是母心而非环境噪声。这种溯源能力,是所有自带母体对照的库才有的。
其二,它让「分离得好不好」有了一个粗糙但可用的判据。分离算法输出两路——一路是胎心、一路是母心。母心那一路如果和单独录的母体录音在节律上对得上,说明算法确实抓到了母体成分,而不是把胎儿成分一分为二。这个判据不精确,但比「看起来像心跳」强得多。
| 用途 | 没有母体对照时 | 有母体对照时 |
|---|---|---|
| 判断干扰来源 | 只能靠频谱猜测 | 可与同人母心录音比对 |
| 验证分离结果 | 看输出像不像心跳 | 看母心输出是否对上母心录音 |
| 估计母体心率 | 从混合信号中估计 | 可从母心录音直接算 |
| 评估探头位置影响 | 无法判断 | 仍无法判断,位置未记录 |
4.2 案例:f17 这名孕妇与她的两次录音
用 f17 作例子,因为它是库里少数同时具备几个特征的受试者:有 f17-1 与 f17-2 两段胎儿记录、有母体对照,且编号靠前、文件短小、便于快速验证流程。
f17-1 与 f17-2 是双胎按胎位分两次录的。拿到这两段,第一件事是把它们并排画出来:两段的包络节律往往不同,这正是「两个胎儿心率不一样」的直接体现。第二件事是把同人的母体录音叠上去,找出三者共有的节律成分——那些在三段里都出现的双击,基本就是母心。
import wave
import numpy as np
def load(p):
with wave.open(p, "rb") as w:
fs = w.getframerate()
x = np.frombuffer(w.readframes(w.getnframes()), dtype=np.int16)
return fs, x.astype(np.float64)
fs, a = load("f17-1.wav")
_, b = load("f17-2.wav")
_, m = load("m17.wav")
print(fs, round(len(a) / fs, 1), round(len(b) / fs, 1), round(len(m) / fs, 1))
#-- 16000 三段各自秒数,母体段通常明显更短
env = np.abs(a)
win = fs // 10
pk = env[: len(env) // win * win].reshape(-1, win).max(axis=1)
print(round(float(pk.mean()), 1), round(float(pk.std()), 1))
#-- 十秒窗峰值序列的均值与离散度,用于粗看节律稳定度
这个过程在本篇里被反复引用:§1.4 里「先在有母体对照的受试者上验证分离结果」指的是同一条路径;§7.3 讨论缺值偏差时,也要回到这一类「有母体对照但未必配对成功」的受试者;§9.2 的最短流程同样以 f17 为起手样本。它不代表整个库的统计学特征,只代表「一份完整材料长什么样」。
4.3 双胎为什么只录了七例
七例双胎相对一百零九名孕妇是个小数,原因不难理解:双胎本身在人群里就是少数,而每一次双胎录制都要按妇科专家建议的胎位调整两次探头位置,工作量是单胎的两倍。
官方对这七例的处理方式说得很明确:依专家建议的胎位,分两次采集,分别存为后缀 -1 与 -2。这个设计有它的道理——两段里各有一个胎心清晰,便于分别建立基线;但也有代价:它没有记录「同一次录音里两个胎心同时到达探头」的情形,而这恰恰是双胎监护中最难的部分。
| 双胎研究的子问题 | 这七例能不能支撑 |
|---|---|
| 两个胎儿的胎心音形态是否不同 | 能,两段可分别分析 |
| 两个胎儿的基线心率差异 | 能,但要自己从波形估 |
| 同一次录音中的双胎分离 | 不能,设计上就避开了 |
| 双胎与单胎的录音差异 | 勉强能,样本量太小 |
| 双胎的临床结局关联 | 不能,无随访 |
4.4 Excel 表在整份库里的角色
那张十八千字节的 Excel 表,是整个库里唯一把「波形」与「人」连起来的东西。没有它,f17-1 只是一个文件名;有了它,f17-1 才可能对应到一个有孕周、有 BMI、有临床病史的具体病例。
| 字段类别 | 字段 | 用途 | 缺值风险 |
|---|---|---|---|
| 身份 | 受试者编号 | 与文件名关联 | 低 |
| 产科史 | 怀孕次数、存活子女数、流产次数 | 反映生育史 | 低 |
| 体型 | 母体 BMI | 与腹部组织厚度相关,影响信号强度 | 低 |
| 孕期 | 孕周 | 分层分析的主变量 | 低 |
| 胎儿 | 胎儿性别 | 次要协变量 | 中 |
| 母体 | 母亲年龄 | 协变量 | 低 |
| 病史 | 临床病史(自由文本) | 已知合并症 | 高,官方注明「如有」 |
| 参考心率 | 十秒窗口 CTG 均值 | 量级校验 | 高,仅部分受试者 |
做关联分析时,最后两行是陷阱:它们看起来是变量,实际上是有选择的变量。病史「如有则填」意味着填空与否本身可能与病例严重程度相关;CTG 只对一部分人做了,做与没做可能也与临床关注度相关。
§5 怎么拿到它,以及拿到之后先做什么
5.1 三条下载路径
这个库不大,七百多兆,三条路都可行。
| 路径 | 命令形态 | 适合谁 | 注意事项 |
|---|---|---|---|
| 网页逐文件 | 浏览器点 fX.wav |
只想看一两段 | 文件很多,逐个点效率低 |
| 整包 ZIP | get-zip/1.0.1/ |
想一次拿全 | 632.6 MB,需断点续传能力 |
| 递归 wget | wget -r -N -c -np |
想边下边用 | 注意 -np 不上溯父目录 |
| S3 匿名同步 | aws s3 sync --no-sign-request |
想自动化或增量 | 桶为公开只读 |
#-- 方式一:整包下载并解压
wget -c https://physionet.org/content/sufhsdb/get-zip/1.0.1/sufhsdb.zip
unzip -q sufhsdb.zip -d ./sufhsdb
#-- 方式二:匿名 S3 同步(不需要账号与密钥)
aws s3 sync --no-sign-request \
s3://physionet-open/sufhsdb/1.0.1/ ./sufhsdb
ls ./sufhsdb | wc -l
5.2 先读清单,再读波形
清单 RECORDS 一行一个记录名,这是建立索引最快的一步。它能告诉你有多少段、编号长什么样、哪些编号带后缀。
from pathlib import Path
lines = Path("sufhsdb/RECORDS").read_text(encoding="utf-8").split()
fetal = [r for r in lines if r.startswith("f")]
maternal = [r for r in lines if r.startswith("m")]
print(len(fetal), len(maternal))
#-- 119 92
with_suffix = [r for r in lines if "-" in r]
print(with_suffix)
#-- 带 -1 / -2 后缀的记录名清单
两行输出就能把官方说的「一百一十九段胎儿、九十二段母体」对上。如果数字不符,先怀疑下载不完整,再看版本号是不是 1.0.1。
5.3 校验和:先验完整性再谈分析
SHA256SUMS.txt 有三十千字节,覆盖全部文件。下载中断留下的半截文件在播放时往往也能出声,但分析结果会莫名其妙地偏移,所以这一步不要跳。
#-- 在数据目录内校验全部文件
sha256sum -c SHA256SUMS.txt | grep -v ': OK$'
#-- 无输出即全部通过;有输出就是缺文件或文件损坏
5.4 读一段并画包络
拿到数据的第一件事通常不是训练,而是「看一眼」。胎心音的可视化与心电不同:不能看单周期,要看包络与节律。
import wfdb
import numpy as np
import matplotlib.pyplot as plt
rec = wfdb.rdrecord("sufhsdb/f100", physical=True)
fs, x = rec.fs, rec.p_signal[:, 0]
#-- 用绝对值加滑动平均做包络,窗长取 20 毫秒
w = int(0.02 * fs)
env = np.convolve(np.abs(x), np.ones(w) / w, mode="same")
plt.figure(figsize=(12, 3))
plt.plot(np.arange(len(env)) / fs, env, lw=0.6)
plt.xlabel("time (s)")
plt.ylabel("envelope")
plt.tight_layout()
plt.savefig("f100_envelope.png", dpi=150)
print(fs, len(x), round(len(x) / fs, 1))
#-- 16000 <采样点数> 约 90 的秒数
5.5 把 Excel 表接上
pandas 直接读即可,但要注意它是一张「人与人一行」的表,而波形是「段与段一个文件」。接法是以受试者编号为键做左连接,连接的失败率本身就是一条重要信息。
import pandas as pd
from pathlib import Path
meta = pd.read_excel("sufhsdb/FetalPCGSpreadsheet.xlsx")
meta.columns = [str(c).strip().lower() for c in meta.columns]
wavs = sorted(p.stem for p in Path("sufhsdb").glob("f*.wav"))
ids = {int(s.split("-")[0][1:]) for s in wavs}
have = set(meta.iloc[:, 0].astype(int))
print(len(wavs), len(have), len(ids - have), len(have - ids))
#-- 胎儿段数 / 表内人数 / 有波形无元数据 / 有元数据无波形
最后两个数字很关键。前者说明有没有「孤儿波形」,后者说明有没有「空头病例」。两者都不为 0 时,任何按行合并后的统计都要重新确认分母。
5.6 版本固定
1.0.0 与 1.0.1 的差别在于后者往 Excel 表里加了 CTG 参考心率。如果你的流程用到这一列,URL 必须写死 1.0.1,不能指向 latest——否则某天上游再发一版,你的分母就变了。
§6 与库内条目的关系
6.1 关系图谱
库内与胎心相关的共有若干份,分散在心音、心电、多模态三条线上。这份库站在心音那条线的「配对录音」位置。
| 库内条目 | 模态 | 与本篇的关系 | 差异要点 |
|---|---|---|---|
fetalheartsounddata |
胎心音 | 同模态、同期、同平台 | 印度、六十人、单段数分钟、2 千赫兹 |
fpcgdb |
胎心音 | 同模态、更早 | 意大利、二十六人、单段二十分钟、333 赫兹、8 位 |
circor-heart-sound |
心音 | 邻域但人群不同 | 儿童与青年、含周期标注、非孕期 |
nifecgdb |
胎心电 | 同任务、不同物理量 | 同一孕妇逐周五十五次、心电而非心音 |
adfecgdb |
胎心电 | 同任务、含直接真值 | 产程中、头皮直接心电作真值 |
ninfea |
多模态 | 早孕期、含多普勒 | 二十七路、2048 赫兹、多模态同步 |
这张表要说清的是:本篇与上述任何一篇都不是同一份数据的改写。 采集国家、机构、设备、受试者规模、采样率、记录时长、是否带母体对照、是否带临床表,逐项都不同。它与 fetalheartsounddata 最接近——同为胎心音、同为孕晚期、同在 PhysioNet——但那一份没有母体对照录音,也没有双胎病例,单段时长是分钟级而非秒级。
6.2 检索路径
如果使用者的需求是「找胎心音数据」,正确的检索顺序不是从某个库名出发,而是从需求出发:
| 你的关键词 | 会先命中 | 该不该继续 | 理由 |
|---|---|---|---|
| 胎心音 | 本库、IIScFHSDB、FPCGDB | 三者都看 | 三者互补而非替代 |
| 母体对照 | 本库 | 停在这里 | 其余胎心音库基本没有 |
| 双胎 | 本库 | 停在这里,但注意设计 | 七例,分开录 |
| 逐拍标注 | CirCor | 转过去 | 本库无标注 |
| 早孕期 | NInFEA | 转过去 | 本库集中在孕晚期 |
| 直接真值 | adfecgdb | 转过去 | 本库无任何真值 |
| 多导联分离 | nifecgdb | 转过去 | 本库单通道 |
6.3 与 ephnogram 的边界
库内另有一篇写设拉子大学同一位作者 Reza Sameni 参与的心电与心音同步采集库(ephnogram)。两者同源、同城、有共同作者,容易被混为一谈,但用途分工很清楚。
| 维度 | 本篇(SUFHSDB) | ephnogram |
|---|---|---|
| 受试者 | 孕妇 | 一般受试者 |
| 是否孕期 | 是 | 否 |
| 模态 | 心音单模态 | 心电与心音同步 |
| 胎儿成分 | 是 | 无 |
| 用途 | 胎心音分离与提取 | 心电心音联合分析 |
| 共同点 | 同一课题组、同一座城市 | — |
一句话:ephnogram 研究的是「一颗心同时发出的电与声」,本篇研究的是「两颗心的声叠在一起怎么分」。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评这份库之前,要先校正一个容易发生的误判:把「没有标注」读成「质量差」。 这两件事在数据集评价里经常被混为一谈,但它们是两个正交的维度。标注是产品属性——有没有人替你把答案写下来;质量是原料属性——信号本身干不干净、采集条件稳不稳、元数据全不全。
一份没有标注但信号干净、元数据齐、来源单一的库,作为原料是合格的;一份标注齐全但采集混乱的库,作为原料反而不可信。对 SUFHSDB 的评价必须落在原料这一侧:它有没有给出足够稳定的录音条件、足够清楚的来源、足够完整的身份信息。逐拍标签的缺席是设计选择,不是质量缺陷——2015 年前后这一领域的通行做法就是只发波形,让算法研究者自己建标注。
7.1 五维评分
| 维度 | 评分 | 依据 |
|---|---|---|
| 规模 | 中下 | 一百一十九段、约三小时,够验证不够训练 |
| 信号质量 | 中上 | 16 位、过采样、设备专业,但探位未记录 |
| 元数据完整度 | 中 | 身份与产科字段齐,病史与 CTG 有选择性缺失 |
| 覆盖广度 | 中 | 单中心、单一族群、孕晚期为主 |
| 可用性 | 中上 | 平铺目录、WAV 通用、许可宽松、体量小 |
五项里最难判断的是「信号质量」。它不是没有依据——十六位量化、十六千赫兹过采样、专业听诊器、贴在下腹部——但它也不是可以打高分的依据:探头方位没有记录,录音环境的噪声水平没有描述,也没有任何质量分级。所以只能给中上,而不是高。
7.1b DAIMS 就绪度逐项核对
DAIMS 是一套把数据集的「可被机器正确理解」拆成若干条目的自评框架。用它逐项过一遍,能看出这份库在哪些环节已经就绪、哪些只是「有但没写清」。
| DAIMS 条目 | 就绪状态 | 依据 |
|---|---|---|
| 数据集有稳定标识 | 就绪 | DOI 与 RRID 均已分配 |
| 许可明确 | 就绪 | ODC-BY 1.0,文件内附许可文本 |
| 文件可批量获取 | 就绪 | ZIP、递归 wget、S3 匿名三条路 |
| 记录清单可解析 | 就绪 | RECORDS 一行一名,可机械解析 |
| 完整性可校验 | 就绪 | SHA256SUMS.txt 覆盖全部文件 |
| 字段有字典 | 部分 | Excel 列名为自然语言,无单位与类型说明 |
| 缺失值有标注 | 缺 | 病史与 CTG 的缺值既无标记也无说明 |
| 单位与标度有定义 | 部分 | 采样率与位深明确,幅度无物理单位 |
| 标注可机器读取 | 缺 | 无任何标注文件 |
| 版本可追溯 | 就绪 | 1.0.0 与 1.0.1 均可单独访问 |
十项里六项就绪、两项部分、两项缺。缺的两项恰好是最影响自动化流水线的:没有标注文件,标注相关的训练任务无法启动;缺失值没有标记,读表时用的是「猜」而不是「读」。
补上这两项的成本其实不高——给 Excel 加一列缺失枚举、给每段配一份占位的标注文件即可,但官方没有做,而这属于 2017 年那代数据的普遍状态,不必苛责。
7.2 三条真正影响使用的问题
问题一,配对不完整。 一百一十九段胎儿录音,只有九十二段母体录音,来自九十一名母亲。也就是说至少有一部分胎儿录音没有同人的母体对照。想做「逐人配对验证」的分析,分母要按配对后的数量算。
问题二,时长短且不一致。 平均九十秒是官方口径,但逐条时长并不相同。短的可能只有几十秒,做需要长时稳定的算法(例如基于长窗频谱的估计)时会不够用。
问题三,编号与人群关系不透明。 双胎的两个胎儿对应哪两个后缀,官方没说;重复录制的两条记录是不是同一次检查,官方也没说。这在使用 -1、-2 后缀时会造成歧义。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 单中心偏差 | 全部来自哈菲兹医院 | 设备与操作习惯单一,不能代表其他医院 |
| 族群偏差 | 全部伊朗设拉子人群 | BMI 均值 29.2,高于许多欧美队列 |
| 孕期偏差 | 集中在孕晚期 | 早孕期胎心音形态无法覆盖 |
| 设备偏差 | 单一型号数字听诊器 | 换设备后频响与噪声特性都会变 |
| 探位偏差 | 只记「下腹部」 | 无法复现最优听诊位置 |
| 选择偏差 | 病史与 CTG「如有」 | 有与没有本身可能与病情相关 |
| 双胎偏差 | 仅七例、分开录 | 双胎同录场景缺失 |
第七行是这个库最结构性的缺口。双胎监护的临床难点恰恰在于两个胎心同时到达探头;而这里的设计是把它们分开,让每一段只面对一个胎儿。这提高了单段的可用性,却让「双胎分离」这个真正的难题在库内没有对应样本。
7.4 外部验证矩阵
| 外部证据 | 说了什么 | 对本库的意义 |
|---|---|---|
| 原始会议论文(2015) | 提出单通道盲源分离做胎心音提取 | 库是为验证该方法而攒的 |
| PhysioNet 项目页 | 规模、设备、格式、许可 | 一手口径 |
| 1.0.1 版发行说明 | 补入 CTG 十秒均值 | 唯一的「参考真值」来源 |
| 下游论文的引用方式 | 多作为真实录音对照集 | 定位已在实践中固化 |
| 与 ephnogram 的共同作者 | 同组、同城、同期 | 采集能力一致,可互为背景 |
矩阵里最值得记住的是第一行与第四行。原始论文决定了这批录音的用途——它不是为「通用胎心音库」而录,而是为一个具体方法而录;下游的引用方式则说明这个用途在十年里没有被改写。
7.5 它为何能持续:一个具体方法所需的原料,长期不会过期
很多小数据集会因为「被更大的库取代」而失去存在意义,这份库不会,原因是它的价值锚在一个具体方法上:单通道盲源分离需要「混合信号 + 母体对照」这一对材料,而这一对材料在整个 PhysioNet 的胎心音库里几乎只有它有。库再大、标注再全,只要没录过同一名母亲的单独心音,就替代不了它。
加上许可宽松、体量小、格式通用这三点,它的维护成本几乎为零,被引用的路径也很短——想找胎心音对照材料的人,搜索几个关键词就会落到这里。
§8 生态位与历史
8.1 从一篇会议论文到一份公开数据
这条线的时间顺序很清楚。2015 年,Sameni 与 Samieinasab 在伊朗电气工程会议上提出用单通道盲源分离做胎心音提取,论文里需要一个能验证方法的真实材料。2017 年 7 月,这批录音以 1.0.0 版上线 PhysioNet。2021 年 1 月,1.0.1 版补入了部分受试者的 CTG 参考心率。
| 时间 | 事件 | 版本 | 影响 |
|---|---|---|---|
| 2015 | 方法论文发表 | — | 确定了数据的用途 |
| 2017-07-19 | 首次上线 | 1.0.0 | 九十二段母体、一百一十九段胎儿定型 |
| 2021-01-07 | 许可文件更新 | — | 与 1.0.1 同步提交 |
| 2021-01-08 | 补入 CTG 均值 | 1.0.1 | 有了唯一的外部参考心率 |
8.2 在 PhysioNet 胎心类资源里的位置
PhysioNet 上的胎心类资源可以按「物理量」分成三支:心电(如 nifecgdb、adfecgdb)、心音(本库、IIScFHSDB、FPCGDB)、多模态(NInFEA)。心音这一支里,按采集年代排,本库处在中间偏后的位置;按是否带母体对照排,它是唯一的第一名。
| 分支 | 代表 | 强项 | 弱项 |
|---|---|---|---|
| 胎心电 | nifecgdb、adfecgdb | 有直接真值(后者) | 电极要求高、孕妇依从性差 |
| 胎心音 | 本库、IIScFHSDB、FPCGDB | 无创、设备便宜 | 干扰复杂、无真值 |
| 多模态 | NInFEA | 电声同步 | 早孕期、样本少 |
这个分法解释了为什么心音路线值得投人:它的临床优势在于可以做成便携、低成本的家庭监护设备;而它的技术难点恰恰是这份库要面对的——母体干扰无法靠电极规避,只能靠算法。
8.3 它在方法学上的位置
盲源分离用在胎心音上,核心假设是「胎心、母心、噪声在某种变换域里是可分的稀疏成分」。这份库的价值在于让这个假设可以被检验:有母体对照,就能看分离出的母心成分是否与真实母心一致;有双胎,就能看两段录音的节律是否真的不同。
| 方法类别 | 对数据的要求 | 本库能否满足 |
|---|---|---|
| 单通道盲源分离 | 真实混合 + 可比对的成分 | 多数对可满足 |
| 自适应滤波 | 参考通道 | 母体录音可作参考 |
| 经验模态分解 | 长段稳定信号 | 九十秒够用 |
| 非负矩阵分解 | 大量同类样本 | 一百多段偏少 |
| 深度学习分割 | 逐拍标注 | 不满足 |
8.4 它常被谁引用
按下游用法归类,这份库主要出现在三类工作里:胎心音分离与提取的方法论文、便携胎心监护设备的可行性研究、以及生理信号课程的教学材料。三类用法对它的要求完全不同——第一类要的是对照,第二类要的是真实场景,第三类要的是易读。
| 使用者类型 | 主要取用 | 关注点 |
|---|---|---|
| 方法研究者 | 全部胎儿段 + 母体对照 | 分母是否够、是否可分训练测试 |
| 设备工程师 | 若干段代表性录音 | 噪声水平与真实场景接近度 |
| 教学者 | 少量短段 | 文件能否整包拷走 |
8.5 与另两份胎心音库的分工该怎么摆
同一个需求「我要研究胎心音」,库内有三份可供选择。它们不是版本关系,而是三种不同的采集哲学,选错一份,后面所有努力都要返工。
IIScFHSDB 走的是「长、清、少」的路线。 六十名孕妇,每人一段数分钟的录音,采样率两千赫兹,设备是电子听诊器,记录的是医院条件下最干净的那一类信号。它适合做「胎心音到底长什么样」的形态学研究,也适合做需要长时间稳定观察的节律分析;不适合做「在复杂干扰下能不能提取」的鲁棒性测试,因为干扰本身就少。
FPCGDB 走的是「短、粗、老」的路线。 二十六段,八位量化,三百三十三赫兹,采样率低到只够看心音的主体频段。它的定位是给模拟器做校准用的原料,不是给算法做训练用的样本。拿它测现代算法,分数会被量化噪声压住,测出来的差距不代表算法之间的差距。
本篇走的是「中人、配对、双胎」的路线。 一百零九名孕妇、一百一十九段、九十秒一段、十六位、十六千赫兹,再加上母体对照与七例双胎。它的强项不在信号本身有多干净,而在于「同一名孕妇的两种心音都在」这个结构。
| 你的研究问题 | 该选哪一份 | 为什么 |
|---|---|---|
| 胎心音的形态学描述 | IIScFHSDB | 单段长、干扰少 |
| 校准合成信号 | FPCGDB | 就是为此而录 |
| 单通道分离与母体抑制 | 本篇 | 唯一带母体对照 |
| 双胎场景的初步观察 | 本篇 | 唯一有双胎 |
| 需要逐拍真值的评测 | 都不选 | 三份都没有标注 |
这张表的最后一行是重点。三份胎心音库在「有无标注」上是一致的,都只有波形。所以真正的选择不在于「谁有标注」,而在于「谁的结构更贴合你的问题」。如果你的问题恰好是分离,本篇是唯一解;如果问题在别处,本篇只是三选一里最普通的那一个。
8.6 采集年代留下的印记
2015 年前后的生理信号采集有一个共同特征:设备正在从模拟走向数字,但软件工具链还停留在「能录下来就行」的阶段。这份库的痕迹很清楚:Audacity 录音、WAV 落盘、Excel 手工整理、事后补一份 WFDB 头文件。
| 印记 | 表现 | 今天的做法 |
|---|---|---|
| 录音软件 | Audacity 直接录 | 专用采集软件带元数据 |
| 时间戳 | 无 | 每段带精确起止时刻 |
| 探头位置 | 只写「下腹部」 | 四点象限或图像定位 |
| 设备参数 | 只给频响范围 | 完整设备型号与固件版本 |
| 临床变量 | 手工 Excel | 结构化 CRF 或 FHIR |
| 标注 | 无 | 至少给事件级时间戳 |
这些印记不是缺点,而是时代坐标。理解了这一点,就不会用今天的数据治理标准去要求它——它已经把那个年代能做到的事情做全了:给每段配头文件、给全库配校验和、给临床变量配表格、给许可配文本文件。这些做法在 2017 年的小体量数据库里并不是标配。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 常见错误 |
|---|---|---|---|
| 算法研究者 | 读 RECORDS 建立索引 |
按受试者划分训练测试 | 按记录划分导致同人跨集 |
| 设备工程师 | 挑五到十段画包络 | 与自采数据对比噪声 | 忽略探位未记录这一事实 |
| 教学者 | 整包下载 | 用 §9.2 的脚本读入 | 忘了 WAV 无需 WFDB 也能读 |
第二行里「按受试者划分」这条最容易被跳过,后果也最直接:同一名孕妇的两段录音若一段进了训练集、一段进了测试集,报告的指标会明显偏高,而偏差来源在结果里看不出来。
9.2 一条最短的可用流程
从下载到画出第一张包络图,大约只需要下面几步。
#-- 1. 取数据
aws s3 sync --no-sign-request \
s3://physionet-open/sufhsdb/1.0.1/ ./sufhsdb
#-- 2. 校验
cd sufhsdb && sha256sum -c SHA256SUMS.txt | grep -v ': OK$' ; cd ..
#-- 3. 看清单
head -5 sufhsdb/RECORDS
import wfdb
import numpy as np
import matplotlib.pyplot as plt
#-- 4. 读一段(以 §4.2 的案例 f17 起手)
rec = wfdb.rdrecord("sufhsdb/f17-1", physical=True)
fs, x = rec.fs, rec.p_signal[:, 0]
#-- 5. 五十毫秒滑动平均包络
w = int(0.05 * fs)
env = np.convolve(np.abs(x), np.ones(w) / w, mode="same")
t = np.arange(len(env)) / fs
#-- 6. 画图
plt.figure(figsize=(12, 3))
plt.plot(t, env, lw=0.6, color="#2d6a8f")
plt.xlabel("time (s)")
plt.tight_layout()
plt.savefig("f17-1_env.png", dpi=150)
print(round(len(x) / fs, 1), round(float(env.max()), 3))
跑通之后,把 f17-1 换成 f17-2 与 m17,三段并排看,就能直观体会 §4.2 的案例里说的「三者共有的节律成分」。
9.3 引用方式
PhysioNet 页面要求引用三处:数据集本身、2015 年的会议论文、以及平台论文。
Sameni, R., & Samieinasab, M. (2021).
Shiraz University Fetal Heart Sounds Database (version 1.0.1).
PhysioNet. RRID:SCR_007345.
https://doi.org/10.13026/42eg-8e59
Samieinasab, M., & Sameni, R. (2015).
Fetal phonocardiogram extraction using single channel
blind source separation. 23rd Iranian Conference on
Electrical Engineering, Tehran, 78-83.
https://doi.org/10.1109/IranianCEE.2015.7146186
第三处是 PhysioNet 平台的通用引用,写法参见官方页面的 Citation 区块。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 内容来源 | 官方项目页、数据说明页、发行说明、会议论文 |
| 数字口径 | 一律以官方页面为准,不另做统计 |
| 未核实项 | 逐条时长分布、病史与 CTG 的非空比例 |
| 合成内容 | 无,示例编号取自真实清单 |
| 代码样例 | 依据公开 API 写法,可运行 |
| 医学判断 | 不涉及诊断建议 |
| 更新时点 | 2026 年 10 月 |
| 纠错渠道 | 千方医数集编辑部 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 这是胎心电数据库 | 是心音,PCG 不是 ECG | 全名 Fetal Heart Sounds |
| 一百一十九名孕妇 | 一百零九名孕妇,一百一十九段记录 | 官方摘要 |
| 双胎是同时录的 | 按胎位分两次录 | 官方 Data Description |
| 带逐拍胎心率 | 只有十秒窗口均值 | 1.0.1 发行说明 |
| 母体录音人人都有 | 九十二段,覆盖九十一名母亲 | 官方摘要 |
| 采样率都是 16 千赫兹 | 少数为 44.1 千赫兹 | 官方摘要 |
| 每段都是九十秒整 | 平均九十秒,逐条不等 | 官方用「平均」二字 |
| 孕周覆盖全孕期 | 集中在孕晚期 | 摘要未给早孕样本 |
| 糖尿病等病史齐全 | 自由文本,「如有」才填 | 官方字段说明 |
| 就是 ephnogram 的孕期版 | 两者模态与用途都不同 | 见 §6.3 |
FAQ
问:SUFHSDB 是心电还是心音? 答:心音。全称是 Shiraz University Fetal Heart Sounds Database,记录的是数字听诊器拾取的声音波形。库内没有 QRS 波群,拿它验证胎心电提取算法会无从下手。
问:里面的 CTG 心率能当胎心率真值吗? 答:只能当粗对照。官方写的是「十秒窗口的平均心率」,供参考用。十秒平均抹平了逐拍变化,评分逐拍误差时会严重失真。
问:双胎那七例能用来做双胎分离吗? 答:能看「双胎录音长什么样」,不能当分离评测集。七例都是按胎位分别采两次,不是同一次录音收进两路胎心。
问:为什么会有 f102 和 f102-1? 答:后缀表示同一受试者的追加或重复录制,官方按两条独立记录计。因此一百零九人对应一百一十九段。
问:许可允许商用吗? 答:ODC-BY 1.0 只要求署名,不限用途。商用与再分发都可以,但必须保留归属并指向原始出处。
问:能直接读成 WFDB 记录吗? 答:可以,每段 WAV 配了一份 .hea。但 WAV 本身就能用标准音频库读,两条路径样本一致。
问:母体录音和胎儿录音能一一配对吗? 答:不能保证。九十二段母体对一百一十九段胎儿,至少有一部分胎儿段没有同人母体对照。
问:为什么不给逐拍标注? 答:这是那个年代的通行做法。逐拍标注成本高、一致性难保证,多数胎心音库选择只发波形,让算法侧自建真值。
问:孕周是整数还是区间? 答:表内为整数周。官方只给了总体年龄与 BMI 的均值与范围,孕周的范围未在摘要中给出。
问:数据量能撑深度学习吗? 答:按今天的标准不够。约三小时单通道,做验证够用,做训练偏少,做预训练勉强。
问:1.0.0 和 1.0.1 差什么? 答:1.0.1 往 Excel 表里补了部分受试者的 CTG 十秒均值,信号文件本身没有变化。
问:为什么叫 SU? 答:SU 指 Shiraz University,即设拉子大学;FHS 指 Fetal Heart Sounds。合起来是设拉子大学胎心音库。
术语表
| 术语 | 英文 | 含义 |
|---|---|---|
| 胎心音图 | phonocardiogram, PCG | 记录心音的波形 |
| S1 | first heart sound | 房室瓣关闭产生的第一心音 |
| S2 | second heart sound | 半月瓣关闭产生的第二心音 |
| 胎心率 | fetal heart rate, FHR | 单位时间的胎心搏动次数 |
| 单通道盲源分离 | single channel blind source separation | 从一路混合信号中分离多个源 |
| 经验模态分解 | empirical mode decomposition | 把信号分解为若干本征模态函数 |
| 非负矩阵分解 | non-negative matrix factorization | 用非负矩阵乘积近似原矩阵 |
| 胎心监护 | cardiotocography, CTG | 同步记录胎心率与宫缩 |
| 数字听诊器 | digital stethoscope | 可录制的电子听诊设备 |
| 宽频模式 | wide-band mode | 设备保留较宽通带的采集模式 |
| 孕周 | gestational week | 从末次月经起算的周数 |
| 体质指数 | body mass index, BMI | 体重除以身高平方 |
| 孕次 | gravidity | 怀孕次数 |
| 产次 | parity | 分娩次数 |
| 双胎 | twin pregnancy | 一次妊娠两个胎儿 |
| 头文件 | header, .hea | WFDB 格式的描述文件 |
| 采样率 | sampling rate | 每秒采样点数 |
| 量化位深 | bit depth | 每个样本的比特数 |
| 包络 | envelope | 信号的幅度轮廓 |
| 奈奎斯特频率 | Nyquist frequency | 可表示的最高频率,为采样率之半 |
| 探头 | transducer | 拾取振动的部件 |
| 谱减 | spectral subtraction | 用噪声谱估计减去噪声 |
| 胎位 | fetal presentation | 胎儿在子宫内的朝向 |
| 归属署名 | attribution | 许可要求的来源标注 |
| 开放数据共享许可 | Open Data Commons | 面向数据的开放许可族 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者数 | 一百零九名孕妇 | 官方摘要 | 一手 |
| 胎儿记录数 | 一百一十九段 | 官方摘要 | 一手 |
| 母体记录数 | 九十二段 | 官方摘要 | 一手 |
| 录母体的母亲数 | 九十一名 | 官方摘要 | 一手 |
| 双胎例数 | 七例 | 官方摘要 | 一手 |
| 平均单段时长 | 约九十秒 | 官方摘要 | 一手 |
| 采样率 | 16 千赫兹为主 | 官方摘要 | 一手 |
| 位深 | 16 位 | 官方摘要 | 一手 |
| 频响 | 20 赫兹至 1 千赫兹 | 官方摘要 | 一手 |
| 年龄范围 | 16 至 47 岁 | 官方摘要 | 一手 |
| 年龄均值 | 29.3 岁 | 官方摘要 | 一手 |
| BMI 范围 | 19.5 至 38.9 | 官方摘要 | 一手 |
| BMI 均值 | 29.2 | 官方摘要 | 一手 |
| 解压体积 | 789.3 MB | 文件列表 | 一手 |
| 压缩体积 | 632.6 MB | 官方页面 | 一手 |
| Excel 表体积 | 18.7 KB | 文件列表 | 一手 |
| DOI | 10.13026/42eg-8e59 | 官方页面 | 一手 |
| 首次上线 | 2017-07-19 | 版本历史 | 一手 |
| 当前版本日期 | 2021-01-08 | 版本历史 | 一手 |
| 累计时长(折算) | 约三小时 | 记录数乘均长 | 推算 |
附录 B:数字的来源分层
| 层级 | 含义 | 本库中的例子 |
|---|---|---|
| 官方页面 | 项目页、数据说明、发行说明 | 记录数、采样率、受试者统计、体积、DOI |
| 论文摘要 | 会议论文与平台论文 | 方法动机、单通道分离的定位 |
| 推算 | 由一手数字换算 | 累计时长、预估字节数 |
| 未核实 | 官方未给、本篇未统计 | 逐条时长分布、病史非空比例、CTG 覆盖人数 |
最后一行的三项是使用者接手后第一件该自己数的事。它们不难数,但数出来的结果只对当前版本成立,不适合写进对外的说明书。
附录 C:完整参考文献
| 编号 | 文献 | 链接 |
|---|---|---|
| R1 | Sameni & Samieinasab, PhysioNet 数据集 1.0.1 | doi:10.13026/42eg-8e59 |
| R2 | Samieinasab & Sameni, 伊朗电气工程会议 2015 | doi:10.1109/IranianCEE.2015.7146186 |
| R3 | PhysioNet 平台论文 | doi:10.1038/s44360-026-00096-z |
| R4 | 许可条款 ODC-BY 1.0 | opendatacommons.org/licenses/by/1-0/ |
| R5 | 数据集项目页 | physionet.org/content/sufhsdb/ |
| R6 | 1.0.0 版页面 | physionet.org/content/sufhsdb/1.0.0/ |
附录 D:任务代码
| 你要做的事 | 用哪一节 | 关键函数 |
|---|---|---|
| 下载全量 | §5.1 | aws s3 sync |
| 校验完整性 | §5.3 | sha256sum -c |
| 建立索引 | §5.2 | RECORDS 解析 |
| 读一段波形 | §5.4 | wfdb.rdrecord |
| 画包络 | §5.4、§9.2 | np.convolve |
| 接临床表 | §5.5 | pandas.read_excel |
| 母体对照比对 | §4.2 | 三段并排包络 |
附录 E:如果只记五件事
| 序 | 一句话 |
|---|---|
| 一 | 它是伊朗设拉子大学的胎心音库,一百零九名孕妇、一百一十九段胎儿录音、九十二段母体录音 |
| 二 | 独特之处是有母体对照和双胎病例,这在 PhysioNet 的胎心音库里几乎独一份 |
| 三 | 没有逐拍标注,CTG 心率只是十秒均值,不能当真值 |
| 四 | 双胎是分两次录的,不是同时录的,做不了双胎分离评测 |
| 五 | 许可宽松、体量小、格式通用,做算法验证与教学都合适 |
编辑说明
本篇依据 PhysioNet 项目页、数据说明页、1.0.1 版发行说明与 2015 年会议论文写成。所有规模与结构数字均出自官方页面,不做二次统计。逐条时长、病史非空比例、CTG 覆盖人数三项官方未给,本篇也未统计,列为未核实项。若后续版本新增字段,以官方页面为准。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- coswara — 共享标签:生理信号 / 公共卫生与流行病学
- minute-level-step-count-nhanes — 共享标签:生理信号 / 公共卫生与流行病学
- mdvr-kcl — 共享标签:生理信号 / 公共卫生与流行病学
- b2ai-voice-pediatric — 共享标签:生理信号 / 公共卫生与流行病学
- treadmill-exercise-cardioresp — 共享标签:生理信号 / 公共卫生与流行病学
- sex-differences-hearing-loss — 共享标签:生理信号 / 公共卫生与流行病学
- code-15 — 共享标签:生理信号 / 公共卫生与流行病学
- ohhr-hearing — 共享标签:生理信号 / 公共卫生与流行病学
- cps-dataset-sleep — 共享标签:生理信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

