KunSpace
返回博客

Loopback 抗混叠实测:16 kHz 录 1~15 kHz 扫频为何「折回来」

2026年7月17日
2 次阅读

读完了?别空手走啊 😏

白嫖可以,但点个赞显得有教养

写评论

有想法?直接在这说,不用跑留言板

这篇写什么?

语音唤醒常用 16 kHzloopback(Mic + 回采 Ref)。若通路上 没有把高于奈奎斯特频率(8 kHz)的成分滤干净,播一段 1~15 kHz 扫频 再录回来,频谱上会出现「撞到 8 kHz 天花板再折返回来」的折痕——这就是 抗混叠失败

本文总结一次实机排查:测法、合格/异常长什么样、DTS 与驱动加载顺序怎么改,以及 loopbacka / loopbackb 各自支持什么。

一句话:

30%~50% 音量自播自录 1_15kHz.wav
→ tinycap 录 16 kHz loopback
→ 频谱看 8 kHz 处会不会折回
→ 合格:>8 kHz 被滤掉;不合格:出现 V / X 折痕
→ 修复:驱动顺序 pdm → loopback → resample,并选对 loopback 与采样率

16 kHz 下合格与不合格的抗混叠示意

相关概念总览见 麦克风阵列音频检查方法与标准 的「抗混叠」小节;Mic/Ref 采集链路见 Mic + Ref 做唤醒 / 降噪


一、为什么 16 kHz 特别怕混叠?

概念 数值
采样率 16 kHz
奈奎斯特频率 8 kHz(采样率的一半)
测试音 1_15kHz.wav:扫频一直扫到 15 kHz

超过 8 kHz 的能量若在采样前没被低通掉,会 折叠 进 0~8 kHz,频谱上就像扫频线碰到顶后又斜着下来。唤醒算法会把这些「假频率」当信号,噪声与误触发都会变差。


二、测试方法(可复现)

1)播放与音量

  • 音量约 30%~50%(听感舒适、偏低即可,避免功放先削波干扰判断)
  • 本机播放 1_15kHz.wav(或同内容的 1_15khz.wav
  • 自播自录:边播边从 loopback 抓 Mic + Ref

2)录音命令(示例)

板级 card / device 号以实际为准,常见写法:

# 示例:8 通道、16 kHz
tinycap /data/loopbacka16k.wav -D 0 -d 6 -c 8 -r 16000

有的机型 device 是 -d 7

tinycap /data/loopbacka_001.wav -D 0 -d 7 -c 8 -r 16000

3)怎么判合格?

把 WAV 拖进 Audition / Audacity,看 频谱(频谱图)

声学文档常用能量判据(外播/对照场景):

  • 折痕约 7 kHz 处:折痕能量相对对照 < −40 dB
  • 折痕约 6 kHz 处:< −70 dB

16 kHz loopback 自测的直观判据:

  • 合格:扫频到顶后 不应再出现清晰的 8→更低的折返扫频(>8 kHz 已被滤掉)
  • 不合格:顶到 8 kHz 后 斜着折回来,甚至多次来回,呈 V / X

三、异常长什么样?(实机频谱)

下面几张都是 抗混叠未生效 时的典型样子:扫频亮线撞上约 8 kHz 后折返。

多通道频谱:撞顶后折返的混叠折痕

Audition:16 kHz / 8ch,扫频在 8 kHz 处折回

loopback 多通道录音:折返扫频清晰可见

读图要点:

  • 纵轴到 8000 Hz = 16 kHz 采样的天花板
  • 亮线升到顶再下降 = 混叠折痕,不是「正常谐波」
  • 多通道里 Mic / Ref 都可能看到类似折返;以你们约定的分析通道为准

四、根因与修复方向

实机上常见不是「算法坏了」,而是 采集链路初始化顺序 / resample 挂接不对,导致抗混叠滤波或重采样路径没按预期工作。

