听得见不等于听得响 — EARH 听障者听觉诱发反应库

8 名听障者 / 577 条记录 / ABR 与耳声发射

来源 https://physionet.org/content/earh/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 11
听得见不等于听得响 — EARH 听障者听觉诱发反应库

信息速览

数据集名称听得见不等于听得响 — EARH 听障者听觉诱发反应库
数据类型时序信号,波形,元数据,文献引用
规模8 名受试者 / 577 条记录
接入方式https://physionet.org/content/earh/1.0.0/
AI 就绪度

纯音听力图量的是一个门槛:声音要多响,你才刚能听见。它不回答下一个问题——过了门槛之后,声音再响一点,你感觉到的响度涨得多快。两个门槛都是 50 dB HL 的人,一个在 70 dB 时只觉得有点吵,另一个已经捂耳朵;这是重振,感音神经性听力损失里最常见的现象,也是助听器验配最想知道、却最难测准的一件事。

测响度只能靠人自己报。跨感觉强度匹配、响度量表、自适应追迹,都要受试者听得懂指令、坐得住、给得出稳定判断,老人、幼儿、无法交流的人一概做不了。于是有了另一条路:用耳朵自己发出来的声与电去反推。耳声发射来自耳蜗外毛细胞的主动运动,听性脑干反应来自听神经与脑干核团的同步放电,两者都随刺激强度系统变化,理论上都能承载响度增长的信息。

EARH 就是这条路走通之前留下的原始材料:八名听障者、两个频率、从各自阈值下方一直扫到 100 dB peSPL,每一档都同步录下刺激标记、脑干反应与耳声发射,并把逐档的响度曲线一并公开。它小得不像训练集,却几乎没有替代品。一屏速览见下表。

维度 内容
全名 Evoked Auditory Responses in Hearing Impaired
常用代号 EARH(目录名 earh,v1.0.0)
发布方 PhysioNet 托管;数据由美国波士顿东北大学采集
贡献者 Ikaro Silva(后任职 MIT),合作者 Michael Epstein
首次上线 2017 年 9 月 26 日,版本 1.0.0,此后未再改版
受试者 8 名(4 女 4 男),官方称 40–85 岁,元数据最高 87 岁
听力状况 临床确诊听力损失,至少一个倍频程阈值高于 25 dB HL(250 Hz–8 kHz)
测试耳 每人只测较好耳:3 人左耳、5 人右耳
刺激 1 kHz(4 毫秒)与 4 kHz(1 毫秒)短纯音,高斯窗加权后补静音至 41.7 毫秒
强度范围 官方称自阈值下方 5 dB 起、每 5 dB 一档、至 100 dB peSPL;清单实际起点有出入,见 §2.4
重复次数 每档 4 次
记录条数 577 条(1 kHz 369 条、4 kHz 208 条)
通道 3 条:刺激标记、ABR(毫伏)、OAE(伏)
采样与字长 48 kHz,32 位整数,单条 2022144 采样点(约 42.1 秒)
文件格式 WFDB:同名 .hea 与 .dat,按受试者分八个子目录
附属文件 受试者元数据 1 个、逐档响度曲线 8 个
体积与许可 未压缩约 13 GB;ODC-BY 1.0,无需注册

§1 它要解决的具体麻烦

1.1 门槛与斜率是两件事

听力学把听力损失拆成至少两个可分离的量。第一个是敏感度,也就是阈值抬高了是事实,用纯音听阈就能测,几分钟出结果,全世界的诊所都在做。第二个是响度增长,即阈上强度每加一分贝,主观响度增加多少。这两个量在正常耳里大致同步:阈值正常,响度曲线也正常,从听阈到不适阈大约有一百 dB 的可用动态范围。

感音神经性损失打破了这个同步。耳蜗外毛细胞受损之后,阈值抬高,同时压缩机制失效,响度在阈值之上迅速攀升,可听动态范围从一百 dB 缩到三四十 dB 甚至更窄。这就是重振。它的临床后果非常具体:助听器如果把所有声音线性放大,低声压级的声音仍然听不见,而中等声压级的声音已经让人难受,患者于是把助听器放进抽屉。现代验配公式之所以要对不同频率、不同输入强度做压缩,正是为了对付这条斜率。

问题在于,斜率没有仪器能直接读出来。阈值可以靠"听见了没有"来测,斜率必须靠"有多响"来测,而后者是一个纯粹的主观量。成人可以配合,儿童、认知障碍者、失语者不行;即便是成人,跨感觉强度匹配的组内变异也很大,测一次要半小时以上,临床上很难常规开展。这就留下了缺口:有没有可能从电生理或声学信号里,把这条斜率估出来?

EARH 就是为回答这个问题而采集的。论文的标题写得很直白:听障者响度增长的客观估计。数据集不是论文的副产品,而是论文第三个目标的一部分——作者明确把"提供一套覆盖宽强度范围的生理与心理物理反应公开数据"写进了研究目的。

1.2 三条常见的错误期待

第一条,以为它是一份听力图数据库。它不是。它每个受试者只有两个频率的阈值,而且单位是峰值等效声压级,测的是与实验中完全相同的短纯音,不是临床上那种持续一两秒的纯音。想拿它做"听力损失的流行病学描述"或者"阈值预测"的人,会发现自己手里只有八个点。

第二条,以为它是可以拿来训练的大库。577 条记录听上去不少,但它们是八个受试者乘以若干强度档乘以四次重复。同一个人相邻强度档的信号相关性极高,同一次重复与另一次重复之间几乎是同一个生理状态。把 577 当作样本量,等于把一次测量重复数了四遍。

第三条,以为 ABR 通道里存的是平均好的波形。不是。每条记录是约 42 秒的连续采样,脑干反应的原始电压与刺激标记并排躺着,平均这一步留给你自己做。这个设计其实是优点——你可以选择叠加多少个扫次,从而研究平均次数与估计质量的关系,而这恰好是论文关心的问题;但它要求你先学会从触发通道切段。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
同一受试者在同一强度上的脑干反应与耳声发射对照 两条通道同步采样、共用同一刺激与同一探头 够,这是它最稀缺的一点
阈值附近的反应是否存在 刺激从各人阈值或其下方一档起扫 大体够,但各人起点不统一,须逐条核对
响度增长的心理物理参照 每人一个频率的逐档响度曲线文件 部分够,列含义官方未定义
训练一个跨受试者泛化的模型 8 人,人均十余档,每档四次 不够,只能做留一受试者验证
与正常听力人群对照 本库无正常对照,需另取姊妹库 earndb 不够,得两个库一起下
逐扫次的事件标注 只有 Trigger 通道,无注释文件 需自行推断扫次边界
临床病史、影像、用药与验配结果 只有年龄、性别、两个频率的阈值 给不到
耳声发射的可检出率统计 官方未公布,需自行逐条判断 官方未公布

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

你的处境 它能帮你什么 下一步该做什么
你在做"从电生理信号估计主观响度"的方法验证,缺一套带心理物理真值的数据 同一批刺激下既有原始波形又有人工报告的响度曲线,真值与输入严格对齐 先用 1 kHz 条件跑通,因为论文自己说 1 kHz 的吻合度更好
你在评估耳声发射在中重度损失耳上的可用性 阈值跨度从 35 到 70 dB peSPL,正好覆盖耳声发射从可检出到消失的区间 先看 Trigger 后的时窗内是否有高于噪声底的瞬态,再决定是否纳入
你要做 ABR 的少扫次快速估计 原始连续记录允许你自由选择叠加多少个扫次 用前 N 个扫次做学习曲线,把残余噪声一起记下来
你在教听力学,需要讲清 peSPL 与 dB HL 的区别 官方页面把刺激生成、加窗、校准链写得极细 用 §2.3 的头文件做课堂演示,让学生自己算一遍换算
你想验证一个自动判读 ABR 波形的算法 8 人、两频率、多强度档,波形形态覆盖阈值上下的过渡 做留一受试者交叉验证,报告每一折的个体差异而非均值
你在为助听器验配寻找压缩比的生理依据 逐档响度曲线可以直接读出压缩斜率 注意曲线只覆盖可测区间,低强度段缺失

1.5 一句话判断

它的价值不在于"有多少条",而在于"同一只耳朵、同一个声音、同时被两种方式记录下来"——把主观响度与客观反应钉在同一根强度轴上,这件事在公开数据里几乎找不到第二份。

1.6 不适合谁:四条边界

不适合做规模训练的人。 八名受试者意味着任何以受试者为单位的划分都只有八折,且每折的测试集只有一个样本。深度模型在这种规模上得到的每一个"提升"都更可能是对个体的记忆。

不适合做临床阈值推断的人。 它给的是 dB peSPL 口径的短纯音阈值,与听力图的 dB HL 之间没有固定的换算常数,因为换算依赖换能器、耦合腔与刺激时长。拿它训练出的模型去读临床听力图,会引入一层无法校准的系统偏差。

