一起调试XVF3800麦克风阵列(十四)

1. 背景:为什么需要 ATTNS(Attenuation of Noise during Silence 静默期间噪声衰减)?

在音频前端处理中,AGC (Automatic Gain Control) 的核心作用是"补齐"音量:当人说话声音小时,AGC 会自动提高增益(Gain)。

然而,AGC 存在一个致命的副作用:呼吸效应(Breathing Effect)

  • 现象:在没人说话的间隙(Non-speech periods),AGC 检测到输入信号极小,会盲目地将增益推到最高。

  • 后果:环境中的底噪(如风扇声、空调声)被瞬间放大,听众会听到刺耳的"嘶嘶"声。

上方是输入信号(有语音和安静段),中间是增益曲线(安静时增益升高),下方是输出信号(安静段底噪被放大,出现呼吸效应)。

上图为宽动态范围 AGC 电路的波形响应,能看到增益在低电平信号时的快速调整,导致噪声泵升(pumping)。虽然是电路的AGC,但是同样在语音的应用也是一样的!能帮助我们更直观地理解为什么简单的 AGC 会在非语音段产生刺耳的底噪放大。

ATTNS (Attenuation of Noise during Silence 静默期间噪声衰减) 的出现,就是为了在 AGC 提高增益的同时,通过算法逻辑在静音期施加一个"反向力",压制被放大的噪声。在非语音期间(只有噪声,没有语音),额外降低AGC增益,减少输出噪声,提高安静时的用户体验;保持语音期间的正常增益,不影响语音质量。


2. ATTNS 核心参数定义

衰减因子 = PP_ATTNS_NOMINAL × (G_nominal / G_current)^PP_ATTNS_SLOPE

参数 全称/中文名称 默认值 有效范围 类型/索引/读写 功能概述
PP_ATTNS_MODE Attenuation during Non-Speech Mode / 非语音衰减模式 0 (off) 0 (off), 1 (on) int32 / 32 / READ_WRITE 开关控制:0=不衰减,1=启用衰减
PP_ATTNS_NOMINAL Attenuation Nominal / 非语音衰减标称值 1.0 [0.0 .. 1.0] float / 33 / READ_WRITE 标称增益时的衰减因子(1.0=无衰减,0.0=完全衰减)
PP_ATTNS_SLOPE Attenuation Slope / 非语音衰减斜率 1.0 [0.0 .. 5.0] float / 34 / READ_WRITE 控制衰减随 AGC 增益变化的指数斜率(0.0=固定衰减,1.0=线性恒定噪声)

PP_ATTNS_MODE适用情况:(默认未开启 0)

需要降低安静时的背景噪声

希望保持输出噪声水平相对恒定

对安静环境有较高要求

非语音时,AGC增益会被额外衰减

衰减量由 PP_ATTNS_NOMINAL 和 PP_ATTNS_SLOPE 控制

输出噪声水平更稳定

PP_ATTNS_NOMINAL - 标称衰减量

功能:定义在标称语音水平时,非语音期间的额外衰减量

取值范围:[0.0 .. 1.0]

默认值:1.0(无衰减)

单位:衰减因子(1.0 = 无衰减,0.5 = 衰减到50%,0.0 = 完全衰减)

初始AGC增益(AGCGGAIN_INIT)

初始AGC增益(AGCGGAIN_INIT)是系统在初始化时或参考条件下的AGC增益值。

通常由系统设计时确定

可能基于典型输入功率和期望输出功率计算

例如:如果期望输出功率是0.0045,典型输入功率是0.00045,则初始增益约为10.0也可能是系统启动时的初始增益值,或某个参考条件下的固定值

作为衰减计算的参考基准

在初始增益时,衰减量 = PP_ATTNS_NOMINAL

当当前AGC增益偏离初始增益时,衰减量会根据斜率调整

关键特性:当 ATTNS_SLOPE = 1.0时,输出噪声水平与当前增益无关,只与初始增益相关。

PP_ATTNS_SLOPE = 1.0 时,衰减因子的设计让最终输出噪声功率跟当前 AGC 增益完全无关,只取决于两个固定值。

衰减因子 =

PP_ATTNS_NOMINAL × (G_nominal / G_current) ^ 1.0

PP_ATTNS_NOMINAL × (G_nominal / G_current)

最终增益: G_final =

G_current × 衰减因子 = G_current × PP_ATTNS_NOMINAL × (G_nominal / G_current)

PP_ATTNS_NOMINAL × G_nominal

系统会把最终的增益 强制压到一个恒定的值 ,也就是: G_final = PP_ATTNS_NOMINAL × G_nominal (一个固定常数,不随环境变化)。

PP_ATTNS_SLOPE - 衰减斜率

功能:控制衰减量随AGC增益变化的斜率

取值范围:[0.0 .. 5.0]

默认值:1.0

单位:指数(幂次)

PP_ATTNS_SLOPE 衰减特性 输出噪声水平 适用场景
0.0 固定衰减 随增益变化 简单场景
0.5 温和衰减 随增益变化 需要温和降噪
1.0 线性衰减 恒定 推荐,平衡
2.0 激进衰减 随增益变化 需要强降噪
5.0 极激进衰减 随增益变化 极端场景

3. 针对 Zoom/Teams 规范的调试指南