1)驱动加载顺序必须固定

在 Amlogic 一类平台上,实践结论:

pdm_init → loopback_init → resample_drv_init

顺序错了,回采数据会对不上,抗混叠表现也会异常。
应保证 loopbackresample 之前完成初始化(具体补丁落在 sound_init.c 一类入口里,按平台树维护)。

2)DTS:resample 挂到谁、开不开

思路(示意,节点名以 SoC 为准):

  • resample 模块要挂在正确的数据源上(例如挂 PDM / loopback 相关路径,而不是误挂、或该开时 disabled
  • 16 kHz + 抗混叠 时,往往需要 打开 resample,把高采样率通路重采样到 16 kHz 并完成滤波
  • vad / loopbacka / loopbackbsrcdatain_srcdatalb_src、通道数与 mask 要和硬件 Mic/Ref 布局一致

示例片段(仅说明配置项含义,勿照抄到别的料号):

asrcb: resample@1 {
    /* ... clocks ... */
    /* resample_module:按平台注释选 PDMIN / LOOPBACK 等 */
    status = "okay";   /* 16k 抗混叠场景常需打开 */
};

loopbacka: loopback@0 {
    datain_src = <4>;      /* 例:pdmin */
    datain_chnum = <2>;
    datalb_src = <0>;      /* 例:tdmoutA 作回采 */
    datalb_chnum = <6>;
    status = "okay";
};

具体 resample_module、lane mask、时钟以原理图与平台文档为准。


五、loopbacka vs loopbackb:别混用

功能确认时的经验划分:

节点 典型通道 抗混叠
loopbacka 2 Mic + 6 Ref 支持(配合正确 resample / 16 kHz 路径)
loopbackb 2 Mic + 2 Ref 不支持抗混叠(或能力受限)

播放 48 kHz 时怎么选?(案例总结)

播放端是 48 kHz 时,更容易踩坑:

用法 结果(经验)
loopbackb、2 Ref、16 kHz 录、正确走 resample 易异常(采样率/路径不对)
打开 resample,却去录 loopbackb 48 kHz 易异常(声音先被 resample 打乱预期)
关闭 resample,loopbackb 48 kHz 录 2 Ref 可用;也可直接读 tdmlb 拿 48 kHz
打开 resample,loopbackb 16 kHz 可走「重采样到 16 kHz + 抗混叠」路径时声音正常

收束成两条产品用法:

  1. 要抗混叠、给唤醒用 16 kHz: 优先 loopbacka(2mic+6ref)+ 16 kHz,并保证 resample / 驱动顺序正确。
  2. 要 48 kHz 原样回采、不谈抗混叠:loopbackb + 关 resample(或读 tdmlb),不要强行「又要 48k 又要抗混叠」混在同一路径。
唤醒 16k + 抗混叠  →  loopbacka + resample 开 + 驱动顺序正确
48k 原样 Ref       →  loopbackb(或 tdmlb)+ resample 关

六、验收清单

  • 30%~50% 音量自播 1_15kHz.wav
  • tinycap 16 kHz、通道数与 loopback 一致
  • 频谱:无清晰 8 kHz 折返扫频;或 6/7 kHz 折痕能量满足 < −70 / −40 dB 类判据
  • sound_initpdm → loopback → resample
  • 16 kHz 抗混叠场景:resample okay,且挂接源正确
  • 产品路径选定:loopbacka@16kloopbackb@48k(关 resample),不混用

总结

Loopback 抗混叠测的不是「喇叭好不好听」,而是:16 kHz 采样前,有没有把 >8 kHz 滤干净
1_15kHz 自播自录是最快的照妖镜——折返就是不合格。修好驱动加载顺序、配准 resample 与 loopbacka/b 使用场景后,折痕应消失,唤醒侧才能吃到干净的 Mic+Ref。


相关阅读

评论

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

有想法?直接在这说,不用跑留言板