不适合做耳蜗机制研究的人。 耳声发射通道里确实有耳蜗的信息,但记录用的是临床探头而非科研级耦合腔,且没有记录刺激的精确波形回采,无法做精细的时频反演。

不适合需要人群多样性的人。 八个人全部来自波士顿一个听力中心,年龄集中在 57 到 87 岁,全部是感音神经性损失。没有传导性损失、没有儿童、没有单侧聋、没有人工耳蜗使用者。

§2 数据构成与规格

2.1 一条记录是三条并排的通道

每条记录用 WFDB 格式存放,两个文件:.hea 是纯文本头文件,.dat 是二进制信号本体。头文件第二行起每行描述一条通道,本库固定三条:Trigger、ABR、OAE。三条通道共用同一个采样时钟,48 kHz,因此任何一个时刻在三条通道上指的是同一个物理瞬间。

这个安排决定了它的用法。Trigger 是一条方波或脉冲序列,标出每一次刺激给出的时刻;ABR 是头皮电极拾取的远场电位,单位毫伏,幅度在亚微伏到几微伏量级;OAE 是探头内传声器拾取的耳道声压,单位伏,承载的是耳蜗外毛细胞产生的、经中耳反向传回耳道的声信号。前者的时间尺度是十毫秒,后者是二十毫秒,两者被放在同一根时间轴上。

为什么是 48 kHz 而不是更低?脑干反应的有效带宽大约到 3 kHz,10 kHz 采样就够;耳声发射不同,短纯音激发的瞬态成分可以延伸到 10 kHz 以上,要保住高频细节就得留足采样率。48 kHz 是声卡的原生速率,作者没有做重采样,省掉了一层插值误差。代价是体积:单条记录约 24.3 MB,全库加起来十几 GB。

2.2 字段与记录的完整字典

先看文件名的五个段位。这是本库最重要的结构信息,因为它承担了本该由数据库表承担的职责。

段位 形式 含义 取值范围
目录 h1 至 h8 受试者编号,与元数据表的 Listener 列对应 8 个目录
第 1 段 h 加数字 受试者编号 h1–h8
第 2 段 l 或 r 测试耳,l 为左、r 为右 每人固定一个
第 3 段 1kHz 或 4kHz 刺激频率,注意带 kHz 后缀 2 种
第 4 段 整数 刺激强度,单位 dB peSPL 30–100
第 5 段 1 至 4 该条件下的重复序号 4 次

再看头文件里的字段。以 h1_l_1kHz_100_1.hea 为例,逐行拆开:

行 原文片段 含义 注意点
1 h1_l_1kHz_100_1 3 48000 2022144 记录名、通道数 3、采样率 48 kHz、每通道采样点 2022144 2022144 除以 48000 得 42.128 秒
2 ... 32 41943040(0)/NU 0 0 0 31113 0 Trigger 格式 32 位、增益 41943040、单位无量纲、初值与校验和 标记通道的增益无物理意义
3 ... 32 41943040(0)/mV 0 0 0 -7682 0 ABR 同上,单位毫伏 换算物理量须除以增益
4 ... 32 83886080(0)/V 0 0 0 28059 0 OAE 同上,单位伏,增益为两倍 换算时不能套用 ABR 的增益
5 # Age: 87 年龄 与元数据表可能不一致
6 # Sex: M 性别 只有这两条注释

三条通道的增益不同,这一点很容易被忽略。用 WFDB 的物理量接口读取时,库会按各自增益换算,得到毫伏与伏;如果图省事直接读数字量,ABR 与 OAE 的幅度就落在两个完全不同的数量级上,任何跨通道的比较都会失效。

元数据文件只有九行(一行表头加八行数据),六列:

列名 含义 取值示例 备注
Listener 受试者编号 h1 与目录名一致
Age 年龄 87 h1 的年龄,官方正文写的是 40–85
Gender 性别 male / female 四男四女
EAR 测试耳 left / right 三人左、五人右
Threshold(1kHz) 1 kHz 阈值 50 单位 dB peSPL
Threshold(4kHz) 4 kHz 阈值 NaN 或 60 三人为 NaN

响度曲线文件共八个,命名形如 H1_LoudnessData_F1.txt,其中 F 后的数字是频率(F1 表示 1 kHz,F4 表示 4 kHz)。每个文件若干行、四列,逗号分隔:

列位 内容 观察 官方说明
1 声压级 整数,dB SPL,逐档递增 官方称其为声压级
2 未知数值 随强度升高由负转正 未命名
3 未知数值 量级多在零点零几,像标准误 未命名
4 未知数值 总体上升,局部有回落,跨度较大 未命名

后三列官方页面只说"估计的响度曲线函数",没有给列名与量纲。以 h7 的 4 kHz 文件为例,第一行是 40,NaN,NaN,0.6911,最后一行是 100,0.92074,0.016634,1.806,中间每 5 dB 一行。第二、三列在个别行上完全相同(例如 45,0.050172,0.050172,0.9155 与 50,0,0,0.97356),第一行又是前两列缺、第四列有;这种形态不像两个独立的估计量,更像有构造关系的几个量。但这只是对两个文件的观察,不足以支撑命名,实际使用时应把它们当作匿名数值,先做归一化再说。

2.3 一条记录的完整解剖

取 h1/h1_l_1kHz_100_1 这一条:受试者 h1,左耳,1 kHz,100 dB peSPL,第一次重复。它是全库强度上限的那一档,也是信噪比最好的一档,适合拿来做第一次跑通。

头文件共六行,前四行是数据行,原文如下:

h1_l_1kHz_100_1 3 48000 2022144
h1_l_1kHz_100_1.dat 32 41943040(0)/NU 0 0 0 31113 0 Trigger
h1_l_1kHz_100_1.dat 32 41943040(0)/mV 0 0 0 -7682 0 ABR
h1_l_1kHz_100_1.dat 32 83886080(0)/V 0 0 0 28059 0 OAE

第一行给出四个数。第二个数 3 是通道数,第三个数 48000 是采样率,第四个数 2022144 是每通道的采样点总数。2022144 除以 48000 等于 42.128 秒,这就是一条记录的物理时长。三个通道交错存放在同一个 .dat 里,每个采样点占 4 字节,所以文件大小是 2022144 乘 3 乘 4,等于 24265728 字节,约 24.3 MB。

第二到四行是同一种格式:文件名、存储格式、增益(括号内是基线)、单位、分辨率、零点、初值、校验和、块大小、通道名。增益是本库最容易被误用的字段。ABR 通道每毫伏对应四千一百九十余万个整数单位,OAE 通道每伏对应八千三百八十余万个单位。这两个数不是随便写的,它们把 32 位整数的动态范围映射到了各自传感器的满量程上。

末尾两行是注释,写作 # Age: 87 与 # Sex: M,只有年龄与性别两项。注意 h1 的年龄在这里是 87,而官方正文写"年龄 40 至 85 岁"。同一个受试者在两处给出的年龄差了两岁,官方没有说明原因,也没有说明哪一处是采集时点、哪一处是入组时点。

实验条件(左耳、1 kHz、100 dB、第一次)在这条记录的任何文件内容里都找不到,只存在于文件名和目录名中。这不是格式缺陷,但它意味着两件事:一是把文件重命名或拍平目录,实验条件就永久丢失;二是任何元数据表都必须从路径解析生成,不能指望头文件。

import wfdb

rec = wfdb.rdrecord('h1/h1_l_1kHz_100_1',
                    pn_dir='earh/1.0.0',
                    physical=True)
print(rec.fs, rec.sig_len, rec.sig_name, rec.units)
print('时长 秒 =', rec.sig_len / rec.fs)
for name, sig in zip(rec.sig_name, rec.p_signal.T):
    print(f'{name:>8}  峰峰值 {sig.max() - sig.min():.3e}')

这段代码不下载全库,只取一条记录的头与信号,跑完大约几十秒。输出的三行峰峰值可以用来做一次快速体检:ABR 通道应在亚微伏到几微伏量级,OAE 通道应在毫伏量级,Trigger 通道应是两个离散电平。任何一个数量级对不上,说明增益或单位读错了。

2.4 覆盖矩阵:八个人各自被扫到哪一档

官方的实验设计是"从阈值下方 5 dB 到 100 dB peSPL,每 5 dB 一档",所以每个人的强度档数取决于他自己的阈值:阈值越高,档数越少。但这只是一条设计原则,记录清单里的起点并不完全服从它,下面这张矩阵按清单逐条数出实际档位:

受试者 年龄 性别 测试耳 1 kHz 阈值 4 kHz 阈值 1 kHz 档数(范围) 4 kHz 档数(范围) 记录数
h1 87 男 左 50 无 11(50–100) 5(80–100) 64
h2 84 男 右 60 无 11(50–100) 4(标注为 10) 49
h3 79 女 右 50 60 11(50–100) 9(60–100) 80
h4 64 男 左 60 70 9(60–100) 7(70–100) 64
h5 74 女 右 35 65 14(35–100) 9(60–100) 92
h6 57 男 右 50 无 11(50–100) 0 44
h7 65 女 右 35 35 15(30–100) 14(35–100) 116
h8 40 女 左 55 70 10(55–100) 7(70–100) 68

