Webrtc AGC 算法原理介绍(六)

来源:互联网 发布:男生发型设计软件 编辑:程序博客网 时间:2024/05/21 15:00

Webrtc AGC 算法原理介绍(六)


零、前言

本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。

一、WebRtcAgc_ProcessDigital

ProcessDigital是AGC的核心函数,无论什么模式都要调用到。现在来解释一下。
该函数8khz的时候处理80个点的数据,16k处理160个点的数据,32k处理低频160个点的数据。每个处理都是10ms。
WebRtcAgc_ProcessDigital流程图1
1、首先计算了近端信号的VAD参数。并且当远端信号超过10帧(100ms)后,使用远端的VAD参数修正近端VAD,具体方法是:
L=34Lnear14Lfar
2、接着使用似然比L计算出衰减decay。
Ddecay=65,ifL>10,ifL<065L,else
如果是adaptive(无论,Analog或者Digital)中,对声音小的情况,对decay修正。这个参数在计算慢包络的时候使用。??
WebRtcAgc_ProcessDigital流程图2
3、计算每1ms的最大能量作为包络env。
4、通过快、慢包络和增益表计算出增益数组gain
这个部分,首先计算了快慢包络。
Cfast={1000Cfast+Cfast,evn[k]<Cfastevn[k],evn[k]Cfast

Cslow={C2slow+decay,evn[k]<Cslow500(evn[k]Cslow)+Cslow,evn[k]Cslow
然后,两个包络的最大值作为level=max(Cslow,Cslow)
最后,使用LOG2的分段线性函数把cur_level转换成gain。LOG2的整数部分是cur_level前面0的个数,如果0越少,说明数值越大,最多是31个0,最少1个0(有符号数)。小数部分用线性差值的方法,找到gain[zeros],gain[zeros-1]中间的量。
g[k+1]=Gtable[zeros]+f{Gtable[zeros1]Gtable[zeros]}
5、计算门限gate
gate意味着衰减原来的增益。gate的计算可以看成两部分,第一部分是基于快慢包络计算出的似然比,相当于快包络与慢包络能量的倍数。第二部分是近端信号的短时方差。表达式如下:
glog(CslowCfast)+(3.91STDST near)
先看第一部分,这里说log(Cfast)对应于zeros_fast,这个东西是快包络大的时候它值小,log(Cslow)对应于zeros,这个东西是慢包络大的时候它值小。第一部分说明,fast与slow包络的距离越大,也即是出现语音的可能性越大,gain越小。
第二部分是定值减去vadNearend.stdShortTerm。无疑,语音出现可能性越大,vadNearend.stdShortTerm越大,第二部分越小,gain越小。
计算完gain后,使用上次计算值对它平滑处理。
g=0.125g+0.875gold
平滑后,把门限转换成gain_adj。
g[k+1]=(1(0.6953+gadj))GT[0]+(0.6953+gadj)g[k+1]
g[k+1]=(1αadj)GT[0]+αadjg[k+1]
gain_adj的值在0, 0.304之间,因此上公式中的αadj在[0.304,1]。
当gate最小的时候为0(语音),gain_adj取到最大,此时不使用gainTable[0]的值作为参考;
当gate最大的时候为2500(噪声),gain_adj取到最小,此时g[k+1]要取到相对于gainTable[0]的值的70%;
当gate处于最大最小值之间,g[k+1]在gainTable[0]和g[k+1]确定的这条直线上移动。
接着再根据信号的大小对gain做一些限制,保证信号不要发生剪切。
WebRtcAgc_ProcessDigital流程图3
6、使用gain
这部分比较简单,对每一块使用不同的gain,其中每个点的gain都在两个gain[k]和gain[k+1]中差值获得。
最后对处理后的信号进行幅度限制。

0 0
原创粉丝点击