根据 Zoom Rooms 7.4.3 规范,测试重点在于测量"标称语音水平下的噪声"与"低语音水平下的噪声"的比率。

准备工作

在开始前,必须确保 AGC 基础参数 (PP_AGCGAIN, PP_AGCMAXGAIN) 已经调优完成。

第一阶段:调试 ATTNS_NOMINAL (基础抑制)

该步骤旨在设定一个在正常说话间隙时的基础底噪水平。

复制代码
xvf_host --use i2c PP_AGCONOFF 1
xvf_host --use i2c PP_ATTNS_MODE 1
xvf_host --use i2c PP_ATTNS_NOMINAL 1.0
xvf_host --use i2c PP_ATTNS_SLOPE 0.0  # 先将斜率设为0
  1. 输入测试信号 :播放 ITU P.501 标准语音(如 FB_male_female_single-talk_seq.wav)。

  2. 调整逻辑

    • 监测句子结束 1 秒后 的 A 计权噪声(Average A-weighted noise)。

    • 逐渐增加 ATTNS_NOMINAL 的值(如从 1.0 增加到 2.0),直到该噪声水平符合规范要求的比率。

A计权噪声 就是"用人耳听起来有多吵"来衡量的噪声值,而不是机器测到的原始声压。它在语音处理和噪声控制中特别重要,因为它让测试结果更贴近真实听感------比如你调 ATTNS 时,就是想让句子结束后那1秒的残余噪声,在人耳听来足够安静(A计权值低到可接受范围)。

在 MATLAB 中 Audio Toolbox(推荐,精确):

Matlab 复制代码
% 假设你的噪声段信号为 noise_signal, fs = 48000;
% 使用 weightingFilter (Audio Toolbox)
aWeight = weightingFilter('A-weighting', 'SampleRate', fs);
filtered_noise = aWeight(noise_signal);

% 计算平均 A计权声压级 (RMS to dB)
rms_value = rms(filtered_noise);
level_dBA = 20 * log10(rms_value / 2e-5);  % 参考 20 μPa
disp(['平均 A计权噪声水平: ', num2str(level_dBA), ' dB(A)']);

第二阶段:调试 ATTNS_SLOPE (动态补偿)

该步骤解决 AGC 在极端高增益情况下的噪声失控问题。

复制代码
xvf_host --use i2c PP_ATTNS_SLOPE 1.0
  1. 初始化环境 :保持上一步确定的 NOMINAL 值。

  2. 输入测试信号:使用不同声压级(如 -20dB, -30dB)的弱语音信号。

  3. 调整逻辑

    • 当 AGC 为了补偿弱语音而快速提升增益时,观察噪声是否随之大幅上涨。

    • 增加 ATTNS_SLOPE(> 1.0)可以提供更激进的动态抑制。


4. 总结与最佳实践

  • 平衡点ATTNS 不是越大越好。如果参数过激,会导致语音的 Onset(起头音) 被误杀,出现吞字现象。

  • 同步微调NOMINALSLOPE 相互关联。调大其中一个,可能需要微调另一个以保持平衡。

  • 认证关键 :Zoom/Teams 认证非常看重 静音期的稳定性。ATTNS 的调试结果直接决定了信噪比(SNR)测试是否达标。

但是我们看到的是默认官方源码和固件是关闭 ATTNS 的,这是为了最大程度兼容主流认证规范(如 Teams/Zoom)、避免引入不必要的语音质量风险、保持自然听感,把"额外噪声压制"作为可调的高级选项,让开发者根据实际产品需求(如更强的静音期降噪)再开启和微调,而不是强制所有人用同一套激进设置。

  • XVF3800 的默认调优参数主要是针对 Microsoft Teams V5 "Personal Space Speakerphone" 规范(以及 Zoom Rooms 等类似认证)优化的。
  • 这些规范对噪声抑制有明确要求,但更严格的是 语音清晰度、PESQ/POLQA 分数、回声抑制 等指标。
  • 如果默认开启 ATTNS(非语音额外衰减),在某些测试场景下可能会导致:
    • 非语音段噪声压得太低,影响"噪声与语音比率"(noise-to-speech ratio)的平衡。
    • 某些认证测试(如低电平语音下的噪声测量)出现异常,因为规范往往指定"nominal speech level vs low speech level 的噪声比率",而 ATTNS 会干扰这个比率的自然表现。
相关推荐
风象南5 小时前
Token太贵?我用这个数据格式把上下文窗口扩大2倍
人工智能·后端
NAGNIP14 小时前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
moshuying15 小时前
别让AI焦虑,偷走你本该有的底气
前端·人工智能
董董灿是个攻城狮16 小时前
零基础带你用 AI 搞定命令行
人工智能
喝拿铁写前端18 小时前
Dify 构建 FE 工作流:前端团队可复用 AI 工作流实战
前端·人工智能
阿里云大数据AI技术19 小时前
阿里云 EMR Serverless Spark + DataWorks 技术实践:引领企业 Data+AI 一体化转型
人工智能
billhan201619 小时前
MCP 深入理解:协议原理与自定义开发
人工智能
Jahzo19 小时前
openclaw桌面端体验--ClawX
人工智能·github
billhan201619 小时前
Agent 开发全流程:从概念到生产
人工智能