这篇写什么?
做 语音唤醒 / 降噪 时,算法听到的不只是人声,还有 喇叭播出来的回声。若喇叭在测试频段已经严重失真,后面的 AEC、唤醒门限都会变难调——所以工程上常先做一轮:
喇叭(或整机放音通路)失真率 THD 验证
典型做法:在安静环境播标准测试音 → 用 Mic 录回来 → 拉到电脑算谐波失真。
一句话:
消音室/安静环境 + 固定摆位(常用约 1 m 轴上)
→ 播放 Linearity_test_48kHz(等标准信号)
→ tinycap 录 Mic WAV
→ adb pull 回电脑
→ 选稳定片段做频谱,算 THD% / dB

和 Mic + Ref 做唤醒 / 降噪 的关系:那篇讲 算法侧怎么采 Mic/Ref;本文讲 硬件放音是否「够干净」,属于更靠前的声学/通路检查。
一、THD 是什么?
给喇叭一个接近 纯正弦 的测试音,理想情况输出还是那个频率。实际上非线性会「长出」2 倍、3 倍频等 谐波。
THD(Total Harmonic Distortion,总谐波失真) 粗略说:
THD ≈(各次谐波能量的有效值) / (基波有效值)
常见两种写法:
| 写法 | 含义 | 例子 |
|---|---|---|
| THD 因子 k(%) | 谐波相对基波的百分比 | 0.1%、1% |
| 失真衰减 ak(dB) | 用分贝表示,通常是 负数 | -60 dB |
音频里多用 电压/声压这类场量,不是「功率比」那套说法。另外还有 THD+N(+ Noise):把噪声、哼声、杂散等一起算进去——测「出来的东西里,除了纯测试音还多了什么」。
二、环境要求
- 尽量在 消音室,至少也要 很安静 的房间
- 避免其它 App 占麦(文档里常提到关掉会抢麦的语音助手类应用,例如 Google 侧相关服务)
- 播放与录音尽量固定位置、固定音量档,方便前后对比
环境吵 = 录进噪声 = THD / THD+N 看起来更差,结论会失真。
三、测试信号
使用专用线性度 / 失真测试比特流或 WAV,例如工程里常见的:
- 文件名示例:
Linearity_test_48kHz.wav(约数分钟) - 内容按频段扫过多个测试音(可与 Bark 等听觉频带划分对照理解,不必死记公式)
播放工具: VLC、homaplayer 等,能稳定解码、不乱加 EQ/音效即可。测失真时 关掉播放器音效、响度、虚拟环绕。
四、边播边录:tinycap 抓 Mic
思路:喇叭在播测试音的同时,设备 Mic 把「空气里的声音」录成 WAV。
1)准备 ADB
adb root
adb remount
adb shell
2)开始录音(示例参数)
tinycap /sdcard/test.wav -D 0 -d 3 -c 2 -r 16000
参数含义(以常见 Android tinycap 为例,卡号 / 设备号按你的板子改):
| 参数 | 示例 | 说明 |
|---|---|---|
| 输出路径 | /sdcard/test.wav |
录到设备存储 |
-D |
0 |
声卡号(card) |
-d |
3 |
PCM 设备号(device),选能采到 Mic 的那个 |
-c |
2 |
通道数 |
-r |
16000 |
采样率 16 kHz(唤醒链路常用) |
终端里通常会看到类似:Capturing sample: 2 channels, 16000 rate, 16 bit —— 确认再开始播测试音。
3)麦被占用怎么办?
若 tinycap 打不开设备,可先释放音频服务再立刻重录(按项目规范操作,注意会影响正在跑的音频进程):
killall audioserver
# 马上再执行 tinycap …
更稳妥的做法是:先停掉抢麦的 App / 助手,再录。
4)把文件拉回电脑
另开一个终端(不必停录音流程的前提下,录完再 pull):
adb pull /sdcard/test.wav C:\Users\你的路径\log\test1.wav
五、摆位与距离(测之前先固定)
用设备自带 Mic、或外接测量麦「录空气声」时,距离一变,声压和相对噪声就变,THD 也会漂。所以分析前,先把摆位记清楚、每次保持一致。

