一起调试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 会干扰这个比率的自然表现。
相关推荐
EverydayJoy^v^2 分钟前
RH134学习进程——十二.运行容器(1)
linux·运维·容器
syseptember3 分钟前
Linux网络基础
linux·网络·arm开发
Niuguangshuo6 分钟前
深入解析Stable Diffusion基石——潜在扩散模型(LDMs)
人工智能·计算机视觉·stable diffusion
迈火10 分钟前
SD - Latent - Interposer:解锁Stable Diffusion潜在空间的创意工具
人工智能·gpt·计算机视觉·stable diffusion·aigc·语音识别·midjourney
wfeqhfxz258878214 分钟前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a26 分钟前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
zl_dfq28 分钟前
Linux 之 【多线程】(线程的概念、Linux中的线程、页表)
linux
Li emily43 分钟前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
Aaron15881 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
J_Xiong01171 小时前
【Agents篇】04:Agent 的推理能力——思维链与自我反思
人工智能·ai agent·推理