从这张表能读出四件事。第一,h7 的条件最全,1 kHz 从 30 dB 起、4 kHz 从 35 dB 起,合计 116 条,占全库五分之一。第二,4 kHz 的覆盖远不如 1 kHz:h1 只有 80 到 100 dB 这五档,h6 一条都没有,h2 只有四条且档位标注为 10,其余五人的起点落在各自阈值或其下方一档。第三,起点并不统一服从"阈值下方 5 dB"——h7 的 1 kHz 从阈值下方 5 dB 起,h5 与 h8 从阈值本身起,h2 的 1 kHz 从 50 dB 起(比它 60 dB 的阈值低 10 dB)。第四,记录数只与档数有关,与年龄、性别、损失程度都不成单调关系。

关于 h2 的四条 4 kHz 记录,需要单独说明,因为它是全库唯一一处明显的命名异常。这四条的文件名分别是 h2_l_4kHz_10_1 到 h2_l_4kHz_10_4,其中的耳别写作 l,而元数据说 h2 测的是右耳;档位写作 10,这个数字在合理的强度轴上都不成立(全库其余记录的最低档是 30)。它们的头文件本身是完整的,年龄 84、性别男,与 h2 的元数据一致;h2 的子目录里也没有任何 r_4kHz_* 记录。可以确定的事实只有三条:这四条存在、耳别字母与元数据不符、档位数值不合常理。它们究竟对应哪个强度、是命名笔误还是别的原因,官方没有说明,任何解读都是推测。

把全库的记录按频率拆:1 kHz 共 369 条,4 kHz 共 208 条。按重复序号拆,四次重复几乎均匀,序号 1 有 145 条、其余各 144 条。多出来的那一条也在 h2:h2_l_1kHz_50_1,与 h2_r_1kHz_50_1 并存。因此 h2 的 1 kHz 有 45 条而非 44 条:11 个档位里,50 dB 那一档多出一条左耳记录,其余各四。

2.5 与同类资源的字段差异

听力领域的公开数据大多停在"阈值表"这一层,把波形公开出来的很少。这张表把几种典型形态摆在一起:

资源 基本单位 有无原始波形 强度轴 标注形态
本库 EARH 一条 42 秒三通道记录 有,48 kHz 相对个人阈值,5 dB 步长 无注释文件,靠 Trigger 通道
姊妹库 earndb 原始、平均、来源三层 有,且有平均后波形 固定强度序列 有平均与来源分层
纯音测听队列类数据 一人一行的阈值表 无 dB HL 固定频点 表格即标注
听觉注意脑电类数据 一段多导联脑电 有,通道数多 言语刺激,非纯音 事件标记文件
耳戴式生理监测数据 一次连续佩戴会话 有,多模态 非受控 事件与活动日志

差别最大的是第二行。姊妹库 earndb 把原始、平均、来源分成三个目录,等于替使用者做完了平均这一步;EARH 只给原始,平均留给你。这个差别不是随意的:正常听力者的 ABR 幅度大、重复性好,平均后波形稳定,值得单独存一份;听障者的情况复杂得多,平均多少次才够本身就是研究对象,所以作者把原始留下、把选择权交出去。

另一个差别是强度轴的锚点。纯音测听队列的频点与强度都是固定的(250、500、1000……Hz,按 5 dB 上下追迹),每个人的行可以直接横向比较。EARH 的每一档都是相对该受试者自己的阈值定义的,所以 h5 的 45 dB 与 h1 的 45 dB 在绝对声压上相同,但在"高出阈值多少"上差得很远。做跨受试者建模时,用绝对强度还是用阈上强度,会得到不同的结论。

§3 它站在哪条线上:一间听力中心与一条方法学路线

3.1 采集地的具体形状

数据采于美国波士顿的东北大学言语-语言与听觉中心。官方在数据采集一节里写得很具体:听力损失经临床检查确认,测听在该中心完成;测试耳的选择用两间隔两选项强迫选择法,用的是贯穿整个实验的同一套刺激;受试者坐在双层隔声室内;刺激由 MATLAB 2006b 在 Ubuntu 上生成,经 24 位 Lynx Two 声卡转成模拟信号,再过 Tucker-Davis Technologies 的 HB7 耳机缓冲器,最后从 Etymotic ER-10C 探头的两个换能器单耳给出。

这条链条的每一环都留下了痕迹。声卡决定了 48 kHz 的数字采样率,也就决定了全库的时间分辨率;探头决定了耳声发射的记录带宽与噪声底;隔声室决定了低频段的残余噪声;耳机缓冲器决定了高强度档的失真余量。换句话说,这套数据的天花板在采集当天就已经定下,任何后处理都越不过它。

作者没有公布设备的序列号、探头的校准日期、隔声室的背景噪声谱。这些在听力学论文里通常也不公开,但对想复现的人是一道门槛:你可以在自己实验室按同样流程采一批,却无法保证探头灵敏度曲线与当年一致,因此两批数据的绝对幅度不可直接比较。

3.2 时间线

时间 事件 与数据集的关系
2009 Ikaro Silva 在东北大学完成博士论文,题目为用短纯音诱发反应客观估计响度增长 数据采集的主体工作
2010 Silva 与 Epstein 在《美国声学学会会刊》发表方法学论文(127 卷 3629–3642 页) 提出用短纯音耳声发射与脑干反应估计响度增长的框架
2011-02-03 正常听力版本 earndb 上线 PhysioNet 证明同一套采集链可以产出可公开的数据
2012 听障者版本对应的论文发表(131 卷 353–362 页) 本库的科学产出,八名受试者即该文样本
2017-09-26 EARH 以 v1.0.0 上线 PhysioNet 数据正式公开,此后未改版

时间线上有一处值得注意的错位:论文 2012 年发表,数据 2017 年才上线,中间隔了五年。这在 PhysioNet 上并不罕见——论文发表时数据往往只在作者手里,等整理到符合平台规范、补齐元数据与校验和,才提交托管。对使用者而言,这意味着两件事:一是数据内容对应的是 2012 年论文的分析版本,不是某个更晚的修订版;二是引用时应同时引论文与数据 DOI,前者是科学依据,后者是数据出处。

3.3 三层数据,三种可信度

这个库里的东西其实分三层,混在一起看容易误判。

第一层是原始生理信号,也就是 .dat 里的三条通道。它是仪器直接吐出来的东西,没有经过任何主观判断,可信度取决于设备与校准,不取决于人。这一层最硬,也最难用,因为要用就得自己做平均。

第二层是心理物理测量,也就是八个响度曲线文件。它是人报出来的,受注意力、判断标准、练习效应影响,重复测量之间会有漂移。这一层是"真值",但这个真值本身带误差,而且误差大小因人而异。

第三层是元数据,年龄、性别、耳别、两个频率的阈值。这一层是记录性的,量最小,却决定了你怎么切分数据。它也是最容易出现内部不一致的一层,后面 §7.2 会专门讲。

三层的关系是:第一层是输入,第二层是目标,第三层是分组变量。任何以受试者为单位的分析,都必须把第三层带在每一行上,否则无法做留一受试者验证。

3.4 在"客观—主观"坐标里的位置

听觉研究里的测量可以按两条轴摆:横轴是测量对象(外周耳蜗、听神经与脑干、皮层、整体行为),纵轴是测量方式(生理记录、行为判断)。纯音测听落在"整体行为 × 行为判断"这一格,脑干反应落在"脑干 × 生理记录",耳声发射落在"耳蜗 × 生理记录"。

EARH 的特殊之处是它在同一批人身上同时占了三格:耳蜗(OAE)、脑干(ABR)、整体行为(响度曲线)。这种"三格同人"的配置在公开数据里极少,因为采集成本高——每个受试者要坐两三个小时,还要在隔声室里保持不动。

测量层级 本库对应通道或文件 时间尺度 主要误差来源
耳蜗外毛细胞 OAE 通道 二十毫秒内 探头位置、耳道声学、中耳传声
听神经与脑干 ABR 通道 十毫秒内 电极阻抗、肌电、残余噪声
整体响度知觉 响度曲线文件 分钟级判断 判断标准、注意波动、练习效应
入组与分组 元数据文件 一次测量 阈值测量误差、年龄口径

这张表解释了一个常见困惑:为什么同一个强度档上,OAE 可能已经测不到,而 ABR 还很清晰。耳蜗外毛细胞受损到一定程度就不再产生可测的发射,但听神经仍然可以被电刺激同步驱动——两条曲线因此在中重度损失上分道扬镳。这个分岔正是数据集有意思的地方,也是它的分析难点。

§4 它最独特的东西:同一刺激的两条回响