推荐摆法(消费级 Soundbar 常用)
| 项目 | 建议 | 为什么 |
|---|---|---|
| 距离 | 喇叭中心到 Mic 膜片 约 1 m(轴上) | 和许多规格写法「1 m」对齐,也方便前后对比 |
| 高度 | Mic 与 Soundbar 发声中心同高 | 避免偏轴导致高频变弱、谐波读偏 |
| 朝向 | Mic 正对 出音方向(轴上) | 侧着录会混进更多房间反射 |
| 音量 | 固定一档(日常唤醒档 / 规格档),写进笔记 | 音量不同,THD 可以差一个数量级 |
| 房间 | 消音室最好;普通房间尽量远离墙角、少反射 | 反射会抬噪声、糊频谱 |
距离说明(人话):
- 太近(例如 < 0.3 m):声压很大,容易让麦过载削波,THD 会被「麦自己」弄脏,不能代表喇叭。
- 约 1 m:工程上最常用的折中——够响、又不太容易贴脸削波。
- 太远(例如 > 2~3 m):信号变弱,房间噪声相对变大,THD+N 容易变差,结论不稳。
若规格写的是「0.5 m」或「人工耳贴网罩」,就按规格来,不要和 1 m 的结果直接比数字。
用 设备板上的 Mic(tinycap 录本机麦)时:物理距离由整机结构决定,仍要固定整机姿态与播放音量,并在报告里写明「本机 Mic 路径」,避免和实验室 1 m 测量麦混谈。
六、录完 WAV 之后怎么分析?
目标:从录音里算出某个测试频点的 THD%,必要时再换成 dB。

