信息速览
耳朵能被动地听见声音,也能主动地发出声音。前者是声波推动基底膜、毛细胞放电、听神经同步发放的一整条链条;后者是耳蜗外毛细胞在受刺激时自己产生的微弱振动,会反向经中耳传到耳道里,被一支灵敏的麦克风拾到。这两件事发生在同一个瞬间,却分属两套完全不同的生理机制,一个是神经电活动,一个是机械振动。
earndb 把这两套机制按在同一个时间轴上录了下来。八名听力正常的受试者坐进隔声且电屏蔽的检查室,额部、耳后乳突三点贴电极,一只耳朵接受短纯音刺激,强度从本人的听阈开始,每档加五分贝,一直加到一百分贝的峰等效声压级。每一次刺激,脑干反应与耳声发射被同时记进两条通道;刺激结束后,同一个人再用两套心理声学程序,把同一个声音的主观响度打分打出来。
于是这份数据里同时躺着三样东西:神经怎么反应、耳蜗怎么振动、本人觉得多响。公开渠道里能把这三样对齐到同一个人、同一强度、同一时刻的库极少,这也是它体量不大却一直被引用的原因。代价是它只有八个人、两个频率、一个实验室。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Evoked Auditory Responses in Normals |
| 常用简称 | earndb(PhysioNet 项目短名) |
| 发布方 | PhysioNet(PhysioBank 项目) |
| 采集与贡献 | Northeastern University,Ikaro Silva 与 Michael Epstein |
| 首次发布 | 2011 年 2 月 3 日,版本 1.0.0 |
| 受试者 | 8 名(编号 N1–N8),听力正常 |
| 刺激 | 1 kHz 与 4 kHz 短纯音 |
| 强度范围 | 各自听阈起,5 dB 步进,至 100 dB peSPL |
| 记录通道 | 2 条:听觉脑干反应(nV)与耳声发射(V) |
| 采样与精度 | 48 kHz,24 位有效精度 |
| 单试次窗长 | 2002 采样点(约 41.7 毫秒) |
| 呈现速率 | 约 24 Hz |
| 记录总数 | 2,552 条(465 条平均、2,087 条原始) |
| 未压缩体积 | 56.9 GB |
| 文件格式 | WFDB:.hea 头文件、.dat 信号、.trg 注释 |
| 许可 | ODC-BY 1.0,免注册 |
| 典型用途 | 客观响度估计、ABR 波形分析、单试次信噪比方法、助听器验配算法 |
§1 它要解决的具体麻烦
1.1 响度是主观量,而验配需要客观数
助听器要做的事,本质上是把声音放大到"刚好够响但不吵"的位置。这个位置因人而异,而唯一的权威裁判是使用者本人的耳朵。临床上因此发展出一整套心理声学测量:给一串强度递增的声音,让人判断"有多响",或者让他在一个跨模态量表上做匹配。这类方法有效,但有一个绕不开的前提——受试者必须听得懂任务、坐得住、答得稳。
这个前提把一大群人排除在外。新生儿做听力筛查时只会哭;重度认知障碍者无法完成量表;术中监测的患者处于麻醉状态;鉴定场景里还存在夸大或隐瞒听力损失的动机。这些场合需要另一种测量:不问本人,直接读他的神经与耳蜗在做什么。
听觉脑干反应就是这样一个读数。给一个短声,听神经到脑干下丘的同步放电会在十毫秒内形成一串可辨认的波,波幅与潜伏期随刺激强度单调变化。耳声发射是另一个读数,反映耳蜗外毛细胞的主动放大机制是否完好。两者都能在头皮或耳道里被动拾取,不需要受试者配合。
问题是,读数要变成"他觉得多响",中间需要一个映射。这个映射不能靠推理,只能靠标定:在同一批人身上,同时拿到生理反应与主观评分,让模型去学两者的对应关系。earndb 提供的正是这份标定材料,而且把两条生理通路和一套主观量表放在同一个坐标系里。
这也是它为什么把刺激设计成从阈值往上逐档加五分贝。心理声学里的响度增长函数是一条幂函数曲线,低强度段平缓、高强度段陡升,只有在足够多的强度档位上取点,才能把这条曲线的形状估出来。数据库里每个受试者、每个频率都有一条完整的强度阶梯,正是为此。
1.2 三条常见的错误期待
第一条,期待它是"大规模听觉数据集"。它的全部受试者是八个人。任何以人数换性能的思路在这里都会立刻失效,模型几轮就能把这八个人的波形记熟。它属于标定集,不属于训练集,这个定位上的差别决定了后面所有的用法。
第二条,期待它有临床标签。它的头文件里有一个 Condition 字段,取值是 Normal;没有听力图、没有纯音阈值表、没有病史、没有影像、没有随访。想用它做"听力损失分级"或"疾病分类",会发现根本没有标签列。
第三条,期待它是"干净的单试次波形"。平均文件确实干净,但那是几千个试次加权平均之后的结果,一条记录只剩一个窗长;原始文件保留了单试次,代价是每条记录是连续数十秒的整段,试次边界要靠注释文件还原。把平均文件当作单试次来训练,是最常见也最致命的一种误用。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 生理反应与主观响度的配对样本 | 同一人、同一强度下,ABR、OAE 与两套响度评分齐备 | 够,这是它最核心的价值 |
| 单试次信噪比估计方法验证 | 原始记录保留单试次,注释给出试次起点 | 够,且样本量以千计 |
| 听觉脑干反应波形形态研究 | 双通道、24 位、48 kHz,波峰细节保留完整 | 够,分辨率高于多数同类库 |
| 训练一个泛化的听力损失分类器 | 八名正常听力者,无病例组 | 不够,连二分类都构不成 |
| 频率特异性研究 | 只有 1 kHz 与 4 kHz 两档 | 勉强,只能做两个点的对照 |
| 人群常模或百分位参考 | 无人口学分布,官方未公布年龄性别汇总 | 不够,不能当参考值用 |
| 跨设备或跨中心泛化 | 单一实验室、单一放大器与声卡 | 不够,无法拆分设备效应 |
| 新生儿筛查算法开发 | 成人数据,无新生儿 | 不够,只能做方法学预研 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做客观响度估计,苦于找不到"生理 + 主观"的配对金标准 | 提供同一刺激下的双通路反应与两套主观评分,可直接当监督信号 | 先用平均文件建立基线映射,再用原始文件评估单试次条件下的退化 |
| 你在研究单试次诱发电位提取,需要长段连续记录做算法对比 | 原始记录是连续数十秒整段,注释标出每个试次起点,接近在线场景 | 按受试者划分训练与测试,避免同一人的相邻试次跨集 |
| 你在做助听器验配算法,想验证"压缩比是否该随强度变化" | 逐档强度的反应曲线可以直接对应压缩拐点 | 先确认 dB 口径为 peSPL,再与临床 dB HL 做校准换算 |
| 你在教听力学,需要一个能同时展示神经与耳蜗反应的例子 | 同一时刻两条通道,适合讲两条通路的先后与形态差异 | 用 §2.3 的读取流程导出图,注意平均文件只有一个窗长 |
| 你在评估某篇 ABR 特征提取论文的可复现性 | 数据公开、体量可控、方法论文与数据同源 | 先复现论文的预处理,再逐条核对头文件里的噪声指标 |
| 你的项目需要大样本,但想先做可行性验证 | 八个人足以验证管线是否跑通,且下载可只取单条 | 先用单条记录打通读取与绘图,再决定是否下全量 |
1.5 一句话判断
它是一把标尺,不是一堆积木:八个刻度足够校准"生理反应到主观响度"这段距离,却完全不够搭出一座能泛化的模型。
1.6 不适合谁:四条边界
不适合当训练集的人。 如果你的目标是提升某个听觉任务的绝对性能,八名受试者提供的信息量撑不起任何深度模型。它更合适的角色是外部验证、标定、或者方法学的试点。
不适合做人群推断的人。 官方没有公布年龄与性别的汇总分布,受试者是自述听力正常的成年人,且经过筛选。用它估计"普通人听觉脑干反应长什么样",样本量与抽样方式都不支持。
不适合做临床诊断研究的人。 没有病例组、没有听力图、没有诊断结论。头文件里的 Condition 字段取值为 Normal,这意味着一件事:它连"异常长什么样"都没有示范过。
不适合复现采集条件的人。 放大器型号、声卡型号、电极位置、屏蔽室条件都写得很清楚,但那是十多年前的一套特定设备链。想在新设备上重放同样的信噪比,需要重新做一整套校准,官方没有提供校准文件。
§2 数据构成与规格
2.1 一棵两层目录,两种记录
数据库在 PhysioNet 上的顶层结构非常扁平:一个 average/ 目录放平均记录,一个 raw/ 目录按受试者再分八个子目录,另外还有 sources/ 放示例程序,以及 RECORDS、ANNOTATORS、SHA256SUMS.txt 三个清单文件。
earndb/1.0.0/
├── average/
│ ├── ave_bck/ #-- 仅含 .hea 的备份头文件目录
│ ├── N1_LoudnessData_F1.txt #-- N1 在 1 kHz 的主观响度表
│ ├── N1_LoudnessData_F4.txt
│ ├── N1_evoked_ave50_F1_R1.dat #-- 平均信号
│ ├── N1_evoked_ave50_F1_R1.hea #-- 平均头文件
│ └── ... #-- 其余受试者与强度组合同构
├── raw/
│ ├── N1/ #-- 受试者 N1 的全部原始记录
│ │ ├── N1_evoked_raw_50_F1_R1.dat
│ │ ├── N1_evoked_raw_50_F1_R1.hea
│ │ └── N1_evoked_raw_50_F1_R1.trg
│ └── N2/ ... N8/
├── sources/
│ └── average.c #-- 官方示例:按注释做非加权平均
├── ANNOTATORS
├── RECORDS
└── SHA256SUMS.txt
命名规则把一条记录的全部条件都编码进了文件名,这是这份数据最省事也最容易被忽略的设计。N1_evoked_ave50_F1_R1 读作:受试者一号、平均族、强度 50 dB peSPL、频率 1 kHz、第 1 次重复。raw 族的同名记录则把 ave 换成 raw,并多一个 .trg。
两族的拼写并不对称:平均族写作 ave50,强度紧跟其后不加下划线;原始族写作 raw_50,中间多一个下划线。批量拼路径时若按其中一族的样子去推另一族,文件名会对不上,这是脚本里最容易出现的第一个空返回。
需要注意的是 ave_bck/ 这个目录。它按字面像是"备份的平均数据",实际里面只有 .hea 头文件,没有 .dat 信号,条数与 average/ 下的平均记录一一对应。把它当作额外数据来统计,会得到一份虚高的记录数。
各文件后缀的职责如下表。
| 后缀 | 类型 | 内容 | 谁有 |
|---|---|---|---|
.hea |
纯文本 | 采样率、通道数、每通道增益与单位、注释行 | 全部记录 |
.dat |
二进制 | 交错的 24 位采样点 | 全部记录 |
.trg |
二进制 | 注释流,T 标注试次起点 |
仅原始记录 |
.txt |
纯文本 | 强度与两套主观响度值,三列 | 每位受试者每频率一份 |
2.2 字段与记录的完整字典
WFDB 的头文件是一种行式声明格式。第一行描述记录整体,随后每通道一行,末行可以是若干以 ## 开头的自由注释。下表把这份数据里实际出现的字段逐个拆开。
| 字段 | 出现位置 | 含义 | 这份数据里的取值示例 |
|---|---|---|---|
| 记录名 | 头文件第 1 行第 1 列 | WFDB 记录标识,通常与文件名同 | N1_evoked_ave50_F1_R1 |
| 通道数 | 第 1 行第 2 列 | 信号条数,正常为 2,单通道记录为 1 | 2 |
| 采样率 | 第 1 行第 3 列 | 每秒采样点数 | 48000 |
| 采样点数 | 第 1 行第 4 列 | 该记录的样本长度 | 平均 2002,原始 2074112 |
| 信号文件名 | 通道行第 1 列 | 指向 .dat |
N1_evoked_ave50_F1_R1.dat |
| 存储格式 | 通道行第 2 列 | WFDB 格式码,24 位为 32 | 32 |
| 增益 | 通道行第 3 列 | 每单位物理量对应的数字量,括号内为基线 | 5.9483e-011/nV |
| 单位 | 通道行第 3 列斜杠后 | 物理单位,用于区分两条通路 | nV(脑干反应)、V(耳声发射) |
| ADC 分辨率 | 通道行第 4 列 | ADC 位数,0 表示未注明 | 32 |
| ADC 零点 | 通道行第 5 列 | ADC 零对应的数字量 | 0 |
| 初始值 | 通道行第 6 列 | 首个采样点的数字值 | 0 |
| 校验和 | 通道行第 7 列 | 采样点校验和,0 表示未写 | 0 |
| 块大小 | 通道行第 8 列 | 分块长度,0 表示不分块 | 0 |
| 通道描述 | 通道行末列 | 人读的通道名 | ABR、OAE |
| SPL | ## 注释 |
刺激强度,单位 dB peSPL | <SPL>: 50 |
| 刺激频率 | ## 注释 |
短纯音的频率 | <Stim Freq (kHz)>: 1 |
| 耳别 | ## 注释 |
刺激呈现侧 | <Ear>: r |
| 试次数 | ## 注释(仅平均) |
参与本次平均的试次总数 | <Total Trials Used>: 4019 |
| 加权信噪比 | ## 注释(仅平均) |
估计的加权信噪比 | <wnsfmp>: 1.2031 |
| 残余噪声 | ## 注释(仅平均) |
估计的残余噪声水平 | <residual noise level>: 1.4687 |
| 试次窗长 | ## 注释(仅原始) |
单试次采样点数 | <Trial Length (samples)>: 2002 |
| 条件 | ## 注释 |
采集条件或分组 | <Condition>: Normal |
这张表里有两处需要特别说明。
一是单位即身份。两条通道的单位不同,脑干反应用纳伏,耳声发射用伏,相差九个数量级。当某条记录只剩一个通道时,头文件不会另写说明,只留下单位;看单位就能判断剩下的是哪一条。这是官方明确给出的判据,比看文件名后缀更可靠。
二是注释字段因族而异。平均记录带试次数、加权信噪比与残余噪声,原始记录带试次窗长。想在一张表里同时对齐两族的指标,需要先做一次字段补齐,缺失的留空,不能当作零。
2.3 一条记录的完整解剖
取平均族里的一条:受试者 N1、强度 50 dB peSPL、频率 1 kHz、第一次重复。它的头文件只有四行,信息密度却很高。
N1_evoked_ave50_F1_R1 2 48000 2002
N1_evoked_ave50_F1_R1.dat 32 5.9483e-011/nV 32 0 0 0 0 ABR
N1_evoked_ave50_F1_R1.dat 32 0.00093818/V 32 0 0 0 0 OAE
##<SPL>: 50 <Stim Freq (kHz)>:1 <Ear>: r <Total Trials Used>:4019 <wnsfmp>:1.2031 <residual noise level>: 1.4687 <Condition>: Normal
逐行读:第一行声明这是一条双通道、48 kHz、两千零二个采样点的记录,也就是一个试次窗。第二、三行分别给出脑干反应与耳声发射的增益和单位,两条通道共用同一个 .dat,按采样点交错存放。第四行是注释,七个字段一口气交代了刺激强度、频率、耳别、参与平均的试次数、加权信噪比、残余噪声与条件。
这里出现了一个值得停下来看的数字:四千零一十九个试次。而单条原始记录按四万八千赫兹、每试次两千零二个点计算,长度约四十三秒,只装得下一千零三十六个试次。也就是说,这条平均记录是由同一强度下的多条原始记录合并而成的。合并的具体规则,官方页面没有写,只能靠 .trg 计数去反推。
要把这一条记录取到本地,至少需要 .dat 与 .hea 两个文件,缺一不可。
#-- 只取这一条记录的两个文件,适合先跑通读取流程
BASE=https://physionet.org/files/earndb/1.0.0/average
mkdir -p earn_demo && cd earn_demo
wget -q "${BASE}/N1_evoked_ave50_F1_R1.hea"
wget -q "${BASE}/N1_evoked_ave50_F1_R1.dat"
ls -lh
两个文件加起来不到一兆,读取却需要能解析 24 位的工具。这是它作为 PhysioBank 里首批超过十六位精度的记录所带来的附带条件,后文 §8.2 会展开。
2.4 规模与构成
官方页面给出的总量是未压缩五十六点九吉字节。把清单文件逐行读一遍,可以得到更细的构成。这些数字都来自清单本身,不涉及下载信号。
| 项目 | 数量 | 说明 |
|---|---|---|
| 记录清单行数 | 2,552 | RECORDS 非空行 |
| 其中平均记录 | 465 | average/ 前缀 |
| 其中原始记录 | 2,087 | raw/ 前缀 |
| 单通道记录 | 92 | 记录名以 _x 结尾,占不足两成 |
| 受试者目录 | 8 | raw/N1 至 raw/N8 |
| 平均备份头文件 | 465 | ave_bck/ 内仅 .hea |
| 主观响度表 | 16 | 八人 × 两频率 |
| 示例程序 | 1 | sources/average.c |
| 未压缩体积 | 56.9 GB | 官方页面标注 |
平均记录四百六十五条,原始记录两千零八十七条,两者相加正好是清单行数。这个比例本身就说明了体积的来源:绝大部分字节花在原始段的连续记录上,平均记录只占很小一部分。想快速上手,先取平均族;想做方法学研究,才需要原始族。
单通道记录九十二条分散在两族里。它们的文件名以 _x 结尾,头文件里只剩一条信号。做批量读取时如果按"每条记录两个通道"写死维度,这九十二条会直接抛错,是管线里最早暴露的一个坑。
2.5 与同类生理信号资源的字段差异
把这份数据放到更常见的脑电或语音数据集旁边,字段层面的差异一目了然。
| 维度 | earndb | 临床脑电语料库(如 TUH 系列) | 语音生物标志物库 |
|---|---|---|---|
| 采样率 | 48 kHz | 多为 250–1000 Hz | 16–48 kHz |
| 位深 | 24 位 | 多为 16 位 | 16 或 24 位 |
| 通道数 | 2(ABR 与 OAE) | 19–256 | 1(单声道) |
| 单条时长 | 41.7 毫秒(平均)或数十秒(原始) | 数分钟至数小时 | 数秒至数分钟 |
| 事件标注 | 试次起点(T) |
发作、事件、通道级标注 | 转写、切分、说话人 |
| 临床标签 | 无,仅 Normal | 诊断、发作类型 | 疾病组与对照组 |
| 主观量表 | 有,两套响度评分 | 少见 | 常有自评问卷 |
| 受试者规模 | 8 | 数百至上万 | 数十至数千 |
差异的根源在任务。这份数据要回答的是"一个几十毫秒的窗里,神经和耳蜗各自做了什么",所以它把采样率与位深推到当时的极限,把通道压到最少,把每一次刺激的时间点记得极准。临床脑电要回答的是"几个小时里大脑发生了什么",所以在时间跨度与通道覆盖上做加法,在精度上做减法。
§3 它的身份:两条通路,一次刺激
3.1 听觉脑干反应:十毫秒里的七个波
听觉脑干反应是声音触发后最初十毫秒内出现的一串电位变化。它由听觉神经与脑干各级核团的同步放电叠加而成,在头皮上幅度只有零点几微伏,比背景脑电小一两个数量级,所以必须靠成百上千次重复与平均才能从噪声里浮出来。
这串波形按出现顺序编号,罗马数字一到七,习惯上称为波 I 到波 VII。波 I 来自听神经远端,波 III 与波 V 分别对应耳蜗核与下丘附近的活动,波 V 通常最显著,也是临床判读的主锚点。刺激强度升高时,各波潜伏期缩短、幅度增大,这条单调关系正是"用反应反推强度"的生理基础。
正因为它足够早、足够稳定、且不依赖受试者注意,它成了新生儿听力筛查与术中监测的常规工具。earndb 记录的正是这段窗口,单试次窗长两千零二个采样点,在四万八千赫兹下约四十一毫秒,足够把十个毫秒内的波形完整包住,还留出刺激前后的基线。
需要注意的是,它与常见的脑电事件相关电位不是一回事。事件相关电位的时间尺度在数百毫秒,反映的是皮层层面的认知加工;听觉脑干反应在十毫秒内,反映的是脑干层面的同步性。两者的电极位置、刺激范式、分析窗口都不同,不能混用一套预处理管线。
3.2 耳声发射:耳蜗自己发出的声音
耳声发射是耳蜗外毛细胞主动收缩时产生的机械振动,经听骨链与鼓膜反向传回耳道,用一支微型麦克风就能录到。它的幅度极低,换算成声压大约在负十分贝到二十分贝声压级之间,与人的听阈处于同一量级。
它的临床意义在于独立性。脑干反应测的是神经,耳声发射测的是耳蜗的放大机制,两者可以分离。一个耳蜗受损但听神经完好的耳朵,耳声发射会消失而脑干反应可能仍存在;反过来,听神经病变的患者耳声发射正常而脑干反应异常。这种"一个坏一个好"的组合,正是鉴别诊断的关键线索。
数据库对耳声发射的通道只写了通用名称,没有细分是瞬态诱发、畸变产物还是刺激频率型。从刺激是短纯音这一点推断,最接近瞬态诱发类,但官方页面并未明说,做方法学研究时不宜自行假定具体亚型。
这条通道的单位是伏,与脑干反应的纳伏相差九个数量级。同一个 .dat 里并存两种量纲,读取时如果按单一增益还原,其中一条会完全失真。这是 WFDB 用通道行分别声明增益的原因,也是第一次读这份数据最容易踩的坑。
3.3 为什么必须同步记录
分开录两条通路,技术上完全可行,很多实验室也是这么做的。但分开录会丢掉一样东西:时间对齐的确定性。两次独立采集之间,电极阻抗、受试者状态、环境噪声都在变,任何跨通路的比较都要多承担一层不确定性。
同步记录把这一层不确定性压掉了。同一个刺激触发同一个采集卡,两条通道共享同一个时钟,于是"这一毫秒脑干在放电、那一毫秒耳蜗在振动"变成了一句可以直接验证的话,而不是两次实验之间的推断。
这也解释了为什么刺激要重复几千次。脑干反应淹没在噪声里,耳声发射更微弱,两者都需要平均。把同一强度的试次按前后两半各做一次加权平均,就得到了两条独立的平均波形,两半之间的差异可以直接用来估计残余噪声。
| 设计选择 | 直接后果 | 对使用的意义 |
|---|---|---|
| 双通道同步 | 两条通路共享时钟 | 可做跨通路的时序比较 |
| 48 kHz 采样 | 单试次窗口内有足够采样点 | 波峰定位精度高,适合潜伏期分析 |
| 24 位精度 | 微伏级信号不被量化噪声淹没 | 单试次信噪比优于 16 位记录 |
| 前后两半平均 | 每个强度有两条独立平均 | 可用两半差异估计噪声 |
| 5 dB 步进 | 每个频率有完整强度阶梯 | 可拟合响度增长曲线 |
| 50 微伏剔除 | 去掉明显伪迹试次 | 平均更干净,但削弱高幅成分 |
3.4 与三类近邻资源的身份差别
第一类是临床脑电语料库。它们记录的是自发脑电或长时程监测,通道多、时间长、有诊断标签,适合做发作检测与异常分类。earndb 只有两条通道、每个试次几十毫秒、没有诊断标签,两者在任务上几乎不重叠。
第二类是听觉事件相关电位研究。它们关心的是几百毫秒后的皮层响应,刺激多为纯音序列或语音,分析对象是晚期成分。earndb 的时间窗在十毫秒量级,分析对象是脑干核团的同步性,两者的预处理参数不能互换。
第三类是语音与嗓音生物标志物库。它们记录的是发声行为本身,分析对象是声学特征或构音动作。earndb 记录的是对声音的生理反应,受试者不需要发声。唯一相通的地方是都涉及听觉通路,但一个在输入端,一个在输出端。
§4 质量与特色:一条采集链如何决定信号
4.1 采集链的六个环节
这份数据的质量不是抽象评价,而是由六个具体环节叠加出来的。每一环都写在官方页面上,也都能在头文件或波形里找到对应痕迹。
| 环节 | 具体做法 | 影响 |
|---|---|---|
| 环境 | 隔声且电屏蔽的检查室 | 压掉环境噪声与工频干扰 |
| 电极 | 额部、同侧乳突、对侧乳突三点,酒精擦拭 | 决定脑干反应的导联方式与共模抑制 |
| 放大 | GRASS QP511 四通道交流放大器,增益五万倍 | 把微伏信号抬到声卡可录的量级 |
| 滤波 | 30–3000 Hz 带通 | 去掉低频漂移与高频噪声,也限定了可分析频段 |
| 数字化 | 室外 Lynx Two 声卡,48 kHz,24 位有效精度 | 决定时间与幅度分辨率 |
| 平均 | 前后两半各做加权平均,剔除超过 50 微伏的试次 | 提高信噪比,同时改变幅度分布 |
六个环节里,最值得琢磨的是滤波与剔除这两步。三十赫兹的高通会削掉低频成分,而耳声发射在低频段仍有能量,这意味着两条通道虽然同源,实际可分析的频段并不完全一致。五十微伏的剔除阈值则是一把双刃剑:它去掉了明显的运动伪迹与电极跳变,但也系统性地删掉了幅度最大的试次,对研究单试次幅度分布的课题,这个删失必须写进方法学。
4.2 案例:N1 在 50 dB 的那一对文件
取受试者 N1、频率 1 kHz、强度 50 dB peSPL 这一组,平均族与原始族各有一条记录,正好可以把"平均前"与"平均后"摆在一起看。
平均族那条是 N1_evoked_ave50_F1_R1,头文件注明参与平均的试次为四千零一十九次,加权信噪比一点二,残余噪声一点四七,两个通道各两千零二个采样点。原始族对应的是若干条以 raw 命名、带 .trg 的记录,每条约四十三秒、装一千零三十六个试次。
把两者对照,能看出三件事。第一,平均文件的信噪比高得多,波形平滑,波峰清楚;原始文件里同样的波峰埋得更深,单看一条几乎认不出来。第二,平均文件只剩一个窗长,时间轴从负几十毫秒到正几十毫秒;原始文件是一条连续时间轴,试次之间没有间隙,靠 .trg 里的标注切分。第三,平均文件给了噪声指标,原始文件没有,因为噪声估计是平均过程本身的副产物。
这个案例也解释了 §4.2 的案例为什么值得反复回看:它把这份数据的两族形态压缩在同一个刺激条件上,任何关于"该用哪一族"的疑问,都可以回到这一对上做判断。§5.5 会给出从原始族切出试次并自行平均的代码,跑完之后与官方平均文件对比,是最直接的一次质量校验。
4.3 加权平均与残余噪声
普通平均把每个试次同等看待,加权平均则给噪声小的试次更高权重。官方引用的是 Elberling 与 Wahlgreen 在一九八五年提出的方法,其核心是用试次间的方差估计每个试次的噪声水平,再据此定权。好处是在噪声非平稳的情况下,估计出的波形更接近真实诱发成分。
这份数据把同一强度的试次分成前后两半,各做一次加权平均。这样做的目的不只是"多一条记录",而是给出一个内部的噪声参照:两半之差反映的是残余噪声,两半之和反映的是稳定成分。头文件里的 wnsfmp 与 residual noise level 两个字段,就是这套估计的产物。
对使用者来说,这两个字段的价值在于筛选。做组间比较时,可以按残余噪声分层,把噪声特别高的记录排除或降权;做单试次算法评估时,可以用它们作为难度分层的依据。它们不是标签,但比标签更适合做质量控制。
4.4 响度表怎么读
主观响度以纯文本存放,每位受试者每个频率一份,三列:强度、量值估计、跨模态匹配。下面是一个片段。
10 NaN -0.669534
15 NaN -0.546282
20 NaN -0.546282
25 NaN -0.671033
30 -21.500000 -0.683743
35 -16.814139 -0.147340
40 -8.198970 0.084086
45 -4.439721 0.203489
50 -2.537587 0.461973
第一列是 dB peSPL,第二列是量值估计,第三列是跨模态匹配,后两列都以对数单位记录。低强度段出现的 NaN 不是缺失值事故,而是该强度低于受试者的可测范围,量值估计程序在该档没有得到有效反应。这个细节很重要:如果直接把 NaN 当零填充,整条响度曲线的低端会被拉平,拟合出来的指数会系统性偏小。
两种方法给出的数值尺度不同。量值估计是让受试者给声音的响度赋一个数,跨模态匹配是让他把响度映射到另一个模态(比如线长或握力)上。两者都取对数后,形状应当相近,斜率可以互相校验。数据库同时提供两套,正是为了让使用者能做一致性检查。
4.5 三条硬约束
第一,频段约束。三十到三千赫兹的带通决定了低于三十赫兹的成分不存在,做任何涉及低频振荡的分析都是在分析滤波器的尾巴。第二,通道约束。单通道记录占不足两成,批量处理必须处理维度不齐。第三,时间约束。平均记录只有一个窗长,无法做长时趋势分析;原始记录是连续段,但每条只有数十秒,跨记录拼接会引入刺激序列的相位不连续。
这三条约束都不是缺陷,而是设计选择的必然结果。问题只在于使用者是否在读数据之前就知道它们。§4.2 的案例之所以值得作为第一站,就是因为它同时暴露了这三条约束的具体形态。
§5 怎么把它取到手
5.1 全量与单条,两条路
官方提供三条下载路径:整包 ZIP、命令行递归镜像、以及云端存储工具的批量拉取。整包五十六点九吉字节,解压后体积相近,建议按两倍预留磁盘。如果只是想验证管线,单条记录不足一兆,几秒钟就能下完。
#-- 全量镜像,支持断点续传;先确认磁盘余量
mkdir -p earndb_mirror
wget -r -N -c -np https://physionet.org/files/earndb/1.0.0/ -P ./earndb_mirror
#-- 校验:清单与文件需在同一目录层级下
cd earndb_mirror/physionet.org/files/earndb/1.0.0
sha256sum -c SHA256SUMS.txt 2>/dev/null | grep -v ': OK$'
校验命令最后一步只打印失败项。没有输出,说明全部匹配;有输出,说明下载过程中有文件损坏或被截断,需要重取。官方把校验清单放在项目根目录,而不是分散在各子目录,所以校验必须在镜像后的同级目录里执行,路径错一层就会全部报缺失。
单条下载在 §2.3 已经给过。两种方式得到的文件完全一致,区别只在于时间与空间。做方法学探索时,建议先取平均族里同一个受试者的全部强度档,配合一份响度表,就足以跑通一条完整的分析链。
5.2 先读清单,再决定下什么
RECORDS 是一份纯文本清单,每行一个记录名,带目录前缀。它只有几十千字节,却能回答大部分"要不要下"的问题。
#-- 按族统计,确认清单结构
curl -s https://physionet.org/files/earndb/1.0.0/RECORDS -o RECORDS
awk -F/ '{print $1}' RECORDS | sort | uniq -c
#-- 单通道记录:文件名以 _x 结尾
grep -c '_x$' RECORDS
#-- 某个受试者在某个频率上的全部平均记录
grep '^average/N3_evoked_ave.*_F4_R' RECORDS | sort
清单里的顺序是按记录名排序的结果,不是采集顺序。强度是字符串排序,所以 ave100 会排在 ave10 前面,ave5 排在 ave50 后面。想把强度按数值排好,必须自己拆出数字再排,否则画出来的响度曲线会是一条锯齿。
5.3 不装任何库也能读头文件
头文件是纯文本,标准库就够。写一个小解析器,比装一整套 WFDB 更适合做批量普查。
#-- 解析 WFDB 头文件:首行声明、通道行、## 注释三部分
from pathlib import Path
def read_header(path):
lines = Path(path).read_text().splitlines()
name, nsig, fs, nsamp = lines[0].split()
channels, notes = [], {}
for ln in lines[1:]:
if ln.startswith('##'):
for chunk in ln[2:].split('<')[1:]:
key, val = chunk.split('>', 1)
notes[key.strip()] = val.lstrip(':').strip()
continue
parts = ln.split()
channels.append({
'file': parts[0],
'gain_unit': parts[2],
'unit': parts[2].split('/')[-1],
'desc': parts[-1],
})
return {'name': name, 'nsig': int(nsig), 'fs': int(fs),
'nsamp': int(nsamp), 'channels': channels, 'notes': notes}
h = read_header('N1_evoked_ave50_F1_R1.hea')
print(h['fs'], h['nsamp'], [c['unit'] for c in h['channels']])
print(h['notes']['SPL'], h['notes']['Ear'], h['notes']['Total Trials Used'])
这段代码只依赖标准库,不必解析二进制信号,就能把强度、频率、耳别、试次数与噪声指标整理成一张表。做筛选与分层时,这张表比逐个打开文件高效得多。
5.4 读平均波形
要拿到物理量,就需要按通道增益还原。wfdb 包支持直接从 PhysioNet 读取,不必先下载。
#-- 直接远程读取一条平均记录
import wfdb
import numpy as np
rec = wfdb.rdrecord('average/N1_evoked_ave50_F1_R1', pn_dir='earndb/1.0.0')
print(rec.fs, rec.sig_len, rec.sig_name, rec.units)
print(np.asarray(rec.p_signal).shape)
abr = rec.p_signal[:, rec.sig_name.index('ABR')]
oae = rec.p_signal[:, rec.sig_name.index('OAE')]
t = np.arange(rec.sig_len) / rec.fs * 1000
print('ABR 峰峰值 nV:', np.ptp(abr) * 1e9)
print('OAE 峰峰值 V:', np.ptp(oae))
注意最后两行的单位换算。p_signal 已经按通道各自的增益还原成物理量,两条通道的绝对值相差极大,直接放在同一张图上会让其中一条变成直线。通常做法是各自归一化,或者用双纵轴,并在图注里写清单位。
5.5 从原始段切出试次并自行平均
原始记录的价值在于单试次。切分依据是 .trg 里的 T 标注,它标记试次起点相对于刺激起始的位置。
#-- 用注释切试次,再做一次不剔伪迹的等权平均
import numpy as np
import wfdb
name = 'raw/N1/N1_evoked_raw_50_F1_R1'
rec = wfdb.rdrecord(name, pn_dir='earndb/1.0.0')
ann = wfdb.rdann(name, 'trg', pn_dir='earndb/1.0.0')
pre, post = 200, 1802
onsets = [s for s, sym in zip(ann.sample, ann.symbol) if sym == 'T']
epochs = np.stack([
rec.p_signal[s - pre:s + post, :]
for s in onsets if s >= pre and s + post <= rec.sig_len
])
print('试次数', epochs.shape[0], '窗长', epochs.shape[1])
avg = epochs.mean(axis=0)
half = epochs.shape[0] // 2
resid = epochs[:half].mean(axis=0) - epochs[half:].mean(axis=0)
print('两半之差的标准差:', np.std(resid, axis=0))
这段代码刻意没有加伪迹剔除,与官方示例程序 average.c 的定位一致:先把流程跑通,再谈质量控制。加上五十微伏阈值之后,试次数会减少,平均波形会更平滑,两半之差也会变小,这正是 §4.1 提到的删失效应。
跑完之后,把自行平均的结果与 §4.2 的案例里那对官方文件叠在一起看,是最直接的一次一致性检查。差异应当主要出现在幅度上,因为官方用的是加权平均而非等权;波峰的潜伏期应当基本重合,若不重合,多半是切窗起点差了几个采样点。
5.6 读主观响度表
响度表有个隐蔽的格式问题:分隔符不是制表符,而是字面上的两个字符,斜杠加字母 t;行尾是回车换行。按默认空白切分会得到五列,多出两列垃圾。
#-- 分隔符是字面量 /t,必须用正则切
import numpy as np
import pandas as pd
df = pd.read_csv(
'N1_LoudnessData_F1.txt',
header=None,
sep=r'\s*/t\s*',
names=['dB_peSPL', 'ME', 'CMM'],
engine='python',
)
print(df.head(8))
print('量值估计缺失档位数:', int(df['ME'].isna().sum()))
valid = df.dropna(subset=['ME'])
coef = np.polyfit(valid['dB_peSPL'], valid['ME'], 1)
print('线性拟合斜率:', coef[0])
缺失档位集中在低强度端,含义是"该强度低于可测范围",不是采集失败。做曲线拟合时应当直接丢弃这些行,而不是填零;填零会把低端强行压到同一个水平,改变整条曲线的形状。若要拟合幂函数,还需先确认对数的底数与单位,官方页面只写了"log units",没有说明底数。
5.7 取数时最常撞上的六个错误
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 主头文件 404 | 官方页面写了一个按受试者汇总的主头文件名,1.0.0 目录下取不到 | 只用分记录头文件,汇总信息自行从 RECORDS 构建 |
| 读取报 24 位不支持 | 旧版 WFDB 库只支持 16 位 | 升级到 10.5.0 及以上,或用 wfdb 的 Python 包 |
| 两条通道幅度差九个数量级 | 一条是 nV,一条是 V | 按通道分别归一化,图注写明单位 |
| 批量读取维度报错 | 九十二条记录只有单通道 | 按 nsig 分支处理,或统一补齐为两条并置零 |
| 响度表多出两列 | 分隔符是字面量 /t |
用正则分隔,别用默认空白 |
| 拼出的原始文件名不存在 | 平均族是 ave50,原始族是 raw_50 |
按族分别拼路径,不要互相推导 |
§6 与库内其他资源的关系
6.1 关系图谱
这份数据在库内没有同名或近名的邻居,它的位置由三条轴线决定:模态(听觉诱发反应)、任务(客观响度估计)、形态(短窗双通道)。
| 分组 | 库内代表 | 关系 | 区隔 |
|---|---|---|---|
| 临床脑电语料 | TUH EEG 语料库、TUH 异常脑电语料库、TUH 事件语料库 | 同属神经电生理,均为多通道头皮记录 | 那三者是长时程自发脑电、多通道、有临床判读;这份是十毫秒级诱发反应、双通道、无诊断 |
| 癫痫与发作脑电 | CHB-MIT 头皮脑电、Siena 头皮脑电、TUSZ、Helsinki 新生儿脑电 | 同属脑电信号,可共享部分预处理 | 任务完全不同:那四者做发作检测,这份做刺激-反应关系 |
| 脑机接口与范式脑电 | BCI Competition IV-2a、EEGMMIDB、RSVP 脑电 | 都是"给刺激、看反应"的范式 | 那三者看的是数百毫秒后的皮层成分与分类正确率,这份看的是十毫秒内的脑干同步性 |
| 情绪与认知脑电 | DEAP、DREAMER、HBN-EEG | 同为多模态或长时记录 | 那三者有主观情绪标签与多通道,这份只有强度档位与响度评分 |
| 同系列听障版 | EARH 听障者听觉诱发反应库 | 同一实验范式的姊妹库 | 那份的受试者是听障者、48 kHz 32 位、十秒窗;这份是听力正常人、2002 点短窗,可配对对照但不能混池训练 |
| 其他诱发反应 | PERG-IOBA 图形视网膜电生理 | 最接近的"诱发反应"近亲 | 一个是视网膜电图,一个是耳蜗与脑干反应;采集部位、刺激模态、判读指标都不同 |
| 语音与嗓音 | 萨尔布吕肯嗓音库、PC-GITA、TORGO、UA-Speech、Bridge2AI-Voice | 同属听觉-发声链条 | 那些记录发声行为与声学特征,这份记录对声音的生理反应,受试者不发声 |
| 可穿戴与耳戴 | Auricle 耳戴多模态、SeizeIT2 耳后监测 | 同在耳周采集 | 那些是消费级或可穿戴设备的长期记录,这份是实验室级设备的一次性高精度采集 |
| 噪声主题 | RealNoiseMRI 运动退化脑MRI | 名字里都有噪声,实质无关 | 那是以 MRI 噪声为干扰源的影像挑战赛,与听觉毫无关系 |
真正该并列看的是 EARH。两份刺激同为 1 kHz 与 4 kHz 短纯音,同样同步记录 ABR 与 OAE,区别在受试者——那份是八名感音神经性听障者,各档强度从个人阈值起扫。想建"正常到受损"的对照,两份可配对;但窗长、位深与阈值口径都不同,必须先做单位与增益再标定,不能直接拼接。
值得单独说一句 PERG-IOBA。它是库内少见的另一份"诱发反应"数据:给视觉刺激,记录视网膜产生的电反应。两者在方法论上是一对镜像——都用重复刺激加平均来提取微弱信号,都关心幅度与潜伏期随刺激强度的变化,都要面对"反应幅度能否代表功能状态"这个问题。差别在于一个在眼、一个在耳,一个用图形刺激、一个用短纯音,两者的滤波器设置与伪迹处理不能互换。
6.2 检索路径
| 你要找的东西 | 建议路径 | 说明 |
|---|---|---|
| 生理信号总览 | 按一级标签筛「生理信号」 | 这一层会把脑电、心电、语音、可穿戴都包含进来 |
| 神经电生理 | 叠加二级标签「脑电信号」 | 会把诱发反应与自发脑电放在一起,需要再按任务筛 |
| 诱发反应类 | 关键词「诱发」「诱发电位」「事件相关」 | 这份与视网膜电生理会同时命中 |
| 听觉相关 | 关键词「听觉」「听力」「耳声」 | 库内听觉类资源稀少,命中面窄但精度高 |
| 小样本标定集 | 按受试者数升序,再按是否含主观量表筛 | 这份会浮到前面,同一批还有若干嗓音与问卷类小库 |
| 高采样率波形 | 按采样率降序 | 这份的 48 kHz 在生理信号里属于高位 |
6.3 与三类资源的分工
与临床脑电语料的分工是"短窗对长程"。做发作检测、睡眠分期、异常判读,用临床语料;做刺激锁定的小窗口分析,用这份。两者的预处理管线在滤波与重参考上都不一样,混用会互相拖累。
与脑机接口范式的分工是"皮层对脑干"。范式脑电关心的是几百毫秒后的认知成分,需要被试注意刺激;这份关心的是十毫秒内的同步放电,被试不需要做任何事。前者可以拿来做分类任务,后者更适合做回归与标定。
与语音库的分工是"输入端对输出端"。语音库记录人怎么发声,这份记录人对声音怎么反应。两者唯一的交汇点是听障人群的言语感知研究,但那份工作需要临床分组,而这份没有病例组,接不上。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
读这一节之前,需要先把一个默认框架放下:数据集的价值不等于它的行数。按"样本量越大越好"的尺子量,这份数据会被直接判为不合格——八个人,两个频率,连一个像样的交叉验证都做不了。
这个判断是错位的。它的计量单位不是"人",而是"配对":同一个人、同一强度、同一时刻,生理反应与主观评分同时存在。这样的配对在公开数据里极度稀缺,稀缺到八个人也足以支撑一批方法学论文。误判的根源在于把标定集当成训练集来读,把"能不能泛化"当成唯一标准。
正确的读法是反过来问:这份数据能固定住哪些变量,从而让剩下的那一个变量变得可测。它固定了刺激频率、固定了强度阶梯、固定了采集设备、固定了电极位置,于是在这堆固定条件之上,"反应幅度与主观响度的关系"才第一次成为一个可以被拟合的对象。
7.1 DAIMS 五维评分
按 DAIMS 的常用维度打分,每项一至五分,评分针对"作为听觉诱发反应标定数据"这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 1 | 八名受试者,任何统计推断都缺效力 |
| 标注质量 | 3 | 无人工事件标注,但生理信号本身即监督信号,主观响度由标准程序测得 |
| 任务适配 | 4 | 双通路同步加主观金标准,公开渠道罕见替代品 |
| 文档完整 | 3 | 页面把采集链写得很细,但主头文件取不到、性别年龄字段缺失 |
| 可获取性 | 3 | 免注册、许可宽松,但五十六点九吉字节与 24 位解析门槛抬高成本 |
合计十四分(满分二十五)。分数结构与它的定位一致:规模是硬伤,适配性是长板,文档与获取处于中等。这个分布说明它不适合当主力数据,适合当参照物。
7.2 三条质量线要分开看
第一条是单试次质量。四万八千赫兹、二十四位、五万倍增益,这套配置在二〇一〇年前后属于顶配,单试次的量化噪声很低。但它并不等于单试次信噪比高——脑干反应本身就微弱,单条原始记录里波形依然淹没在背景活动中,需要平均才能显现。
第二条是平均质量。官方给了加权信噪比与残余噪声两个指标,还给了前后两半的独立平均。用两半之差估计噪声,是一个可以在本地复算的量,不必完全信任头文件里的数字。这也是这份数据在方法学上比较扎实的地方:它把质量控制做成了数据的一部分。
第三条是主观质量。量值估计与跨模态匹配是两套独立程序,两者的一致性可以作为主观数据可信度的内部检验。官方没有给出两套评分的相关系数,需要使用者自己算。低强度段的缺失是方法本身的限制,不是操作失误。
7.3 已知的、可枚举的偏差
| 偏差 | 具体表现 | 对结论的影响 |
|---|---|---|
| 样本量偏差 | 八名受试者,且为自述听力正常者 | 任何组间比较都缺统计效力 |
| 选择偏差 | 需能耐受长时间测试并完成心理声学任务 | 排除了儿童、认知障碍者、听力损失者 |
| 单中心偏差 | 一台放大器、一块声卡、一间屏蔽室 | 设备效应无法与生理效应分离 |
| 频率偏差 | 只有 1 kHz 与 4 kHz | 无法刻画频率特异性,低频段完全空白 |
| 强度网格偏差 | 起点为各自阈值,5 dB 步进 | 跨受试者的绝对强度不对齐,只可对齐相对强度 |
| 删失偏差 | 平均时剔除超过 50 微伏的试次 | 高幅试次被系统性删除,幅度分布右尾缺失 |
| 通道偏差 | 不足两成的记录只剩单通道 | 跨通道分析需剔除或插补,样本进一步缩小 |
| 元数据偏差 | 分记录头文件中未见性别与年龄 | 无法做人口学分层,也无法核对官方描述 |
这些偏差里,最容易被低估的是强度网格那一条。每个人的起点不同,意味着"50 dB peSPL"在不同人身上对应不同的相对位置。做跨人平均时,若直接按绝对强度对齐,低强度段的样本会来自不同相对位置,曲线斜率会被抹平。正确做法是先按各自的阈值做平移,再对齐相对强度。
7.4 外部验证矩阵
| 验证对象 | 可用的内部证据 | 结论 |
|---|---|---|
| 主论文的八人结论 | 数据本身即论文数据,受试者数与频率一致 | 可复现 |
| 加权平均算法 | 头文件给了试次数、加权信噪比、残余噪声 | 可复算,但需自行实现权重 |
| 官方示例平均程序 | sources/average.c 明确不做伪迹剔除 |
可编译运行,结果应与等权平均一致 |
| 两套主观量表的一致性 | 同一受试者同一频率有两列评分 | 可自算相关系数,官方未给出 |
| 单通道记录的处理 | 头文件单位可判定剩余通道 | 可逐条核对 |
| 受试者性别与年龄 | 官方页面称头文件含此信息,样本头文件未见 | 无法验证,需向作者索取 |
7.5 它为何能持续:因为它提供的是一种无法替代的配对
公开数据集的生命周期通常取决于两件事:有没有人持续维护,以及有没有替代品。这份数据在这两点上都很特殊。它自二〇一一年上架后基本冻结,只做过清单与校验和的更新,维护成本接近于零;而"同一刺激下脑干反应、耳声发射、主观响度三者对齐"这个组合,至今没有出现规模更大的公开替代。
于是它形成了一个稳定的引用循环:做客观响度估计的人必须引用它,因为它是最直接的标定材料;做单试次提取方法的人也会引用它,因为它的原始段足够长、注释足够准;做听力学教学的人同样会引用它,因为两条通路的对照在一个文件里就能展示。引用带来曝光,曝光带来新的引用,而数据本身不需要再投入。
这不是靠规模活下来的资源,是靠结构活下来的。结构一旦被复制,它的地位就会松动;但在那之前,八个人依然是这条链上唯一的锚点。
§8 生态位与历史
8.1 从博士论文到 PhysioNet
这份数据的源头是一篇博士论文。作者 Ikaro Silva 在 Northeastern University 完成博士研究,主题是用短纯音诱发的听觉反应来客观估计响度增长。围绕这个主题,先有方法学论文讨论如何从非平稳噪声中估计平均后的信噪比,再有参数分析论文讨论如何从耳声发射估计响度,最后是二〇一〇年发表于美国声学学会会刊的主论文,给出了八名听力正常受试者在 1 kHz 与 4 kHz 短纯音下的完整结果。
数据在论文发表后不久被提交到 PhysioBank,二〇一一年二月三日正式上线,版本号 1.0.0。目录时间戳显示,原始数据目录停留在上线当天,示例程序目录更早,而平均目录与校验清单在二〇一九年二月被重新整理过。这说明它经历过一次格式层面的整备,但信号内容没有变。
主论文的摘要把研究目标写得很清楚:建立一套完全客观的流程,从短纯音诱发的脑干反应中分割出特定特征;检验这些特征能否用于估计频率特异性的响度增长函数;以及通过控制残余噪声与参数拟合,能把估计精度提升到什么程度。结论是,这套流程得到的均方误差与标准心理声学程序相当。
8.2 二十四位这件事为什么被反复提起
官方页面里有一句话不太起眼,却很关键:这是 PhysioBank 里第一批分辨率超过十六位的记录。在此之前,公开的生理信号库基本停留在十六位,量化台阶相对粗;二十四位把台阶压细了二百五十六倍,对微伏级的诱发反应意义直接。
代价是兼容性。二十四位样本需要一〇点五版及以上的 WFDB 库才能读取,而这个版本发布于二〇一〇年三月十六日。任何早于此的工具链打开这些文件都会失败,或者更糟——静默地按十六位解读,给出看似合理实则错位的波形。十多年过去,主流工具早已支持,但在一些遗留的临床工程环境里,这个坑依然存在。
这条历史也解释了为什么文件里用格式码三十二而不是常见的十六。格式码与位深绑定,读错格式码往往不会立刻报错,只是从某个采样点开始整体错位。排查这类问题时,第一件事是核对头文件首行的通道数与每通道的格式码,而不是怀疑数据损坏。
8.3 生态位:三类使用者
第一类是听觉与听力学研究者。他们把这份数据当作标定集,用来验证"生理反应能否替代主观评分"这类假设。对他们来说,八个人不是缺点,而是可控:样本小,个体差异可以逐人建模,不必担心群体异质性淹没效应。
第二类是生理信号算法工程师。他们把原始段当作单试次提取的试验场,测试新的去噪、加权、潜伏期估计方法。四万八千赫兹与二十四位给了足够的余量,.trg 注释给了准确的切分依据,两半平均给了内部的噪声参照。
第三类是助听器与耳机算法开发者。他们关心的是压缩特性:小声放大多少、大声压多少,拐点设在哪里。这份数据逐档给出了生理反应,可以作为"压缩曲线是否合理"的一个旁证,虽然它不能替代真人的验配试听。
8.4 为什么没有第二个
一个自然的疑问是:既然这么有用,为什么十几年里没有出现规模更大的同类库。原因大致有三层。
第一层是采集成本。要在同一个人身上同时拿到脑干反应与耳声发射,需要一套能同时满足两种测量的电极与麦克风布置,还需要一间隔声且电屏蔽的检查室。这套硬件不便宜,且需要专门校准。
第二层是主观数据的成本。心理声学测量不是发问卷,一次完整的响度增长曲线要在多个强度档上反复测试,单个受试者往往要坐几个小时。这与"多招人"的方向天然冲突:人越多,总工时越长。
第三层是激励。这类数据的主要用户是方法学研究者,论文引用多,直接商业价值低。大型数据平台更愿意投入有明确下游任务(诊断、筛查、分类)的库,标定类数据因此长期处于"重要但不优先"的位置。
三层叠加,就形成了今天的格局:一份八人的小库,在自己的 niche 里没有对手。
§9 使用指引
9.1 三种角色的路径
| 角色 | 建议入口 | 关键动作 | 常见误区 |
|---|---|---|---|
| 听力学研究者 | 平均族 + 响度表 | 按受试者逐人拟合响度曲线,再做组层面汇总 | 把不同受试者的绝对强度直接平均 |
| 信号算法工程师 | 原始族 + .trg |
先复现等权平均,再加权、再剔伪迹,逐级对比 | 忽略单通道记录导致维度错位 |
| 产品算法开发者 | 平均族 + 强度阶梯 | 用逐档反应拟合压缩拐点,与验配目标对照 | 把 peSPL 当成 dB HL 直接用 |
9.2 一条最短的可用流程
从零到一条可用的曲线,只需要四步:按强度取平均记录、读波形、算峰峰值、画强度-反应曲线。响度表的读法见 §5.6,两条曲线叠在一起才是完整的一次分析。
#-- 最短流程:单受试者、单频率的强度-反应曲线
import numpy as np
import pandas as pd
import wfdb
subject, freq = 'N1', 'F1'
levels = [30, 40, 50, 60, 70, 80, 90, 100]
rows = []
for lv in levels:
name = f'average/{subject}_evoked_ave{lv}_{freq}_R1'
try:
rec = wfdb.rdrecord(name, pn_dir='earndb/1.0.0')
except Exception:
continue
for i, ch in enumerate(rec.sig_name):
rows.append({'level': lv, 'channel': ch,
'ptp': float(np.ptp(rec.p_signal[:, i]))})
curve = pd.DataFrame(rows).pivot(index='level', columns='channel', values='ptp')
print(curve)
这里的 except 不是随手写的容错。每个人的强度阶梯从各自阈值起步,并非每一档都有记录,强度列表必须允许落空。但它同时也会吞掉路径错误:把目录名写错一层,所有请求都会失败,最后得到一张空表,而屏幕上没有一行报错。所以第一次跑时,先把 rows 的长度打印出来,确认它大于零,再去画图。
9.3 引用方式
使用这份数据需要两层署名。数据层面,按 ODC-BY 1.0 的要求注明来源与许可;学术层面,引用官方指定的主论文。
| 场景 | 应引内容 |
|---|---|
| 论文方法节 | Silva I, Epstein M. Estimating loudness growth from tone-burst evoked responses. J Acoust Soc Am. 2010;127(6):3629–3642. doi:10.1121/1.3397457 |
| 数据可用性声明 | 数据来自 PhysioNet earndb v1.0.0,doi:10.13026/C2NP4D,按 ODC-BY 1.0 使用 |
| 二次分发 | 保留 ODC-BY 1.0 许可文本与原始出处链接 |
| 教学材料 | 注明数据来源与采集机构,不得暗示原始作者背书 |
| 商业产品 | 许可允许商用,但须署名;建议同时核对所在司法辖区的数据使用规定 |
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,结构与事实经编辑核对 |
| 数字来源 | 规模、结构、边界三类数字来自 PhysioNet 官方页面与官方清单文件 |
| 文件核验 | RECORDS、示例头文件、响度表、目录清单经直接访问确认 |
| 未下载内容 | 未下载信号体积,未做任何分布统计 |
| 论文信息 | 仅参考 Europe PMC 摘要,未读全文 |
| 未核实内容 | 受试者年龄与性别分布、耳声发射的具体亚型、耳别分布 |
| 图像 | 无配图;封面为生成式提示词,不含真实波形 |
| 免责 | 本文不构成听力学诊断建议;数据使用须遵守 ODC-BY 1.0 署名要求 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是噪声暴露或职业听力损伤数据集 | 它是听力正常者的诱发反应库,与噪声暴露无关 | 官方标题为 Evoked Auditory Responses in Normals,Condition 字段取值为 Normal |
| 八个人,所以只有八条记录 | 八名受试者对应两千五百余条记录 | RECORDS 逐行计数,受试者目录仅八个 |
| 它有听力图与纯音阈值 | 没有,只有以各自阈值为起点的强度阶梯 | 头文件注释字段仅含强度、频率、耳别、试次数、噪声、条件 |
| 平均文件就是原始波形 | 平均文件是数千试次加权平均后的单个窗长 | 平均记录两千零二个采样点,原始记录两百余万采样点 |
记录名以 _x 结尾说明数据损坏 |
只说明一条通道被电伪迹污染后移除 | 官方说明不足两成记录如此,头文件单位可判定剩余通道 |
ave_bck 是额外的平均数据 |
该目录只有头文件,没有信号 | 目录内仅 .hea,条数与平均记录一致 |
响度表里的 NaN 是采集失败 |
表示该强度低于受试者可测范围 | 缺失集中在低强度端,高强度端完整 |
| dB 数值可以直接当听力级用 | 它是 peSPL,不是 dB HL | 官方写明强度单位为 dB peSPL,起点为各自阈值 |
| 可以拿它训练听力损失分类器 | 全部为正常听力者,无病例组 | 无诊断字段,无分组变量 |
| 48 kHz 采样意味着单试次信噪比很高 | 采样率只决定时间分辨率,不决定信噪比 | 原始单试次波形仍淹没在背景活动中,需平均提取 |
FAQ
Q1:earndb 是不是噪声暴露或职业听力损伤数据集?
不是。它是 Evoked Auditory Responses in Normals 的缩写,记录听力正常者在不同刺激强度下的听觉脑干反应与耳声发射,用于研究响度增长的客观估计。没有噪声暴露史、没有职业队列、没有损伤分组。名字里的 earn 与 EARNEST 之类的项目无关。
Q2:只有八个人,为什么还能被反复引用?
因为它稀缺的不是人数,而是配对关系。同一刺激、同一时刻、同一个人身上,既有脑干反应又有耳声发射,还有一整套主观响度评分。它的用途是标定生理反应与主观响度之间的映射,不是训练一个泛化模型。
Q3:平均文件和原始文件有什么本质区别?
原始文件是连续数十秒的双通道记录,单条约一千个试次,试次边界写在 .trg 里;平均文件已经把同一强度的试次按前后两半各做一次加权平均,每条只剩两千零二个采样点。前者保留噪声与单试次变异,后者信噪比高但样本量被压缩成两个。
Q4:头文件里的 dB 是听力级还是声压级?
是 peSPL,即峰等效声压级,以声压峰值为基准,不是临床听力图常用的 dB HL。两者之间差一个换能器与耳耦合方式的校准量,不能直接互换。跨受试者比较时还要注意每个人起点不同,因为起点是各自的阈值。
Q5:记录名末尾的 _x 是坏数据吗?
不是坏数据,是单通道记录。官方说明在不足两成的情况下,其中一条通道被电伪迹严重污染而被整条移除,记录名因此以 _x 结尾。此时头文件里只剩一条信号,看单位就能分辨:单位是 V 的是耳声发射,单位是 nV 的是脑干反应。
Q6:为什么四万八千赫兹还不够,非要用二十四位?
采样率决定时间分辨率,位深决定幅度分辨率,两者解决的是不同问题。脑干反应在头皮上只有零点几微伏,十六位的量化台阶在低增益下会明显吃掉细节。二十四位把台阶压细,使得单试次的弱成分也能被记录下来。
Q7:原始记录一条有多长?
按头文件的采样点数与采样率换算,单条约四十三秒,装一千零三十六个试次。也就是说,一条原始记录已经是数十次刺激的连续累积,不是单次刺激的快照。想只取一个试次,必须用 .trg 注释切。
Q8:官方说的主头文件为什么找不到?
官方页面列出了一个按受试者汇总的主头文件名,但在 1.0.0 项目的平均目录下按该名称请求会返回 404。实际可用的是每条记录各自的头文件。需要的汇总信息可以从 RECORDS 与各分记录头文件重建。
Q9:性别和年龄在哪里?
官方页面称平均记录的头文件注释里标明了性别、耳别与年龄。但抽查的分记录头文件中,注释字段为强度、频率、耳别、试次数、加权信噪比、残余噪声与条件,未见性别与年龄。若要使用人口学信息,需要向作者索取或查阅论文。
Q10:能直接拿它做深度学习吗?
可以训练,但结果没有泛化意义。八个人的波形几轮就会被记住,验证集只要换人就会崩。更合理的用法是把它当外部测试集,或者当标定集去拟合一个低维映射,而不是当训练集去学高维表征。
Q11:为什么响度表要用两种方法测?
量值估计与跨模态匹配是两套独立的心理声学程序,前者让受试者直接给响度赋值,后者把响度映射到另一个模态上。两套结果的一致性可以作为主观数据可信度的内部检验。官方没有给出两者的相关系数,需要自己算。
Q12:许可允许商用吗?
ODC-BY 1.0 允许商用与二次分发,条件是署名。署名应包含数据来源、作者与许可版本。用于产品时还建议核对所在司法辖区对生理数据的规定,许可宽松不等于合规义务清零。
术语表
| 术语 | 含义 |
|---|---|
| ABR | 听觉脑干反应,声音触发后十毫秒内的一串神经电位 |
| OAE | 耳声发射,耳蜗外毛细胞产生的、可被耳道麦克风拾取的微弱振动 |
| 短纯音 | 有明确频率、持续时间较短的声刺激,本库用 1 kHz 与 4 kHz |
| peSPL | 峰等效声压级,以声压峰值为基准的强度单位 |
| dB HL | 听力级,以人群听阈为基准的临床强度单位,与 peSPL 不可直接互换 |
| 听阈 | 受试者能察觉到声音的最小强度,本库以此为强度阶梯起点 |
| 试次 | 一次刺激及其对应的记录窗,本库窗长为两千零二个采样点 |
| 平均 | 把同一条件的多个试次逐点相加再除以次数,用于提高信噪比 |
| 加权平均 | 按各试次噪声水平赋权的平均,噪声小的试次权重更高 |
| 残余噪声 | 平均之后仍留在波形里的噪声成分 |
| wnsfmp | 头文件字段,官方称为估计的加权信噪比 |
| 伪迹剔除 | 丢弃幅度超过阈值的试次,本库阈值为五十微伏 |
| 潜伏期 | 从刺激起点到某个波峰的时间差 |
| 波 V | 听觉脑干反应中最显著的成分,常用于阈值估计 |
| 乳突 | 耳后骨性突起,本库用作反相与地电极位置 |
| 参考电极 | 用于构成差分记录的对照点,本库为同侧乳突 |
| 隔声屏蔽室 | 同时隔绝声学噪声与电磁干扰的检查空间 |
| 呈现率 | 每秒呈现刺激的次数,本库约二十四赫兹 |
| 量值估计 | 让受试者给刺激强度赋数值的心理声学方法 |
| 跨模态匹配 | 让受试者把某一感觉强度映射到另一模态上的方法 |
| 响度增长 | 主观响度随刺激强度上升的曲线,通常呈幂函数形 |
| WFDB | 生理信号存储与交换格式,PhysioNet 长期沿用 |
| 头文件 | .hea,声明采样率、通道、增益、单位与注释 |
| 注释文件 | .trg,记录试次起点等事件位置 |
| 单通道记录 | 一条通道因伪迹被移除后只剩单条信号的记录,名字以 _x 结尾 |
| ODC-BY 1.0 | 开放数据署名许可,允许商用与再分发,要求署名 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者数 | 8 | 官方页面与论文摘要 | 官方 |
| 刺激频率 | 1 kHz 与 4 kHz | 论文摘要,页面以变量形式给出 | 官方 |
| 强度上限 | 100 dB peSPL | 官方页面 | 官方 |
| 强度步进 | 5 dB | 官方页面 | 官方 |
| 采样率 | 48 kHz | 官方页面与头文件 | 官方 |
| 有效位深 | 24 位 | 官方页面 | 官方 |
| 单试次窗长 | 2002 采样点 | 头文件 | 官方 |
| 呈现率 | 约 24 Hz | 官方页面 | 官方 |
| 试次窗时长 | 约 41.7 毫秒 | 由窗长与采样率换算 | 推算 |
| 放大倍数 | 五万倍 | 官方页面 | 官方 |
| 带通范围 | 30–3000 Hz | 官方页面 | 官方 |
| 伪迹阈值 | 50 微伏 | 官方页面 | 官方 |
| 记录总数 | 两千五百五十二 | RECORDS 计数 |
官方清单 |
| 平均记录 | 465 | RECORDS 计数 |
官方清单 |
| 原始记录 | 两千零八十七 | RECORDS 计数 |
官方清单 |
| 单通道记录 | 92 | RECORDS 计数 |
官方清单 |
| 未压缩体积 | 56.9 GB | 官方页面 | 官方 |
| 原始记录采样点 | 2,074,112 | 样本头文件 | 官方 |
| 原始记录时长 | 约 43.2 秒 | 由采样点与采样率换算 | 推算 |
| 许可 | ODC-BY 1.0 | 官方页面 | 官方 |
| DOI | 10.13026/C2NP4D | 官方页面 | 官方 |
附录 B:数字的来源分层
第一层,官方页面直接陈述。 受试者数、刺激频率、强度范围与步进、采样率、位深、放大倍数、带通、伪迹阈值、总体积、许可、DOI、记录命名规则、_x 的含义、二十四位与 WFDB 版本的对应关系。这些数字在页面上写死,可直接引用。
第二层,官方清单与文件内容。 记录总数、平均与原始的分族计数、单通道记录数、原始记录的采样点数、单试次窗长、头文件注释字段、响度表的三列结构与分隔符。这些数字来自官方发布的文件本身,需要打开文件读取,但不涉及下载信号体积。
第三层,由前两层换算。 单试次窗约四十一毫秒、原始记录约四十三秒、单条原始记录约一千个试次。这类数字没有写在页面上,是由采样点数除以采样率得到的,属于算术推导,不作为官方口径引用。
未核实。 受试者的年龄与性别分布、耳别分布、耳声发射的具体亚型、各强度档的实际试次分布、两套主观评分的相关系数。官方页面或未给出,或给出的描述与可取得的文件不一致,本文一律标注为未核实,不做补全。
附录 C:完整参考文献
- Silva I, Epstein M. Estimating loudness growth from tone-burst evoked responses. J Acoust Soc Am. 2010;127(6):3629–3642. doi:10.1121/1.3397457
- Silva I. Estimation of post-average SNR from evoked responses under non-stationary noise. IEEE Trans Biomed Eng. 2009;56(8):2123–2130. doi:10.1109/TBME.2009.2021400
- Epstein M, Silva I. Analysis of parameters for the estimation of loudness from tone-burst otoacoustic emissions. J Acoust Soc Am. 2009;125(6):3855–3864. doi:10.1121/1.3106531
- Da Silva IGA. Objective estimation of loudness growth using tone burst evoked auditory responses. Electrical Engineering Dissertations, Northeastern University; 2009. Paper 23.
- Elberling C, Wahlgreen O. Estimation of auditory brainstem response, ABR, by means of Bayesian inference. Scand Audiol. 1985;14(2):89–96.
- Goldberger A, Amaral L, Glass L, et al. PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals. Circulation. 2000;101(23):e215–e220.
- Pollard T, Moody BE, Lehman L, et al. PhysioNet as a global platform for biomedical research. Nature Health. 2026;1(8):792–795. doi:10.1038/s44360-026-00096-z
- PhysioNet. Evoked Auditory Responses in Normals (earndb) v1.0.0. doi:10.13026/C2NP4D. https://physionet.org/content/earndb/1.0.0/
附录 D:任务代码
从原始段估计单试次信噪比,并按两半平均复算残余噪声。这段代码不依赖官方示例程序,可在本地复现头文件里的两个噪声指标。
#-- 单试次信噪比的两半估计法
import numpy as np
import wfdb
NAME = 'raw/N1/N1_evoked_raw_50_F1_R1'
PRE, POST = 200, 1802
rec = wfdb.rdrecord(NAME, pn_dir='earndb/1.0.0')
ann = wfdb.rdann(NAME, 'trg', pn_dir='earndb/1.0.0')
ch = rec.sig_name.index('ABR')
onsets = [s for s, sym in zip(ann.sample, ann.symbol) if sym == 'T']
epochs = np.stack([
rec.p_signal[s - PRE:s + POST, ch]
for s in onsets if s >= PRE and s + POST <= rec.sig_len
])
half = len(epochs) // 2
m1 = epochs[:half].mean(axis=0)
m2 = epochs[half:].mean(axis=0)
signal_power = np.var((m1 + m2) / 2)
noise_power = np.var((m1 - m2) / 2)
snr_db = 10 * np.log10(signal_power / max(noise_power, 1e-30))
print('试次数', len(epochs), '两半信噪比 dB', round(float(snr_db), 3))
#-- 逐试次能量分布,用于确定伪迹阈值
energy = np.ptp(epochs, axis=1)
for q in (50, 90, 99):
print(f'峰峰值 {q} 分位 nV:', round(float(np.percentile(energy, q) * 1e9), 2))
这段代码输出的信噪比与头文件里的 wnsfmp 不会完全相等,因为官方用的是加权平均,这里用的是等权平均。两者量级应当接近;若相差一个数量级,先检查是否读错了通道,或者试次起点是否偏移。
附录 E:如果只记五件事
- 这份数据是八名听力正常者的听觉诱发反应库,不是噪声暴露数据集,与职业听力损伤无关。
- 每次刺激同时记录两条通道:脑干反应(nV)与耳声发射(V),另附两套主观响度评分。
- 采样四万八千赫兹、有效二十四位,是 PhysioBank 里第一批超过十六位的记录,读它需要一〇点五版以上的 WFDB 库。
- 记录分平均与原始两族:平均族每条只有一个试次窗,原始族是连续数十秒整段,切试次要靠
.trg注释。 - 它的价值在配对而不在规模,适合标定与验证,不适合当训练集。
编辑说明
核验时间:二〇二六年十月二十八日。核验方式:直接访问 PhysioNet 项目页与文件目录,读取 RECORDS、SHA256SUMS.txt、示例头文件与响度表;论文信息取自 Europe PMC 摘要。未下载信号体积,未做任何分布统计。官方页面所述受试者性别与年龄字段、以及按受试者汇总的主头文件,在可取得的文件中未能确认,已在正文与附录中标明。封面为生成式提示词,不含真实波形。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- earh — 共享标签:生理信号 / 脑电信号 / 神经科学
- openneuro — 共享标签:生理信号 / 脑电信号 / 神经科学
- siena-scalp-eeg — 共享标签:生理信号 / 脑电信号 / 神经科学
- eeg-power-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
- ltrsvp — 共享标签:生理信号 / 脑电信号 / 神经科学
- ibl-brain-wide-map — 共享标签:生理信号 / 脑电信号 / 神经科学
- spikeinterface — 共享标签:生理信号 / 脑电信号 / 神经科学
- erpbci — 共享标签:生理信号 / 脑电信号 / 神经科学
- eegmat — 共享标签:生理信号 / 脑电信号 / 神经科学
- mssvepdb — 共享标签:生理信号 / 脑电信号 / 神经科学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