4.1 同步记录为什么稀缺

耳声发射与脑干反应的记录设备、电极位置、分析软件通常是两套。临床上做听觉脑干反应用贴片电极加插入式耳机,做耳声发射用探头加另一个主机,两次测量之间患者要换姿势、换设备,刺激强度也难以完全对齐。研究里当然可以把两者拼起来,但拼接意味着时间不同步、强度不同源、状态不同。

EARH 的做法是把两者压进同一次记录:一个探头既给声又收声,头皮电极同时记录远场电位,三条通道共用一块声卡的时钟。于是同一个刺激起始点之后,前十毫秒是脑干的事,前二十毫秒是耳蜗的事,两条曲线可以逐档并排放。

对比项 常规分次测量 本库的同步测量
刺激源 两套设备,各自校准 同一探头、同一校准
时间基准 两次记录各自触发 共用 48 kHz 时钟
受试者状态 两次,可能不同 一次,同一状态
强度对齐 需事后换算 同一档即同一强度
可做的分析 各自独立 跨模态的逐档一致性

最后一行是它真正的用途。你可以问:在同一档强度上,耳声发射的幅度与脑干反应的潜伏期,哪一个更能预测受试者报出的响度?这个问题只有在同步数据上才问得干净。

4.2 刺激设计里的三个细节

官方的刺激描述只有一段,但里面藏了三个会直接影响分析的选择。

第一个是高斯窗且没有平台。 短纯音的常规做法是"上升—平台—下降",平台段保证能量稳定。这里反其道而行,用 MATLAB 的 GAUSSWIN 生成一个纯高斯包络,没有平台,两端衰减约 27 dB。作者给出的理由有三条:均方根值更一致、在对数尺度上频谱扩散更均匀、瞬态刺激更容易引出脑干反应。代价是"频率"这个概念变得模糊——一个 1 毫秒的高斯包络,其频谱主瓣宽度在千赫量级,标称的 4 kHz 只是中心频率,不是窄带纯音。

第二个是补齐到 41.7 毫秒。 1 kHz 的刺激本身只有 4 毫秒,4 kHz 的只有 1 毫秒,两者都被补静音延长到同一个总长。这样做是为了让所有条件的记录窗一致,平均与对齐都简化。分析时要注意:真正有能量的部分只占前几毫秒,后面的静音段对脑干反应没有贡献,但对基线估计有用。

第三个是强度单位用 peSPL。 峰值等效声压级的定义是:一个连续正弦波,其峰值与待测短音的峰值相同,则该正弦波的声压级即为待测短音的 peSPL。这个定义对短音特别合适,因为它不依赖时长,也不依赖平台段是否存在。但它与临床的 dB HL 之间没有固定换算:dB HL 是相对于该换能器、该刺激时长下的标准听阈参考值,换探头、换时长,参考值就变。

这三个选择叠在一起,得到一个后果:本库的"50 dB"指的是一个 4 毫秒高斯包络的峰值等效声压级为 50 分贝,不是"比正常听阈高 50 分贝"。跨库比较时必须先做口径转换,而转换所需的参考值官方没有给全。

4.3 案例:h7 的 4 kHz 逐档响度曲线

h7 是全库条件最全的一个人:女性,65 岁,右耳,1 kHz 与 4 kHz 的阈值都是 35 dB peSPL。她的 1 kHz 从 30 dB 起扫、15 档,4 kHz 从 35 dB 起扫、14 档,合计 116 条记录。响度曲线文件是 H7_LoudnessData_F4.txt,13 行,从 40 dB 起。

先看这 13 行的开头、中段与结尾:

40,NaN,NaN,0.6911
45,0.050172,0.050172,0.9155
50,0,0,0.97356
...
100,0.92074,0.016634,1.806

第一行的第二、三列是 NaN,第四列却有值 0.6911;50 dB 那一行的第二、三列又同为 0。三种形态同时出现,说明后三列不是同一个量的三个副本,也不像"估计值加两条置信界"的常规组合。官方没有给列名,这里只能陈述形态,不下命名结论。

还有一处更值得注意的错位:刺激序列从 35 dB 起,响度文件从 40 dB 起,最低一档在文件里干脆没有行。把她和 h1 放在一起看,这个截断更明显——h1 的 1 kHz 刺激从 50 dB 起共 11 档,而 H1_LoudnessData_F1.txt 只有 7 行、从 70 dB 起,前四档没有曲线。可见响度曲线的起点并不固定对应刺激序列的起点,官方也没有说明截断规则。做回归时如果不检查这一步,会以为"每个强度档都有标签",实际上一头一尾都会缺。

从 45 dB 到 100 dB,第四列从 0.9155 抬到 1.806,总体上升,但并非严格单调:65 dB 与 85 dB 各有一处小幅回落。第二列从 0.05 到 0.92,中途在 50 dB 归零;第三列在 0 到 0.10 之间起伏,且在 45、50、55 三档上与第二列数值完全相同。这几个特征合起来,提示后三列之间可能存在某种构造关系,但仅凭两个文件不足以还原。

这条曲线可以直接回答一个临床问题:她的可听动态范围有多宽。阈值 35 dB,100 dB 对应阈上 65 dB;若把"响度翻倍"对应到第四列增加 0.3(对数尺度下的常见约定),则从 45 dB 到 100 dB 这 55 dB 里,第四列涨了约 0.89,合近三次翻倍,接近八倍。正常耳在同样的 55 dB 跨度上增长更缓,因为它的强度余量更大;听障耳在阈值之上迅速追平甚至超过正常耳的响度,然后提前撞到不适阈——这就是重振的量化表述,也是助听器必须做压缩的原因。

再看时间轴上的对应物。她 4 kHz 的脑干反应记录从 35 dB 到 100 dB 每 5 dB 一档,共 14 档,每档 4 次。把每一档的扫次叠加平均、量出波 V 的潜伏期,会得到一条潜伏期—强度函数;这条函数在阈值附近斜率最大,往上逐渐平缓。响度曲线的斜率与潜伏期函数的斜率是否同步变化,就是这套数据能直接检验的假设。

§4.3 的案例在后面还会用到两次:§7.3 讲缺失标签时以她的 40 dB 行为例,§9.1 讲最短流程时以她的文件为起点。

4.4 从扫次到平均:残余噪声这件事

脑干反应的幅度在亚微伏量级,而头皮上的自发脑电在十微伏量级,信噪比差两个数量级。唯一的办法是重复刺激、叠加平均,噪声按根号 N 衰减。问题是 N 取多少才够:取得太少,残余噪声淹没波形;取得太多,受试者要坐很久,状态漂移反而引入新噪声。

论文把这件事列为第二个研究目标:残余噪声水平如何影响响度估计的质量。摘要给出的结论是,部分受试者的生理响度估计落在标准心理物理程序的均方误差范围内,1 kHz 的吻合更好;脑干反应的中位残余噪声与估计表现相关,个别受试者在控制噪声水平后,响度增长函数的估计明显改善。

这段话对本库的用法有直接含义:平均次数不是预处理细节,而是模型的一部分。同一段 42 秒的记录,取前 200 个扫次与取全部扫次,得到的波形不同,据此估计的响度也不同。任何报告结果的实验,都应该写清楚用了多少扫次、残余噪声怎么估的。

残余噪声的常用估计有两种:一种是取相邻两个子平均之差的均方根,按扫次数折算;另一种是用正负交替的平均(把奇数扫次与偶数扫次相加时反号)来抵消真实反应、只留噪声。两种都不需要额外数据,可以直接在原始记录上做。

平均策略 扫次数 残余噪声 适用场景
少量扫次 一两百 高 快速筛查、可穿戴场景模拟
中量扫次 五六百 中 常规研究分析
全部扫次 全部 低 追求波形质量的上限
自适应 按噪声阈值停 受控 需要跨受试者可比时

最后一行是论文暗示的方向:与其固定扫次数,不如固定残余噪声水平,让每个受试者平均到噪声降到同一个阈值为止。这样得到的波形在跨人比较时才公平,因为不同人的噪声底本来就不一样。

§5 取数路径:从通道定义到扫次平均

5.1 官方入口与目录形状

项目页在 https://physionet.org/content/earh/,文件根目录在 https://physionet.org/files/earh/1.0.0/。根目录下有八个受试者子目录、一个记录清单、一个元数据文件、八个响度曲线文件,以及一个校验和清单。没有注释文件,没有事件文件,没有 README 之外的说明文档。

earh/1.0.0/
├── h1/ ... h8/            每条记录一对 .hea 与 .dat
├── RECORDS                577 行,含子目录前缀
├── Listener_MetaData.txt  9 行,表头加八人
├── H*_LoudnessData_F*.txt 8 个响度曲线
└── SHA256SUMS.txt         校验和

整包 ZIP 约 13 GB,单条记录约 24.3 MB。如果只是想把流程跑通,取一条就够,不必下全量。

5.2 批量下载