1)先听、再选片段
- 用耳机听一遍
test.wav:有无破音、爆音、明显底噪、中途被人打断 - 打开 Audacity / Adobe Audition / MATLAB
- 不要用整段乱算:选测试音已经稳定、电平差不多的 1~3 秒(扫频文件则按「当前频点」那一段切)
- 若是多通道,先确认用的是 Mic 通道(不是静音轨或错误轨)
2)做频谱,对准基频
- 对该片段做 FFT / 频谱分析(窗长别太短,否则峰会糊)
- 找到最高的那根谱线 = 基波 (f_0)(例如测 1 kHz,就应对准 1000 Hz 附近)
- 再找 (2f_0、3f_0、4f_0…) 位置的峰 = 谐波
- 读出基波幅度 (V_1) 和各次谐波幅度 (V_2, V_3, …)(注意单位一致:都是线性幅度,或都先换成线性再算)
3)按定义算 THD%
常用(相对基波)写法:
THD = sqrt(V2² + V3² + V4² + …) / V1
THD% = THD × 100
- 一般至少算到 2~5 次谐波;噪声很大时,过高次可能被底噪淹没,不必硬读
- 若工具直接给出 THD 或 THD+N,看清它是 相对基波 还是 相对总信号,两种定义差一点点,对比时要一致
4)换成 dB,并写进条件
算出 THD% 后,用下一节表格或 Sengpielaudio 计算器 换成 dB。
报告里建议至少写清:
频点:____ Hz
距离:____ m(轴上 / 本机 Mic)
音量档:____
THD:____ %(约 ____ dB)
工具:Audacity / Python / …
5)用 Audacity 的快速路径(适合上手)
- 打开 WAV → 选中稳定片段
- 分析 → 绘制频谱…(Plot Spectrum)
- 算法选 Spectrum,大小可先试 2048/4096,窗口用 Hann
- 在图上读基波与谐波的 dB 值;若读的是 dB,先换成线性幅度再代入公式,或使用「幅度差」换算
- 把结果记到表格,和规格 / 经验区间对比
不会算时:把同一片段和读数截图发给音频同学,比只丢一个原始 WAV 更高效。
6)% ↔ dB 速查(场量)
失真因子很小,所以 dB 值一定是负数。换算时不要漏写负号。
在线计算器:Sengpielaudio — THD % ↔ dB
常用对照(THD 电压比):
| THD k(%) | 失真衰减 ak(dB) |
|---|---|
| 100% | 0 dB |
| 10% | −20 dB |
| 5% | −26 dB |
| 1% | −40 dB |
| 0.5% | −46 dB |
| 0.1% | −60 dB |
| 0.05% | −66 dB |
| 0.01% | −80 dB |
记忆锚点:每降到原来的 1/10,大约 −20 dB(例如 1% → 0.1% 大约从 −40 到 −60)。
公式直觉(场量):
ak(dB) ≈ 20 × log10(k) (k 为小数,如 0.001 表示 0.1%)
k(%) ≈ 10^(ak/20) × 100
多台设备级联时,还有「失真衰减相加」的工程估算法(见同一计算器页的多设备求和),整机链路评估时偶尔会用到。
7)THD 多少算正常?(经验区间)
没有全球统一的「及格线」——最终以你们产品规格(某频点、某声压级、某音量档)为准。下面是消费级 Soundbar / 智能音箱里常用的经验对照,方便你对结果有感觉:
| THD(约) | 大约 dB | 听感 / 工程含义 | 对语音唤醒 |
|---|---|---|---|
| ≤ 0.1% | ≤ −60 dB | 很干净,接近「听不出失真」 | 很理想 |
| 0.1%~0.5% | −60~−46 dB | 中频、中等音量下常见「良好」区间 | 一般够用 |
| 0.5%~1% | −46~−40 dB | 多数消费级在额定/常用音量、中频可接受 | 通常还能做唤醒 |
| 1%~3% | −40~−30 dB | 开始容易听出「糊、刺、破」;低音大音量更常见 | 要警惕,AEC/唤醒可能变难 |
| ≥ 3%~5% | ≥ −30~−26 dB | 明显失真;若出现在人声/唤醒关键频段,基本不合格 | 建议先修硬件再调算法 |
| ≥ 10% | ≥ −20 dB | 严重削波或单元到极限 | 先查音量/限幅/腔体 |
读数时务必看测试条件,否则无法对比:
- 音量档 / 声压级 — 小声很干净、大声爆 THD 很常见;规格通常写「1 W / 1 m」或「最大可用声压下 ≤ x%」
- 频点 — 低音(如 80~200 Hz)往往比中频(1 kHz 附近)更容易高;唤醒更关心 人声相关频段(大约几百 Hz~几 kHz)
- 距离与路径 — 1 m 测量麦 vs 本机 Mic;「喇叭电口」和「空气→Mic」不是一回事
语音唤醒场景的实用建议(经验):
- 在 日常唤醒音量(不要拉到极限轰鸣)下,中频附近目标尽量落在 ≤ 1%(约 −40 dB),能到 ≤ 0.5% 更好
- 若只有极限大音量、或只有超低音 THD 偏高,而唤醒常用音量下中频仍干净,可按规格分开判
- 同一台机器:改音量、EQ、限幅前后各测一次,比纠结「绝对数字」更有用
你们若有内部指标(例如「1 kHz @ 1 m,THD ≤ 1%」),以后台文档为准;上表只是帮你判断「大概落在哪一档」。
七、和语音唤醒场景怎么对齐?
| 步骤 | 目的 |
|---|---|
| 本篇 THD 验证 | 确认喇叭 + 放音通路在关键频段别「糊成一团」 |
| Mic+Ref 采集 | 给唤醒/AEC 提供干净、对齐的通道数据 |
| 唤醒算法调参 | 在硬件够干净的前提下再调门限与模型 |
若 THD 已经很差:
- 先查 音量是否过大导致削波、功放限幅、EQ 猛推
- 再查 密封、腔体、单元本身
- 不要一上来只怪唤醒模型
录 Mic 算 THD 时,测的是 「喇叭 → 空气 → 麦」整条声学路径;若只要喇叭电口失真,需要另外用人工耳 / 电测点,方法不同,别混为一谈。
八、实操检查清单
- 环境安静,助手类抢麦进程已关
- 测试 WAV 用「直出」播放器,无额外音效
- 摆位固定:优先 约 1 m 轴上(或按规格),高度对齐,写进笔记
tinycap的-D/-d/-c/-r与板级文档一致,能看到 Capturing 日志- 边播边录,播完整段或覆盖关心的频点
adb pull后听一耳朵:有无破音、爆音、明显底噪- 选稳定片段 → 频谱 → 读基波/谐波 → 算 THD% → 换 dB
- 记录:距离、音量档、频点、文件名、日期,方便回归
总结
验证喇叭失真率 = 固定摆位(常用约 1 m)+ 播标准测试音 + 录 Mic + 频谱分析算 THD。
对 Soundbar / 带屏音箱做语音唤醒前,这是一道便宜的「硬件体检」:常用音量下中频尽量 ≤ 1%(约 −40 dB),能到 0.5% 更好;明显高于 3% 且落在人声频段时,先修放音再调唤醒。
相关阅读
评论
还没有评论,来做第一个吧
读完了不评论,作者会以为你在沉思