一、前言
XVF3800 的实际性能很大程度上取决于其所集成到的最终产品的电气和声学环境,为了达到最佳性能,包括通过产品认证测试,必须执行配置和调优过程,使固件适应最终产品的外形尺寸和硬件设计。
扬声器相关参数(例如均衡器和非线性模型)需要进行调整才能达到最佳性能(小型扬声器通常会在 100-200 Hz 处进行增益,以增强低音效果。为了满足规格要求,可能需要消除这种增益)。通俗来说就是:
小型扬声器通常通过在 100--200 Hz 人为增强能量来改善听感低频,但这种做法会显著增加失真、功耗和系统不稳定性。在满足声学指标、可靠性要求以及语音算法性能时,往往需要重新调整均衡器并配合非线性模型,降低甚至去除该频段的增益。

默认情况下,这些参数不进行任何均衡或非线性校正。即我们暂时不在这里讨论扬声器的优化调参工作!
二、XVF3800的系统框图
如图为整个系统的框图,显示从输入到输出的音频路径。这有助于了解如何优化和控制整个产品的性能。确保图中显示了从参考输入到扬声器以及从麦克风到 XVF3800 的路径,包括所有应用的增益、均衡、压缩、滤波和限幅效果。同时,务必充分理解哪些点可以控制这些参数(更重要的是,哪些点无法控制)。

三、调优工具
所有调音工具和音频轨道都包含在发行包中:
-
sources/modules/fwk_xvf/modules/eq_filter_tuning/eq_filter_tuning/ -
sources/modules/fwk_xvf/modules/tuning/ -
sources/app_``xvf3800``/nl_model_gen/
官方的文档是这么说的,我们大概猜一下着几个工具是干什么的:
sources/modules/fwk_xvf/modules/eq_filter_tuning/eq_filter_tuning/ 均衡器滤波器调优工具
用于设计和调优音频均衡器(EQ)滤波器参数。
用于根据产品声学特性定制频率响应,补偿麦克风或扬声器的频率特性。
sources/modules/fwk_xvf/modules/tuning/ 通用调优工具集
提供多种音频处理和调试工具,用于调优和诊断 XVF3800 设备。方位角(DOA)可视化工具
麦克风相干性分析工具;AGC 增益可视化工具;AEC 滤波器分析工具;麦克风-参考信号相关性分析;打包音频录制工具。
用于调试、分析和调优 XVF3800 的音频处理算法,包括声源定位、回声消除、增益控制等。
sources/app_xvf3800/nl_model_gen非线性模型生成工具
**用于训练和生成非线性回声抑制(NL AEC)模型。非线性模型训练工具(本地);非线性模型训音频文件:
- `nlaec0_16k.wav` / `nlaec0_16k_stereo.wav`:用于训练的音频文件(0dB 增益)
- `nlaec12_16k.wav` / `nlaec12_16k_stereo.wav`:用于训练的音频文件(12dB 增益)
用于针对特定硬件和声学环境训练非线性回声抑制模型,提升回声消除性能,特别是在非线性失真场景下。**
**EQ 滤波器调优流程
- 使用 `ploteq.py` 交互式调整 EQ 参数
- 导出为 `.dat` 二进制文件
- 使用 `gen_eq_filter_c_file.py` 生成 C 代码文件
- 编译到固件中**
**算法调优流程
- 使用 `doa_plot.py` 可视化声源定位
- 使用 `coherence.py` 检查麦克风一致性
- 使用 `read_aec_filter.py` 分析 AEC 性能
- 使用 `agc_gain_plot.py` 监控增益控制
- 使用 `mic_ref_correlate.py` 诊断延迟问题**
**非线性模型训练流程
- 准备音频文件(16kHz 立体声)
- 运行 `nl_model_training.py` 或 `remote_nl_model_training.py`
- 获取生成的 `.bin` 模型文件
- 将模型文件复制到 `nlmodel_bin/` 目录
- 重新编译固件**
这里想说的就是,麦克风阵列的实际部署是需要根据实际情况进行部署的~!!存在一个调优的过程!
四、初始参数设计
AEC_HPFONOFF
此功能会在麦克风信号进入处理模块时设置一个高通滤波器 (HPF) ;该滤波器采用四阶巴特沃斯滤波器形式,因此具有每十倍频程 -80 dB 的下降。此高通滤波器的截止频率(-3 dB 点)可设置为 70 Hz、125 Hz(默认参数)、150 Hz 或 180 Hz,也可以禁用该滤波器。建议使用高通滤波器以避免在语音频段之外传输低频噪声。应设置高通滤波器的频率,使系统组合截止频率(声学箱体和 DSP 高通滤波器)低于规范要求的最低频率。通常,规范要求系统在 200 Hz 以上保持平坦。(低频 = 大能量 + 低信息 + 难建模,AEC难以收敛)