#-- 先只取清单与元数据,几百字节,用来确认路径与编号
curl -sL -O https://physionet.org/files/earh/1.0.0/RECORDS
curl -sL -O https://physionet.org/files/earh/1.0.0/Listener_MetaData.txt

#-- 再按需拉子目录;把 h7 换成 h1..h8 可分批
wget --no-parent --recursive --level=2 --accept=hea,dat \
     --directory-prefix=earh \
     https://physionet.org/files/earh/1.0.0/h7/

#-- 核对条数:RECORDS 用空白切分,不要用行数
python3.11 - <<'PY'
import urllib.request
names = urllib.request.urlopen(
    'https://physionet.org/files/earh/1.0.0/RECORDS').read().decode().split()
print(len(names), names[0], names[-1])
PY

清单里的名字带子目录前缀,形如 h7/h7_r_4kHz_95_2,可以直接喂给 WFDB 的读取函数;但很多下游工具会把斜杠当路径分隔符,转成扁平表时要先替换掉。

5.3 流式读取一条记录

import wfdb

name = 'h7/h7_r_4kHz_95_2'
rec = wfdb.rdrecord(name, pn_dir='earh/1.0.0', physical=True)
print(rec.fs, rec.sig_len, rec.sig_name, rec.units)
print(rec.comments)

trig = rec.p_signal[:, rec.sig_name.index('Trigger')]
abr = rec.p_signal[:, rec.sig_name.index('ABR')]
oae = rec.p_signal[:, rec.sig_name.index('OAE')]
print(trig.min(), trig.max(), abr.std(), oae.std())

pn_dir 让 WFDB 直接按项目名走网络,不落盘;代价是每次读都要重新请求,反复调试时建议先落到本地。comments 会带回 # Age 与 # Sex 两行,这是记录内唯一的受试者信息。

5.4 从触发通道切出扫次并平均

import numpy as np
import wfdb

rec = wfdb.rdrecord('h7/h7_r_4kHz_95_2', pn_dir='earh/1.0.0', physical=True)
fs = rec.fs
trig = rec.p_signal[:, 0]
abr = rec.p_signal[:, 1]

#-- 触发电平取中点,上升沿即刺激起始
thr = (trig.max() + trig.min()) / 2
rise = np.where((trig[:-1] < thr) & (trig[1:] >= thr))[0]

pre, post = int(0.002 * fs), int(0.012 * fs)   #-- 前 2 毫秒到后 12 毫秒
epochs = [abr[i - pre:i + post] for i in rise if i - pre >= 0 and i + post < len(abr)]
epochs = np.array(epochs)
print('扫次数', len(epochs), '每段点数', epochs.shape[1])

#-- 正负交替平均,用差值估残余噪声
half = len(epochs) // 2
odd, even = epochs[1::2][:half], epochs[2::2][:half]
n = min(len(odd), len(even))
plus = odd[:n].mean(0) + even[:n].mean(0)
minus = odd[:n].mean(0) - even[:n].mean(0)
avg = epochs.mean(0)
print('残余噪声估计', float(np.std(minus) / np.sqrt(2)))
print('波峰时刻 ms', float((np.argmin(avg) - pre) / fs * 1000))

这段代码里有三个必须自己定的事:触发沿怎么判、时间窗取多宽、残余噪声怎么算。官方一个都没有规定,因为它把"怎么平均"当作使用者的自由。三个选择都会改变最终波形,所以在方法节里必须写清楚。

5.5 读元数据与响度曲线

import pandas as pd

meta = pd.read_csv('Listener_MetaData.txt', sep=r'\s+', engine='python')
print(meta.to_string(index=False))

loud = pd.read_csv('H7_LoudnessData_F4.txt', header=None,
                   names=['spl', 'c1', 'c2', 'c3'])
print(loud.dropna().head())
print(len(loud), loud['spl'].min(), loud['spl'].max())

元数据文件用空白对齐而不是逗号分隔,直接 read_csv 会把整行读成一列,必须指定分隔符。响度曲线用逗号分隔且无表头,列名得自己起——起名只是占位,不代表已知含义。

5.6 五个最容易出错的地方

位置 错误写法 后果 正确做法
路径解析 拍平目录后重命名 耳别、频率、强度、重复号全部丢失 解析时把五段写进表列
强度口径 当成 dB HL 与听力图比 系统性高估或低估二三十个单位 明确标注 peSPL,不跨口径比较
幅度换算 直接读数字量 ABR 与 OAE 差若干数量级 用物理量接口或按各自增益除
数据划分 按记录随机切分 同一人同一档的重复跨两侧 以受试者为单位划分
平均次数 当成固定预处理 与其他研究不可比 报告扫次数与残余噪声

第三行值得多一句:ABR 通道的增益是四千一百九十余万单位每毫伏,OAE 通道是八千三百八十余万单位每伏。两个增益数值接近,容易让人以为可以互换,但一个除出来是毫伏、一个除出来是伏,差三个数量级。

§6 与库内相邻资源的关系

6.1 关系图谱

听力与听觉这条线上,库内的资源可以按"测的是什么"排开。EARH 站在最靠生理的一端,它的邻居大多是量表与问卷:

相邻资源 它测什么 与本库的关系 关键区隔
Oldenburg Hearing Health Record(ohhr-hearing) 581 名成人的纯音测听、响度缩放、语句测听与认知量表 同做响度,但形态完全不同 那边是一人一行的心理物理与问卷表,没有波形;这边是波形,只有八人
Sex differences in age-related hearing loss 四千余名筛查者的双耳六频段纯音听阈 提供人群参照 那边是横断面阈值分布,没有阈上强度,也没有电生理
鲁汶听觉注意 EEG(auditory-eeg) 16 名正常听力者的 64 导脑电,双耳竞争言语 同为听觉诱发电生理 那边是皮层慢波与注意解码,采样 8192 Hz、通道数多;这边是脑干快波与耳蜗声,只有三个通道
Auricle 耳戴多模态心血管数据 耳内心音与心电、心震 同为"耳朵"这个部位 那边借耳道测心,这边测耳;采集部位相同,器官不同
SeizeIT2 耳后可穿戴癫痫监测 耳后脑电、心电、肌电多模态长时程 同为耳周电生理 那边是长时程可穿戴、多中心、上百例;这边是隔声室内的短时程精测
姊妹库 earndb(不在库内) 正常听力者的同类反应 直接对照 那边补上了本库缺的正常人群,两库合并才能做组间比较

这张表里最需要说清的是第一行。ohhr-hearing 与 EARH 都涉及"响度",但一个是把响度当作量表分数收集,一个是把响度当作待估计的连续函数、并用生理信号去逼近它。前者适合做"人群里响度感受怎么分布",后者适合做"能不能从一段波形反推出这条曲线"。两者的样本量差七十倍,用途没有重叠。

第三行的区别也常被混淆。听觉诱发电位是一大类,按潜伏期分:脑干反应在十毫秒内,中潜伏期在十到五十毫秒,皮层慢波在五十毫秒以上。EARH 只覆盖第一段,auditory-eeg 覆盖第三段。前者对刺激的时间精度要求极高、对受试者配合要求极低;后者相反,需要受试者专注听故事。选错库,方法就南辕北辙。

6.2 检索路径

你要找的东西 检索词 会落到哪里
同一采集链的正常听力数据 earndb、Evoked Auditory Responses in Normals 姊妹库,56.9 GB
更多人的听阈参照 pure tone audiometry、hearing threshold 库内两个大队列
响度的量表化测量 loudness scaling、categorical loudness ohhr-hearing
听觉注意与皮层解码 auditory attention decoding、AAD 鲁汶那套
耳道内的生理信号 ear-EEG、in-ear SeizeIT2 与 Auricle
脑干反应的临床规范 ABR wave V、latency intensity function 外部文献,不在库内

6.3 分工判据

任务 主力资源该用什么 EARH 的位置 原因
听阈的群体建模 大队列阈值表 不参与 八个人无法刻画分布
响度的心理物理建模 ohhr-hearing 一类量表库 可作小样本验证 真值只有八条曲线
从波形估计响度 几乎无可替代 主力 同步的生理与心理物理极少见
耳声发射的可检出性研究 临床 OAE 数据库 可作探索 强度跨度合适,样本太小
脑干反应的自动判读 临床 ABR 数据集 可作外部测试 刺激与设备单一,泛化有限
可穿戴耳道设备的算法预研 可穿戴多模态库 不适用 隔声室、插入式探头,非真实佩戴

第五行值得强调:很多做耳道设备的人会看到"耳朵里的信号"就想用这个库。它的采集条件与真实佩戴相差很远——受试者坐着不动,探头由听力师放置,背景噪声被隔声室压到极低。拿它训练出的降噪或检测算法,到了地铁里会立刻失效。

§7 质量评估与局限性

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

