Webrtc AGC 算法原理介绍(四)(转)
零、前言
本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。
一、WebRtcAgc_ProcessAnalog
WebRtcAgc_ProcessAnalog函数的作用是把输入的信号根据能量的大小,饱和标志(WebRtcAgc_StaturationCtrl),零状态(WebRtcAgc_ZeroCtrl),以及近端语音活度(WebRtcAgc_SpeakerInactiveCtrl)的结果,来初步控制语音的大小。
1、预处理麦克风音量
对micVol进行调节。micVol决定了模拟初步调节的音量,将处理后的音量放到本文(7、调节流程)中说的范围中去,但是这个调节必须在AddVirtualMic中通过gainIndex起作用。
注意:在kAgcModeAdaptiveAnalog下,不调用AddVirtualMic,因此初步调节正常情况下不起作用(异常情况下回起作用)。在kAgcModeAdaptiveDigital下,GainControlImpl::set_stream_analog_level,其实不起作用,micVol起到初步调节的作用,micVol是粗调节的一个中间变量。
2、检查和处理饱和
根据信号的能力包络计算信号是否饱和(WebRtcAgc_StaturationCtrl)。该函数输出了饱和标志位saturated。
接下来根据标志位saturated来
1)降低micVol的大小,micVol*=0.903。
2)降低自相关系数(功率谱能量)大小,保证AGC中的VAD判决正常。
3)设置saturationWarning输出,该标志位只在此处修改。注意:如果kAgcModeAdaptiveAnalog一定进入WebRtcAgc_ProcessAnalog流程;kAgcModeAdaptiveDigital在位大能量的时候进入WebRtcAgc_ProcessAnalog流程;而kAgcModeFixedDigital不会调用该流程。
4)修改相关阈值。重置音量变化阈值msecSpeechInnerChange,OuterChange,改变模式changeToSlowMode,静音计数器muteGuardMs、调高界限upperLimit,调低界限lowerLimit,目的是摒除音量饱和对这些变量的影响,如果饱和,认为是不正常的语音不进行相关信息更新。降低太高标志位,目的是为了保证不要一下调低阈值。
3、零检查
对信号的包络进行低能量检查WebRtcAgc_ZeroCtrl,判断是否是“几乎”全部为0的数据。如果是,micVol调节到一半,对数据适当放大。
4、近端语音活度检查
对近端的语音活度检查WebRtcAgc_SpeakerInactiveCtrl。通过近端输入信号的方差来调节活度阈值vadThreshold。该阈值决定是否进入micVol和调节主流程。声音越小越难进入调节流程。
5、计算子带能量和总能量
计算子带低频能量Rxx16_LPw32和帧能量Rxx160w32。
6、根据vadMic.logRatio判断是否进入调节流程
7、调节流程
首先计算低频的全帧能量Rxx160_LPw32。该变量根据4个阈值划分成5个界限。
四个阈值分别是:
1)upperSecondaryLimit
2)upperLimit
3)lowerLimit
4)lowerSecondaryLimit
这四个数值的关系是1)>2)>3)>4),其中2)可以选择startUpperLimit和upperPrimaryLimit两个阈值;3)可以选择startLowerLimit和lowerPrimaryLimit两个阈值。在区间[2),3)]中,4000ms后可以触发慢变模式(changeToSlowMode),选择lowerPrimaryLimit,upperPrimaryLimit。
-单位(dB) | 正常模式 | 慢变模式 |
---|---|---|
upperSecondaryLimit | -15 | -15 |
upperLimit | -19 | -18 |
lowerLimit | -21 | -22 |
lowerSecondaryLimit | -25 | -25 |
下面是5个区间不同处理方法的流程图,其核心是对micVol进行调节,其目的是保证一个帧的能量在区间[2),3)]内,也即是初步调节的目的。
8、检查回声,保护标志和界限
保证回声状态和静音保护过程不被放大,并且检查micVol的界限。最后micVol的值通过VirtualMic和AddMic函数起作用。