AEC_FAR_EXTGAIN
此参数用于告知音频管道已对 AEC 参考信号应用了多少外部增益。此参数的值与设备的音量控制相关;例如,如果设备将信号衰减 -6 dB,则此值应设置为 -6。在 UA 设备版本中,当主机设置输出音量时,AEC_FAR_EXTGAIN 会在内部设置为与主机设置的增益相同,因此用户无需在外部设置此命令。在I2S 设备版本中,如果更改了主机上的外部增益,则用户需要使用控制界面手动设置 AEC_FAR_EXTGAIN 以匹配外部增益 。这里默认的固件是0,没有增益!即参考信号与远端信号的增益要保持同步,保证回声消除的效果~
PP_LIMITONOFF and PP_LIMITPLIMIT
-
功率限制器用于 控制输出音频信号的最大能量 ,避免过大信号导致削波(clipping)或过载(默认开启,1)。
-
它会监测预测输出能量,如果超过设置阈值,会自动对输出信号进行压缩(默认0.47)。
五、测试环境的实际输入输出路径

如图所示我们的I2S信号直接由树莓派5输出给喇叭,并且直接给XVF3800进行参考~!
控制路径(I2C)
xvf_host --use i2c VERSION
返回3 2 1代表成功

输出路径
xvf_host --use i2c AUDIO_MGR_OP_UPSAMPLE
我们这里是以音频处理是降采样后16Khz,而且是在非打包模式下输出的,I2S以48Khz采样率输出,所以看到他们的值是1,1(如果音频输出采样率是16Khz则此处的值应该设置为0 , 0)

xvf_host --use i2c AUDIO_MGR_OP_ALL
输出为如下6个16Khz的通道:

MUX_USER_CHOSEN_CHANNELS[8] 0 对应为L_PK0
MUX_RAW_MICS[1] 0 对应为L_PK1
MUX_RAW_MICS[1] 2 对应为L_PK2
MUX_SILENCE[0] 0 对应为R_PK0
MUX_RAW_MICS[1] 1 对应为R_PK1
MUX_RAW_MICS[1] 3 对应为R_PK2
这里先解释一下PK0 / PK1 / PK2 是打包模式下的三个时隙,目的是将多个16KHz的音频打包到一个48KHz的音频输出通道中。因为标准的I2S音频格式一般为48Khz,前面我们看到PDM麦克风降采样192后到16KHz在DSP内部处理,故我们有6×16KHz的带宽音频,可以放置到一条I2S通道数据即可,6x16Khz = 1数据线 × 2通道 x 3 × 16Khz打包。
但是!为什么我们前面输出的时候左右通道又是单个通道?

那是因为我们在非打包模式下:
xvf_host --use i2c AUDIO_MGR_OP_PACKED

所以这里我们如果要输出I2S的远端信号就必须先开启打包模式,再以打包模式分别设置L_PK0
L_PK1L_PK2R_PK0 R_PK1R_PK2输出分别为10号通道的0-5索引
xvf_host --use i2c AUDIO_MGR_OP_UPSAMPLE 0 0
xvf_host --use i2c AUDIO_MGR_OP_ALL 10 0 10 2 10 4 10 1 10 3 10
这里我们依照上面的路径我们的参考信号是I2S的播放,即测试的时候我们需要播放音频文件再开启录音就能观察到整个参考音频的信号是否正常!

这里按照官方的文档,我们目前没有条件调试扬声器的环境,这个作为一个后面的专栏我们再进行讨论测试!