先把一个容易发生的误判摆正:把"八个人"读成"质量差"。这个库的样本量不是采集能力的问题,而是研究设计的结果——它要回答的是"能不能从生理反应估计响度",这类方法学研究只需要少量受试者做深测,不需要大样本做分布。用"越大越好"的尺子量它,必然得出"不值得用"的结论,而这个结论会让你错过它唯一不可替代的那部分。

第二个误判是把"官方没写"读成"数据里没有"。官方的说明确实简略,响度文件的列名、扫次边界、耳声发射的可检出情况都没写,但这些信息有的能从文件推出来,有的必须自己算。简略不等于缺失,它只意味着使用门槛高一点。

校正之后再看评分,才不会把"规模小"和"文档薄"混成一件事。

7.1 五维评分

按 DAIMS 的常用维度打分,每项 1 到 5 分,针对"作为听觉诱发电位方法学研究数据"这个用途:

维度 分数 理由
数据规模 2 八人、577 条,人均档位有限,训练用途基本不成立
标注质量 3 生理信号本身无需标注,但响度真值只有八条曲线且列义不明
任务适配 5 同步的耳蜗、脑干与行为三层测量,公开资源里近乎唯一
文档完整 3 采集链写得极细,但元数据列义、扫次边界、缺失原因都没写
可获取性 5 免注册、ODC-BY、单条即可下载,无需下全量

合计 18 分(满分 25)。分数结构和心电类的老库很像:规模拖后腿,适配拉满,文档中等。这个形状说明它的正确用法是"小而深的验证",不是"广而浅的训练"。

7.2 官方口径之间对不上的三处

第一处是年龄。官方正文写"年龄 40 至 85 岁",元数据文件里 h1 写 87 岁,h2 写 84 岁。若以元数据为准,范围应是 40 到 87;若以正文为准,h1 的 87 无法解释。两者相差两岁,官方没有说明哪一处是采集时点、哪一处是入组时点,也没有说明是否有一人年龄记错。做年龄分层分析时,这个差别不影响结论,但引用时应当注明取自哪一处。

第二处是标题。项目页的浏览器标题写作 Evoked Auditory Responses in Heading Impaired,而页面正文的一级标题与摘要都写作 Hearing Impaired。Heading 显然是 Hearing 的笔误,出现在模板层而非数据层,文件内容不受影响。检索这个库时,两种拼写都可能命中,用 Heading 搜不到东西时不要以为库不存在。

第三处是体积。项目页标称未压缩 13.0 GB;单条 .dat 是 24265728 字节,乘 577 条约 14.0×10⁹ 字节。两个数的差是单位口径不同:前者按二进制吉比字节计,后者按十进制计。换算之后一致,不是矛盾。

项目 口径 A 口径 B 差额构成 处理建议
年龄上限 正文 85 岁 元数据 87 岁 两岁,官方未说明 引用时注明来源
英文名 页面标题 Heading 正文 Hearing 一个字母的笔误 两种拼写都试
体积 13.0 GB 单条乘条数约 14.0 GB 二进制与十进制之差 规划磁盘按 15 GB 留余量

7.3 已知的、可枚举的偏差

偏差 表现 影响
样本极小 八人,四男四女 任何组间比较都没有统计效力
年龄偏老 六人在 57 岁以上 无法代表儿童与青年听障者
损失类型单一 全部为感音神经性 传导性与混合性损失完全没有
单耳测量 每人只测较好耳 无法做耳间对比,也无法看较差耳
单中心单设备 一间听力中心、一套探头 设备指纹被写进数据
强度轴个人化 每档相对本人阈值 跨人比较须换算成阈上强度
真值不完整 部分档位响度估计缺失 §4.3 的案例里 40 dB 即为一例
耳声发射可检出性未知 官方未公布逐条情况 直接做 OAE 分类会撞上大量无信号样本
命名异常 h2 有五条 l 前缀记录,其中四条 4 kHz 档位标为 10 按文件名解析会得到一个不存在的强度档

第五行值得展开。单中心不是行政描述,它有物理后果:探头的频响、隔声室的低频衰减、电极的阻抗范围,都会在波形上留下可识别的痕迹。一个在这批数据上训练的模型,可能学到的是"这台探头的频响",而不是"耳蜗的功能"。要检验这一点,最直接的办法是在另一个实验室的数据上做迁移,看性能掉多少。

第七行的缺失在 §4.3 的案例里已经见到:h7 的 4 kHz 曲线最低一档没有任何行,40 dB 那一行的第二、三列又是 NaN。缺失集中在低强度端是有原因的——信号弱、心理物理追迹难收敛,估计程序给不出值。这意味着如果你按"有标签才用"筛选,留下的样本会系统性偏向中高强度,响度曲线的低端被截掉,而这恰恰是重振最明显的区段。

7.4 外部验证矩阵

验证角色 做法 讲得通的地方 风险
方法学复现 按论文流程重跑响度估计 数据就是论文那批,流程可对照 论文细节不全,平均次数等参数需自定
跨库泛化 在正常库 earndb 上训练,在本库测试 同一采集链,设备差异被控住 人群差异与设备差异混在一起
算法外部测试 用商业 ABR 设备采集的数据测试本库训练的模型 检验泛化 强度口径不同,须先换算

第一行是这个库最正当的用法:它是一个可复现的靶子。论文说了结论,数据在这儿,你可以自己跑一遍看能不能得到同样的趋势。这类复现不需要大样本,八个受试者刚好够。

7.5 它为何能持续:一套别人不愿再采的深测数据

这类数据能长期存在,靠的不是更新,而是不可替代。重采一遍的成本极高:要找到八名愿意在隔声室里坐两三小时的听障者,要有一整套校准过的探头与电极,要有能做两间隔两选项追迹的心理物理程序,还要有人把三层数据对齐。这些条件凑齐一次已经不容易,凑齐第二次的动力几乎没有。

于是它的生存逻辑变成:只要还有人研究"从电生理估计响度",就必须回到这八个人身上。库不会变大,引用会缓慢累积,价值随时间不降反升——因为每多一篇用它做的论文,它作为基准的地位就稳一分。这与那些靠规模取胜的库正好相反:那些库的寿命取决于有没有更大的库出现,这个库的寿命取决于有没有人愿意再采一遍。

§8 生态位与历史

8.1 一条方法学路线的三段

这条路线的起点是 2009 年的博士论文。作者要解决的问题很具体:响度只能靠人报,能不能用耳朵自己发出的信号替代。2010 年的方法学论文给出了框架:用短纯音激发的耳声发射与脑干反应,各自估计一条随强度增长的曲线,再与心理物理曲线比对。2012 年的论文把框架搬到听障者身上,因为听障者的动态范围窄、重振明显,是这套方法真正的用武之地。

三段之间的关系是递进的:第一段证明可行,第二段给出方法,第三段检验方法在困难人群上的表现。EARH 是第三段的材料,也因此带着第三段的偏向——它选了听障者,就意味着没有正常对照;它选了深测,就意味着样本小。

8.2 与姊妹库的分工

维度 earndb(正常听力) EARH(听障)
上线时间 2011-02-03 2017-09-26
体积 约 56.9 GB 约 13 GB
目录结构 原始、平均、来源三层 单层,按受试者分目录
是否含平均后波形 含 不含
受试者 正常听力者 临床确诊听力损失者
主要用途 建立正常基线 检验方法在损失耳上的表现
DOI 10.13026/C2NP4D 10.13026/C2Z664

两者的体积差四倍,主要来自目录结构:正常库把原始、平均、来源都存了一份,EARH 只存原始。这个差别是有意的——正常耳的波形稳定,平均结果值得单独保存;听障耳的波形依赖平均策略,存一个"官方平均"反而会误导。

合并使用时的正确姿势是:用 earndb 建正常基线,用 EARH 看偏离,两者的刺激频率、强度步长、采集链一致,所以差值有意义。但要注意两库的受试者年龄分布不同,正常库偏年轻,听障库偏老,年龄与听力在两组之间是混淆的,不能把差值全归给听力。

8.3 生态位:为什么这类库这么少

听觉诱发电位的公开数据少,原因有三。第一是设备门槛:临床 ABR 设备多为封闭系统,导出的常是厂商私有格式或已处理的波形,原始采样难以取出。第二是伦理与隐私:诱发电位本身不含可识别信息,但配套的听力图、病史、影像往往含,公开时要做大量脱敏。第三是激励不足:采集成本高、复用价值不确定,很少有团队愿意把两三小时一人的深测数据无偿放出。

在这个背景下,EARH 的位置很清楚:它是少数几个能拿到"原始三通道加心理物理真值"的地方之一。它的竞争者不是别的公开库,而是各实验室自留的内部数据——那些数据更多、更好,但不公开。

8.4 谁在用它,以及怎么被引用

从公开文献的引用形态看,它主要出现在三类工作里:一是响度估计方法的对比研究,把它当作少数可用的公开真值;二是听觉诱发电位的信号处理研究,把它当作测试波形;三是综述与教程,把它列为公开听觉电生理资源的例子。

