WebRTC中AGC模块分析(上)

拖了快一个月了,终于有时间来将所研究的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;

4 thoughts on “WebRTC中AGC模块分析(上)

  1. 作者你好,最近在看webrtc_agc,在vad之前首先进行了downsampleBy2,将16kHz或8kHz都降到4kHz。downsampleBy2函数用到了全通滤波器因子,请问这部分是什么意思,它是如何实现降采样的呢?
    万分感谢!

    1. AGC这部分其实我看过去蛮久的了,虽然是8月份发到博客上。我刚刚稍微看了下代码,感觉这部分之所以要进行下采样可能与WebRTC中VAD的下采样有异曲同工之妙。具体我再研究下回复你。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注