Webrtc AGC 算法原理介紹(六)
零、前言
本系列介紹Webrtc的agc算法。webrtc的agc算法對各種情況作了較為詳盡的考慮,而且使用了的定點數的方法來實現,因此內容比較多。盡量在這幾篇文章中描述清楚。
一、WebRtcAgc_PRocessDigital
ProcessDigital是AGC的核心函數,無論什么模式都要調用到。現在來解釋一下。 該函數8khz的時候處理80個點的數據,16k處理160個點的數據,32k處理低頻160個點的數據。每個處理都是10ms。
1、首先計算了近端信號的VAD參數。并且當遠端信號超過10幀(100ms)后,使用遠端的VAD參數修正近端VAD,具體方法是: L=34Lnear?14Lfar 2、接著使用似然比L計算出衰減decay。 Ddecay=??????65,ifL>10,ifL<0?65L,else 如果是adaptive(無論,Analog或者Digital)中,對聲音小的情況,對decay修正。這個參數在計算慢包絡的時候使用。??
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[zeros?1]?Gtable[zeros]} 5、計算門限gate gate意味著衰減原來的增益。gate的計算可以看成兩部分,第一部分是基于快慢包絡計算出的似然比,相當于快包絡與慢包絡能量的倍數。第二部分是近端信號的短時方差。表達式如下: g≈?log(CslowCfast)+(3.91?STDST 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做一些限制,保證信號不要發生剪切。
6、使用gain 這部分比較簡單,對每一塊使用不同的gain,其中每個點的gain都在兩個gain[k]和gain[k+1]中差值獲得。 最后對處理后的信號進行幅度限制。