天天看點

webrtc 的回聲抵消(aec、aecm)算法簡介

webrtc 的回聲抵消(aec、aecm)算法簡介      webrtc 的回聲抵消(aec、aecm)算法主要包括以下幾個重要子產品:1.回聲時延估計 2.NLMS(歸一化最小均方自适應算法) 3.NLP(非線性濾波) 4.CNG(舒适噪聲産生),一般經典aec算法還應包括雙端檢測(DT)。考慮到webrtc使用的NLMS、NLP和CNG都屬于經典算法範疇,故隻做簡略介紹,本文重點介紹webrtc的回聲時延估計算法,這也是webrtc回聲抵消算法差別一般算法(如視訊會議中的算法)比較有特色的地方。

1) 回聲時延估計      回聲延時長短對回聲抵消器的性能有比較大的影響(此處不考慮pc上的線程同步的問題),過長的濾波器抽頭也無法實際應用,是以時延估計算法就顯得比較重要了。常用且容易想到的估計算法是基于相關的時延估計算法(學過通信原理的應該不會陌生),另外相關算法在語音編碼中也得到廣泛的應用,如 amr系列,G.729系列 ,G.718等編碼器。在語音信号自相關求基音周期時,由于編碼器一般按幀處理,幀長度一般是10或20ms,在該時延範圍内搜尋基音周期運算量較小,然而對于回聲抵消的應用場合,延時搜尋範圍比較大,帶來很高的運算複雜度。在手持終端裝置上,我們需要考慮移動環境的變化對算法性能的影響,比如時延是否随機變化,反射路徑線性還是非線性,以及運算量(電池)是否符合要求,則更為複雜。

     回到webrtc的回聲時延估計,它采用的是gips首席科學家Bastiaan的算法。下面介紹一下該算法的主要思想: 設1表示有說話音,0表示無說話音(靜音或者很弱的聲音),參考端(遠端)信号x(t)和接收端(近端)信号y(t)可能的組合方式有以下幾種:(0,0),(0,1),(1,0),(1,1),  (0,0)表示遠端和近端都是比較弱的聲音,(1,1)表示遠端和近端都是比較強的聲音,webrt的c代碼預設其它兩種情況是不可能發生的。設在時間間隔p上,即p=1,2,...,P,  頻帶q,q=1,2,...,Q上,輸入信号x加窗(如漢甯窗)後的功率譜用Xw(p,q)來表示,對每個頻帶中的功率譜設定一個門限Xw(p,q)_threshold, 如果 Xw(p,q)  >= Xw(p,q)_threshold  ,   則Xw(p,q) =1; 如果 Xw(p,q) <    Xw(p,q)_threshold  ,   則Xw(p,q) =0; 同理,對于信号y(t),加窗信号功率譜Yw(p,q)和門限Yw(p,q)_threshold, 如果 Yw(p,q) >= Yw(p,q)_threshold   ,   則Yw(p,q) =1; 如果 Yw(p,q) < Yw(p,q)_threshold ,        則Yw(p,q) =0; 考慮到實際處理的友善,在webrtc的c代碼中,将經過fft變換後的頻域功率譜分為32個子帶,這樣每個特定子帶 Xw(p,q)的值可以用1個比特來表示,總共需要32個比特,隻用一個32位資料類型就可以表示了。 webrtc對參考信号定義了75個32位binary_far_history的數組存放曆史遠端參考信号,定義了16個32位binary_near_history的數組存放曆史近端參考信号,最近的值都放在下标為0的數組中,使用 binary_near_history[15]的32位bit與binary_far_history數組中75個32位bit分别按位異或,得到75個32位比特資料,32位bit的實體意義是近似地使用功率譜來統計兩幀信号的相關性。統計32位結果中的1的個數存于bit_counts中,接下來用對bit_counts進行平滑防止延時突變,得到mean_bit_count,可以看出  mean_bit_count 越小,則表明近端資料與該幀的遠端資料越吻合,兩者的時延越接近所需要的延時數值,用value_best_candidate表示。剩下的工作是對邊界數值進行保護,如果value_best_candidate接近最差延時(預設),則表明數值不可靠,這時不更新延時資料;如果資料可靠,則進一步使用一階markvo模型,比照上一次時延資料确定本次最終的更新時延last_delay.

Bastiaan的專利本身要比現有的c代碼實作更為複雜,比如在異或的時候(0,0),(0,1),(1,0),(1,1)四種組合可以附加代價函數,而c代碼相當于預設給(0,0),(1,1)附權重值為1,給(0,1),(1,0)附權重值為0;
另外c代碼算法是按幀順序依次對遠端和近端數組異或,實際應用時也可以每隔1幀或2幀做異或,這樣可以擴大搜尋範圍。
總的來說webrtc的時延估計算法複雜度比求相關大大簡化,尤其适用于移動終端等對運算量比較敏感的場合進行回聲消除。針對實際應用場合,算法還有提升的空間。
2) NLMS(歸一化最小均方自适應算法
     LMS/NLMS/AP/RLS等都是經典的自适應濾波算法,此處隻對webrtc中使用的NLMS算法做簡略介紹。
     設遠端信号為x(n),近段信号為d(n),W(n),則誤差信号e(n)=d(n)-w'(n)x(n)  (此處‘表示轉秩),NLMS對濾波器的系數更新使用變步長方法,即步長u=u0/(gamma+x'(n)*x(n));其中u0為更新步長因子,gamma是穩定因子,則濾波器系數更新方程為 W(n+1)=W(n)+u*e(n)*x(n);  NLMS比傳統LMS算法複雜度略高,但收斂速度明顯加快。LMS/NLMS性能差于AP和RLS算法。
    另外值得一提的是webrtc使用了分段塊頻域自适應濾波(PBFDAF)算法,這也是自适應濾波器的常用算法。
    自适應濾波的更多資料可以參考simon haykin 的《自适應濾波器原理》。
3) NLP(非線性濾波)
    webrtc采用了維納濾波器。此處隻給出傳遞函數的表達式,設估計的語音信号的功率譜為Ps(w),噪聲信号的功率譜為Pn(w),則濾波器的傳遞函數為H(w)=Ps(w)/(Ps(w)+Pn(w))。
4)CNG(舒适噪聲産生)
   webrtc采用的舒适噪聲生成器比較簡單,首先生成在[0 ,1 ]上均勻分布的随機噪聲矩陣,再用噪聲的功率譜開方後去調制噪聲的幅度。
總的說來,webrtc的aec算法簡單、實用、易于商業化,另一方面猜測c代碼還有所保留。

繼續閱讀