值得注意的是它的引用方式。因为数据与论文分离,很多人只引 2012 年的论文而不引数据 DOI,这会让数据本身的贡献被低估。规范的做法是两句都写:一句给论文,说明科学依据;一句给数据,说明版本与出处。

§9 使用指引

9.1 三种角色的路径

角色 第一步 第二步 注意
算法研究者 取 h7 的 4 kHz 全套(14 档乘 4 次,共 56 条)跑通切段与平均 用 §4.3 的案例做真值对齐,跑留一受试者验证 不要按记录随机划分
听力师或验配工程师 先读元数据与响度曲线,理解 peSPL 与 dB HL 的差别 再看 §4.2 的刺激设计,判断能否迁移到临床设备 不要把阈值当听力图用
教学人员 用一条记录的三通道做课堂演示 让学生自己从 Trigger 切段,体会平均次数的影响 §5.4 的代码可直接改成作业

第一行的路径有个具体好处:h7 的条件最全,1 kHz 从 30 dB、4 kHz 从 35 dB 起扫,能同时看到阈值附近与高强度端的行为。如果从 h1 开始,你会发现它的 4 kHz 只有 80 到 100 dB 五档,前段全空,容易误以为库不完整。

9.2 一条最短的可用流程

import numpy as np
import pandas as pd
import wfdb

#-- 1. 取一个人的全部记录名
names = [n for n in wfdb.get_record_list('earh/1.0.0') if n.startswith('h7/')]
print('h7 记录数', len(names))

#-- 2. 从文件名解析实验条件
rows = []
for n in names:
    sub, base = n.split('/')
    _, ear, freq, level, trial = base.split('_')
    rows.append({'name': n, 'subject': sub, 'ear': ear,
                 'freq': freq, 'level': int(level), 'trial': int(trial)})
design = pd.DataFrame(rows)
print(design.groupby('freq')['level'].agg(['min', 'max', 'nunique']))

#-- 3. 逐档平均,得到一条强度序列上的波形摘要
def epoch_avg(name, pre=0.002, post=0.012):
    rec = wfdb.rdrecord(name, pn_dir='earh/1.0.0', physical=True)
    fs = rec.fs
    trig, abr = rec.p_signal[:, 0], rec.p_signal[:, 1]
    thr = (trig.max() + trig.min()) / 2
    rise = np.where((trig[:-1] < thr) & (trig[1:] >= thr))[0]
    a, b = int(pre * fs), int(post * fs)
    ep = np.array([abr[i - a:i + b] for i in rise if i - a >= 0 and i + b < len(abr)])
    return ep.mean(0), len(ep)

curve = []
for lv, grp in design[design['freq'] == '4kHz'].groupby('level'):
    waves = [epoch_avg(n)[0] for n in grp['name']]
    w = np.mean(waves, axis=0)
    curve.append({'level': lv, 'ptp_uV': float(np.ptp(w)) * 1000})
print(pd.DataFrame(curve).sort_values('level').to_string(index=False))

这段流程只做一件事:把"文件名里的实验条件"变成"一条强度轴上的幅度序列"。它是所有后续分析的地基——没有这一步,你手里只有 577 个无名文件。

9.3 引用方式

Silva I, Epstein M. Objective estimation of loudness growth in
hearing-impaired listeners. J Acoust Soc Am. 2012;131(1):353-362.
doi:10.1121/1.3666024

Silva I. Evoked Auditory Responses in Hearing Impaired (version 1.0.0).
PhysioNet. 2017. doi:10.13026/C2Z664

两段缺一不可。第一段是科学依据,说明这批数据为什么被采集、结论是什么;第二段是数据出处,说明你用的是哪个版本。ODC-BY 1.0 要求署名,署名的最低标准就是这两行。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,结构与事实由编辑核对
数字来源 规模、结构、边界三类数字取自 PhysioNet 项目页与其文件目录
文件核验 RECORDS、Listener_MetaData、两份响度文件、三条头文件经直接访问确认
记录数口径 577 条由 RECORDS 空白切分得到,官方正文未直接给出条数
论文信息 仅参考 Europe PMC 返回的摘要,未读全文
未核验内容 逐条耳声发射可检出性、扫次重复率、响度文件列义
图像 无配图;封面为生成式提示词,不含真实波形或人像
免责 本文不构成听力诊断或验配建议;使用数据须遵守 ODC-BY 1.0 署名要求

常见误读(避坑清单)

常见说法 实际 证据
“这是听力图的数据库” 只有两个频率的短纯音阈值,单位是峰值等效声压级 元数据表六列,无其他频点;官方采集段落
“八个人太少了,没法用” 方法学研究按人深测,样本量不是缺陷而是设计 论文三个研究目标均为方法验证
“ABR 通道是平均后的波形” 是约 42 秒的连续采样,平均要自己做 头文件采样点数与时长换算;无平均通道
“阈值是 dB HL,可以直接和听力图比” 是 dB peSPL,刺激时长 1 到 4 毫秒 官方刺激与校准段落;元数据列名
“每个人两个频率都有数据” 4 kHz 覆盖远少于 1 kHz:h6 一条都没有,h1 只有五档,h2 只有四条可疑记录 记录清单逐条统计;元数据三个 NaN
“重复四次等于四个独立样本” 同一人同一档的重复是同一生理状态 文件名第五段即重复序号
“响度文件有表头说明” 无表头,后三列官方未命名 文件首行即数据;项目页仅一句描述
“耳声发射每条都测得到” 中重度损失耳常不可检出,官方未公布逐条情况 官方未说明;听力学常识
“这是听障人群的代表性样本” 单中心、单设备、以老年感音神经性损失为主 官方采集段落;元数据年龄列
“库里有事件标注文件” 只有 Trigger 通道,无 .atr 等注释文件 目录清单仅 .hea 与 .dat
“文件名一定与元数据一致” h2 的五条记录耳别字母与元数据不符,其中四条档位标为 10 记录清单与 Listener_MetaData 逐条比对

FAQ

问 答
这个库一共有多少条记录? 记录清单里 577 条,按空白切分计数得到。官方正文只给了受试者与刺激范围,没有直接写条数,577 是由清单推出来的,引用时最好注明这一点。
为什么同一个人的记录数量差这么多? 因为强度档数由各人阈值与覆盖范围共同决定。h7 阈值 35 dB,1 kHz 有 15 档、4 kHz 有 14 档,因此最多;h6 只有 1 kHz 的 11 档,因此最少。阈值越高,可扫的档数越少。
一条记录有多长? 2022144 个采样点,48 kHz 采样,合 42.128 秒。这个长度足够容纳数百到上千次刺激重复,具体次数要从 Trigger 通道数出来。
文件名里的 100 是什么单位? dB peSPL,峰值等效声压级。它不是 dB HL,也不是 dB SPL 的长期均方根值,而是一个连续正弦波的声压级,该正弦波的峰值与这个短纯音的峰值相同。
能不能把两条记录直接相减做差分? 不能,除非它们来自同一受试者、同一频率、同一强度,并且时间对齐。不同条件下的记录长度相同但内容无关,相减只会得到两个噪声之和。
测的是哪只耳? 每人只测听力较好的一只耳,三人左耳、五人右耳。选较好耳是为了让强度能扫到更高的物理与知觉范围。
有正常听力的对照吗? 本库没有。同一批作者在同一采集链上另做了一个正常听力库 earndb,2011 年上线,结构相近,两库合并才能做组间比较。
响度曲线能直接当回归目标吗? 可以,但要先确认用哪一列。四列里只有第一列的声压级含义明确,后三列官方未命名,做目标前应先画散点看单调性与缺失分布。
为什么响度曲线里会有 NaN? 表示该档的某个估计量没有收敛或没有做。h7 的 4 kHz 文件里,40 dB 那一行的第二、三列是 NaN,第四列仍有值;这类行不能当零,只能当缺失。
可以用它训练可穿戴耳道设备吗? 不建议直接迁移。采集在隔声室内、探头由听力师放置、受试者静坐,与真实佩戴的噪声与运动条件差得远。可用于算法原型的早期验证,不能用于性能宣称。
引用时只引论文够不够? 不够。论文给的是科学依据,数据另有 DOI。ODC-BY 1.0 要求署名,规范做法是论文与数据各引一句,并写明版本号。
版本会更新吗? 2017 年 9 月上线至今只有 1.0.0 一个版本,官方未公布更新计划。引用时写清版本号即可,不必担心内容漂移。

术语表

