一次声音,两种回声 — earndb 听觉诱发反应库

8 名听力正常者 / 48 kHz 24 位 / ABR 与 OAE 同步

来源 https://physionet.org/content/earndb/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 12
一次声音,两种回声 — earndb 听觉诱发反应库

信息速览

数据集名称一次声音,两种回声 — earndb 听觉诱发反应库
数据类型时序信号,波形,元数据
规模8 名受试者 / 2,552 条记录
接入方式https://physionet.org/content/earndb/1.0.0/
AI 就绪度

耳朵能被动地听见声音,也能主动地发出声音。前者是声波推动基底膜、毛细胞放电、听神经同步发放的一整条链条;后者是耳蜗外毛细胞在受刺激时自己产生的微弱振动,会反向经中耳传到耳道里,被一支灵敏的麦克风拾到。这两件事发生在同一个瞬间,却分属两套完全不同的生理机制,一个是神经电活动,一个是机械振动。

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:完整参考文献

  1. 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
  2. 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
  3. 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
  4. Da Silva IGA. Objective estimation of loudness growth using tone burst evoked auditory responses. Electrical Engineering Dissertations, Northeastern University; 2009. Paper 23.
  5. Elberling C, Wahlgreen O. Estimation of auditory brainstem response, ABR, by means of Bayesian inference. Scand Audiol. 1985;14(2):89–96.
  6. 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.
  7. 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
  8. 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:如果只记五件事

  1. 这份数据是八名听力正常者的听觉诱发反应库,不是噪声暴露数据集,与职业听力损伤无关。
  2. 每次刺激同时记录两条通道:脑干反应(nV)与耳声发射(V),另附两套主观响度评分。
  3. 采样四万八千赫兹、有效二十四位,是 PhysioBank 里第一批超过十六位的记录,读它需要一〇点五版以上的 WFDB 库。
  4. 记录分平均与原始两族:平均族每条只有一个试次窗,原始族是连续数十秒整段,切试次要靠 .trg 注释。
  5. 它的价值在配对而不在规模,适合标定与验证,不适合当训练集。

编辑说明

核验时间:二〇二六年十月二十八日。核验方式:直接访问 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 — 共享标签:生理信号 / 脑电信号 / 神经科学

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

返回 AI-Ready 数据集