KunSpace
返回博客

验证 Soundbar 喇叭失真(THD):播放测试音 + 录 Mic

2026年7月19日
5 次阅读

读完了?别空手走啊 😏

读都读完了,不点个赞说不过去吧

写评论

读完了不评论,作者会以为你在沉思

这篇写什么?

语音唤醒 / 降噪 时,算法听到的不只是人声,还有 喇叭播出来的回声。若喇叭在测试频段已经严重失真,后面的 AEC、唤醒门限都会变难调——所以工程上常先做一轮:

喇叭(或整机放音通路)失真率 THD 验证

典型做法:在安静环境播标准测试音 → 用 Mic 录回来 → 拉到电脑算谐波失真

一句话:

消音室/安静环境 + 固定摆位(常用约 1 m 轴上)
→ 播放 Linearity_test_48kHz(等标准信号)
→ tinycap 录 Mic WAV
→ adb pull 回电脑
→ 选稳定片段做频谱,算 THD% / dB

喇叭失真 THD 验证流程

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 也会漂。所以分析前,先把摆位记清楚、每次保持一致。

THD 测试摆位:喇叭与麦约 1 m 轴上

推荐摆法(消费级 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

录完 WAV 的四步分析

1)先听、再选片段

  1. 用耳机听一遍 test.wav:有无破音、爆音、明显底噪、中途被人打断
  2. 打开 Audacity / Adobe Audition / MATLAB
  3. 不要用整段乱算:选测试音已经稳定、电平差不多的 1~3 秒(扫频文件则按「当前频点」那一段切)
  4. 若是多通道,先确认用的是 Mic 通道(不是静音轨或错误轨)

2)做频谱,对准基频

  1. 对该片段做 FFT / 频谱分析(窗长别太短,否则峰会糊)
  2. 找到最高的那根谱线 = 基波 (f_0)(例如测 1 kHz,就应对准 1000 Hz 附近)
  3. 再找 (2f_0、3f_0、4f_0…) 位置的峰 = 谐波
  4. 读出基波幅度 (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 的快速路径(适合上手)

  1. 打开 WAV → 选中稳定片段
  2. 分析 → 绘制频谱…(Plot Spectrum)
  3. 算法选 Spectrum,大小可先试 2048/4096,窗口用 Hann
  4. 在图上读基波与谐波的 dB 值;若读的是 dB,先换成线性幅度再代入公式,或使用「幅度差」换算
  5. 把结果记到表格,和规格 / 经验区间对比

不会算时:把同一片段和读数截图发给音频同学,比只丢一个原始 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 严重削波或单元到极限 先查音量/限幅/腔体

读数时务必看测试条件,否则无法对比:

  1. 音量档 / 声压级 — 小声很干净、大声爆 THD 很常见;规格通常写「1 W / 1 m」或「最大可用声压下 ≤ x%」
  2. 频点 — 低音(如 80~200 Hz)往往比中频(1 kHz 附近)更容易高;唤醒更关心 人声相关频段(大约几百 Hz~几 kHz)
  3. 距离与路径 — 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 时,测的是 「喇叭 → 空气 → 麦」整条声学路径;若只要喇叭电口失真,需要另外用人工耳 / 电测点,方法不同,别混为一谈。


八、实操检查清单

  1. 环境安静,助手类抢麦进程已关
  2. 测试 WAV 用「直出」播放器,无额外音效
  3. 摆位固定:优先 约 1 m 轴上(或按规格),高度对齐,写进笔记
  4. tinycap-D/-d/-c/-r 与板级文档一致,能看到 Capturing 日志
  5. 边播边录,播完整段或覆盖关心的频点
  6. adb pull 后听一耳朵:有无破音、爆音、明显底噪
  7. 选稳定片段 → 频谱 → 读基波/谐波 → 算 THD% → 换 dB
  8. 记录:距离、音量档、频点、文件名、日期,方便回归

总结

验证喇叭失真率 = 固定摆位(常用约 1 m)+ 播标准测试音 + 录 Mic + 频谱分析算 THD。
对 Soundbar / 带屏音箱做语音唤醒前,这是一道便宜的「硬件体检」:常用音量下中频尽量 ≤ 1%(约 −40 dB),能到 0.5% 更好;明显高于 3% 且落在人声频段时,先修放音再调唤醒。


相关阅读

评论

还没有评论,来做第一个吧

读完了不评论,作者会以为你在沉思