来源:notes/sources/dg_audio_loopback/measurements.md

dg X5 麦克风/耳机链路实测记录(2026-09-20)

设备:D-Robotics RDK X5(dg,root@10.71.48.154),Ubuntu 22.04,内核 6.1.83,8×aarch64,3GB RAM 声卡:ES8326(i2c 7-0018,I2S0),单声卡 duplex-audio,唯一 PCM hw:0,0(播放/录音共用)

1. 支持的采样率(arecord -D hw:0,0,看 dmesg 是否报错)

采样率 结果 dmesg
8000 OK 无告警
16000 OK 无告警
32000 OK 无告警
48000 OK 无告警
22050 通但有告警 Clock coefficients do not match
44100 通但有告警 Clock coefficients do not match

根因:MCLK 固定(时钟树 dsp_i2s0_mclk = 24545455 Hz,即 24.576MHz 档),ES8326 驱动 get_coeff(mclk, rate) 要求 MCLK 精确命中系数表。44100 对应表项只有 2822400 / 5644800 / 11289600 / 22579200,24545455 命中不了 → 返回 -EINVAL → 驱动打印告警并跳过写 CLK_DIV1/2、CLK_DLL、CLK_MUX、ADC/DAC_SEL、OSR 等 8 个分频寄存器, codec 保持上一次(48000)的系数。

读回寄存器证实:48k 播放后 04=e0 05=00 06=00 07=2d 08=48 09=08 0a=1f 0b=1f, 正是表中 {512, 48000, 24576000, ...} 那一行。

2. 变调实测(声学回环:喇叭放音 → 麦克风录回)

播放采样率 录回的主峰频率 理论值 440×48000/44100
48000 440.0 Hz
44100 479.0 Hz 478.9 Hz

结论:绕开 PulseAudio 直接用 hw:0,0 播 44.1k 素材会升高约 8.84%(≈1.5 个半音)。 走 PulseAudio(aplay -D default)时 PA 会重采样到 48k,44.1k 和 48k 素材回录都是准确的 440 Hz。

3. Mixer 关键寄存器(原始值)

控件 numid dB
DAC Playback Volume 1 151 -20.0
HPL Playback Volume 19 151 -20.0
HPR Playback Volume 20 191 0.0
SPKL/SPKR Playback Volume 21/22 191 0.0
HPVol SPKVol Switch 23 0 HPVOL: HPL+HPL, SPKVOL: HPL+HPL
ADC Capture Volume 7 191/191 0.0
ADC PGA Volume 8 0/0 0.0
ADC PGA Gain Volume 9 8 +24.0
  • DACHPL同一个寄存器 ES8326_DACL_VOL,改一个另一个跟着变。
  • HPVol SPKVol Switch=0 时左右耳机音量都取 HPLHPR=191 实际不生效; 因此耳机输出被压在 -20 dB,想要满幅需把 HPL 提到 191。
  • 可用增益余量:ADC PGA 0→5(每级 6 dB,最多 +30 dB)、ADC PGA Gain 8→10(+6 dB)、 ADC Capture 191→255(+32 dB)。

4. 麦克风体检

项目 结果
声道结构 录制数据 L/R 完全相同 → 单麦克风复制到双声道
环境录音 10s RMS -44.9 dBFS
底噪(60s 的 10% 分位) -65.7 dBFS
直流偏置 +1.1
50 Hz / 100 Hz 工频 -98.5 / -89.5 dBFS(无工频干扰)
起始瞬态 前 ~20 个样本满刻度削波(录音起始爆音)
拾音验证 播放 1 kHz 测试音,麦克风该频点 -67.8 → -52.5 dBFS(+15.3 dB)

增益实验:ADC PGA 0→5(+30 dB)后整体电平 -47.3 → -17.1 dBFS(正好 +30 dB), 300–3400 Hz 频谱平坦度 0.264 → 0.226(几乎不变)→ 并没有隐藏的语音被挖出来。

5. 人声判定(关键,第一次判错了)

判据:短时自相关基频强度(40 ms 帧,lag 对应 70–350 Hz),> 0.3 视为浊音。

文件 浊音帧 基频范围 结论
mic_take.wav(第一次 10s) 11/40 = 28% 零星 少量浊音
mic_take2.wav(第二次 10s) 33/40 = 82% 85–160 Hz 起伏 确认有人说话

窄带语谱图(FFT 1024 @ 8 kHz,7.8 Hz/bin)里 mic_take2.wav 低频段出现清晰谐波横条, 且横条随语调上下摆动 —— 浊音特征。mic_take.wav 只有零星几小段。

教训:低电平人声(峰值仅 -53.9 dBFS,比底噪高 10–20 dB)不能靠电平/频段能量阈值判断, 必须用周期性/谐波性判据,否则会误判成”只有底噪”。

频谱分布:能量集中在 800 Hz 以下,1.5 kHz 以上很弱 → 擦音/辅音基本丢失, 这会明显拉低 ASR 准确率。

6. 回放程序实测

  • 3 秒冒烟:RMS -41.2 dBFS,削波 20(均为起始瞬态),回放成功
  • 10 秒正式:RMS -43.0 dBFS,退出码 0
  • 10 秒正式(mic_take2.wav,输出临时拉满 HPL=191):RMS -45.3 dBFS,退出码 0

7. 转写环境核查(未跑完)

端点 状态
pypi.org 200
github.com 200
hf-mirror.com 200
huggingface.co 000(不通)
alphacephei.com/vosk/models/ 403

可用 aarch64 wheel:faster-whisper 1.2.1ctranslate2 4.8.2onnxruntime 1.23.2vosk 0.3.45pip3 install faster-whisper 执行中被关机打断,未产出任何转写文本