拖了快一个月了,终于有时间来将所研究的WebRTC中的自动增益控制(AGC)模块的内容进行下系统的整理。目前个人了解的还很初步,有很多东西还没有研究透彻,所以这部分分析整理可能会比较浅薄,后续随着研究的深入,内容会不断完善。

本次先更新第一部分,包括WebRTC的AGC模块的介绍、框图、函数关系图和函数功能介绍等。下一期更新具体的函数原理内容。

1.AGC模块的简介和性能结果

WebRTC的音频处理模块分为语音活动检测(VAD)、降噪(NS和NSX)、回音消除(AEC)、回声控制(AECM)和音频增益(AGC)等5个部分。本次我要介绍的是其中的自动增益控制(AGC)部分,其代码主要位于WebRTC的modules\audio_processing\agc\legacy中。

什么时候用得到增益控制呢?实际上,当对语音的响度进行调整的需要时,就要做语音自动增益(AGC)算法处理,平时的语音聊天都会用到这个算法。

最简单的方法就是对所有的音频采样乘上一个增益系数,由于人的听觉对所有频率的感知不是线性的,所以会导致这样处理以后,听起来有的频率增强了、有的频率削弱了,导致了语音失真的方法。所以,要让整个频段听起来响度增益都是相同的,就必须在遵循响度曲线基础上,在响度这个尺度做增益,即按照响度曲线对语音的频率进行加权。

本工程以10ms为单位对语音进行模拟和数字增益的自适应调整。增益的调整仅在语音活动期间进行,语音的长度必须依照程序中所给的长度(8000Hz时为80个点,16000Hz、32000Hz和48000Hz为160个点)。本程序必须在进行回声消除后,在近端麦克风信号进行调用。

在这里介绍的时候,我以Github上的工程(https://github.com/cpuimage/WebRTC_AGC)为例进行讲解WebRTC中AGC的过程。

该方法的效果,如图1.1所示。

图1.1 语音效果图像

2.AGC的整体框图和函数关系图

2.1 AGC模块整体框图

图2.1 AGC模块整体框图

2.2 AGC模块函数关系图

表2.1 AGC模块函数关系图
表2.2 AGC模块函数功能解释
表2.3 其它相关函数功能及解释

2.4 使用到的常量

1.全通滤波器因子:

static const uint16_t kResampleAllpass1[3]= {3284, 24441, 49528};

static const uint16_t kResampleAllpass2[3]= {12199, 37471, 60255};

2.AGC的四种工作模式

表2.4 AGC的四种工作模式

2.5 使用到的结构体

    WebRtcAgc_config是配置targetLevelDbfs和compressionGaindB用于调节agc的动态范围。

typedef struct { int16_t targetLevelDbfs; // default 3 (-3 dBOv) int16_t compressionGaindB; // default 9 dB uint8_t limiterEnable; // default kAgcTrue (on)} WebRtcAgcConfig;typedef struct { int32_t downState[8]; int16_t HPstate; int16_t counter; int16_t logRatio; // log( P(active) / P(inactive) ) (Q10) int16_t meanLongTerm; // Q10 int32_t varianceLongTerm; // Q8 int16_t stdLongTerm; // Q10 int16_t meanShortTerm; // Q10 int32_t varianceShortTerm; // Q8 int16_t stdShortTerm; // Q10} AgcVad; typedef struct { int32_t capacitorSlow; int32_t capacitorFast; int32_t gain; int32_t gainTable[32]; int16_t gatePrevious; int16_t agcMode; AgcVad vadNearend; AgcVad vadFarend;#ifdef WEBRTC_AGC_DEBUG_DUMP FILE* logFile; int frameCounter;#endif} DigitalAgc;