术语 解释
ABR 听性脑干反应,刺激后十毫秒内由听神经与脑干核团产生的远场电位
OAE 耳声发射,耳蜗外毛细胞主动运动产生、经中耳传回耳道的声信号
TBOAE 短纯音耳声发射,用短纯音而非咔嗒声激发的耳声发射
TBABR 短纯音听性脑干反应,与上对应
波 V 脑干反应中最稳定、幅度最大的一个波,常用于阈值判定
潜伏期—强度函数 波 V 出现时刻随刺激强度变化的曲线,阈值附近斜率最大
peSPL 峰值等效声压级,以同峰值连续正弦波的声压级表示短音强度
dB HL 听力级,相对该换能器与刺激时长的标准听阈参考值
纯音测听 用不同频率纯音测听阈的临床检查,结果为听力图
听力图 阈值随频率变化的曲线,横轴频率、纵轴 dB HL
阈上强度 高出受试者本人听阈的分贝数,本库的强度轴即以此定义
动态范围 从听阈到不适阈之间的强度跨度,正常耳约一百 dB
重振 响度在阈值之上异常快速增长的現象,常见于感音神经性损失
响度增长函数 主观响度随声压级变化的曲线,本库的八个文本文件即其估计
感音神经性损失 耳蜗或听神经受损导致的听力损失,区别于传导性
外毛细胞 耳蜗内具主动伸缩能力的细胞,是耳声发射的来源
扫次 一次刺激到下一次刺激之间的单次记录片段,英文 sweep
叠加平均 把多个扫次按刺激时刻对齐后取均值,用以提高信噪比
残余噪声 平均之后仍残留的噪声,决定波形可信度
两间隔两选项强迫选择 每次呈现两个时段、受试者必须选一个含目标的方法
隔声室 背景噪声极低的房间,本库为双层结构
插入式探头 放入耳道的换能器与传声器组合,本库为 ER-10C
WFDB PhysioNet 使用的波形数据格式,含头文件与信号文件
头文件 .hea 文本文件,声明通道、采样率、增益与单位
增益 每个物理单位对应的整数计数值,换算时作除数
ODC-BY 开放数据共享署名许可,允许商用但要求署名

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 8 项目页摘要与采集段落 官方页面
性别构成 4 女 4 男 项目页;元数据 官方页面
年龄范围 正文 40–85 岁;元数据 40–87 岁 项目页与元数据 官方页面(两处不一致)
测试耳 3 左、5 右(按人计;按文件计左 201 条、右 376 条) 项目页;元数据 EAR 列 官方页面
刺激频率 1 kHz 与 4 kHz 项目页;文件名 官方页面
刺激时长 4 毫秒与 1 毫秒,补至 41.7 毫秒 项目页 官方页面
强度步长 5 dB;官方称自阈值下方 5 dB 起,清单实际起点见 §2.4 项目页与记录清单 官方页面
重复次数 每档 4 次 文件名第五段 官方文件
记录条数 577 记录清单空白切分 官方文件
采样率 48 kHz 头文件;项目页 官方文件
单条采样点 2022144(约 42.1 秒) 头文件第一行 官方文件
单条体积 24265728 字节(约 24.3 MB) 文件响应头 官方文件
通道数 3(Trigger、ABR、OAE) 头文件 官方文件
全库体积 13.0 GB 未压缩 项目页 官方页面
许可 ODC-BY 1.0 项目页 官方页面
数据 DOI 10.13026/C2Z664 项目页 官方页面
论文 JASA 2012;131(1):353-362 Europe PMC 摘要 论文摘要

附录 B:数字的来源分层

第一层:官方页面与官方文件。 受试者数、性别、年龄、测试耳、刺激参数、强度步长、采样率、通道数、体积、许可、DOI、上线日期,均来自项目页与头文件、记录清单、元数据、响度文件。记录条数 577 与各受试者的档数矩阵,由记录清单逐行解析得到,属于官方文件的可计数结果。

第二层:论文摘要。 “部分受试者的生理响度估计落在标准心理物理程序的均方误差范围内”“1 kHz 吻合更好”"中位残余噪声与估计表现相关"三条结论来自 Europe PMC 返回的摘要,只能支撑趋势,不能支撑具体数值。

第三层:未核实。 逐条耳声发射的可检出率、每档的实际扫次数、响度文件后三列的含义、单一条件为何少一次重复、年度引用量。这些需要下载全量或做文献计量,本文只做定性表述,不给数字。

附录 C:完整参考文献

编号 文献 链接 用途
1 Evoked Auditory Responses in Hearing Impaired v1.0.0 https://physionet.org/content/earh/1.0.0/ 全部规模、结构、边界数据
2 该库文件目录 https://physionet.org/files/earh/1.0.0/ 记录清单、元数据、响度文件、头文件
3 Silva I, Epstein M. JASA 2012;131(1):353-362 https://doi.org/10.1121/1.3666024 方法与结论
4 Silva I, Epstein M. JASA 2010;127:3629-3642 https://doi.org/10.1121/1.3106531 方法学前作
5 姊妹库 earndb https://physionet.org/content/earndb/1.0.0/ 正常听力对照
6 PhysioNet 平台综述(2026) https://doi.org/10.1038/s44360-026-00096-z 托管与引用规范
7 ODC-BY 1.0 许可全文 https://opendatacommons.org/licenses/by/1-0/ 署名要求

附录 D:任务代码

任务一:把一名受试者的全部记录整理成设计表

import pandas as pd
import wfdb

names = wfdb.get_record_list('earh/1.0.0')
rows = []
for n in names:
    sub, base = n.split('/')
    _, ear, freq, level, trial = base.split('_')
    rows.append({'subject': sub, 'ear': ear, 'freq': freq,
                 'level': int(level), 'trial': int(trial), 'name': n})
design = pd.DataFrame(rows)

meta = pd.read_csv('Listener_MetaData.txt', sep=r'\s+', engine='python')
design = design.merge(meta, left_on='subject', right_on='Listener')
print(design.groupby(['subject', 'freq'])['level'].agg(['min', 'max', 'count']))

任务二:留一受试者的响度斜率回归骨架

import numpy as np
import pandas as pd

#-- design 与 loud 由任务一和前文读取得到,此处只演示划分与评估
def slope_by_subject(loud, sub):
    d = loud[loud['Listener'] == sub].dropna()
    if len(d) < 3:
        return np.nan
    x = d['spl'].to_numpy(float)
    y = d['c3'].to_numpy(float)
    return float(np.polyfit(x, y, 1)[0])

subjects = sorted(design['subject'].unique())
for held in subjects:
    train = [s for s in subjects if s != held]
    ref = np.nanmean([slope_by_subject(loud, s) for s in train])
    got = slope_by_subject(loud, held)
    print(f'留出 {held}: 训练组均值 {ref:.4f} 该人 {got:.4f}')

这段骨架的重点不是模型,而是划分:每次留出一整个人,训练组只由其余七人构成。任何在这一步之前按记录打乱的做法,都会让同一个人的重复记录跨到两侧。

附录 E:如果只记五件事

序号 记住什么 为什么
1 八名听障者、577 条记录、三条通道、48 kHz 这四个数决定了一切用法与限制
2 强度轴以个人阈值为锚,单位是 peSPL 不能与听力图的 dB HL 直接比较
3 同一刺激同步记录耳蜗声与脑干电 这是它唯一不可替代的地方
4 原始连续采样,平均要自己做 平均次数与残余噪声必须写进方法
5 按受试者划分,不按记录划分 同一人的重复记录泄漏会让结果虚高

编辑说明

核验时间为 2026 年 10 月 28 日。核对方式为直接访问 PhysioNet 项目页与文件目录,逐个确认记录清单、元数据文件、两份响度曲线文件、三条头文件的字段与取值;论文侧只检索 Europe PMC 摘要,未读全文。记录条数 577 由清单空白切分得到,官方正文未直接给出,这一点在附录 A 与 FAQ 首问中各说明一次。官方正文的年龄上限 85 岁与元数据的 87 岁不一致,页面标题的 Heading 与正文的 Hearing 不一致,两处均按"存在两个口径"并列记录,不下判断。另有一处数据层面的异常:h2 的 49 条记录里有五条用左耳前缀,其中四条 4 kHz 记录的档位标为 10,与其阈值和其余人的档位都不相容,已在 §2.4 并列陈述、不下结论。未覆盖的内容包括逐条耳声发射的可检出率、每档实际扫次数、响度文件后三列的确切含义,这些须下载全量或读论文全文才能确定。


相关数据集导航

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

  • jsmf-access — 共享标签:生理信号 / 脑电信号 / 神经科学
  • openneuro — 共享标签:生理信号 / 脑电信号 / 神经科学
  • siena-scalp-eeg — 共享标签:生理信号 / 脑电信号 / 神经科学
  • eeg-power-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
  • ltrsvp — 共享标签:生理信号 / 脑电信号 / 神经科学
  • ibl-brain-wide-map — 共享标签:生理信号 / 脑电信号 / 神经科学
  • spikeinterface — 共享标签:生理信号 / 脑电信号 / 神经科学
  • erpbci — 共享标签:生理信号 / 脑电信号 / 神经科学
  • eegmat — 共享标签:生理信号 / 脑电信号 / 神经科学
  • mssvepdb — 共享标签:生理信号 / 脑电信号 / 神经科学

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

返回 AI-Ready 数据集