WebRTC 的回聲抵消(AEC、AECM)演算法簡介

來源:互聯網
上載者:User

原文轉載於:http://blog.csdn.net/u012931018/article/details/17045077  感謝博主。

webrtc的回聲抵消(Acoustic EchoCancellation,AEC、Acoustic EchoCancellation for Mobile,AECM)演算法主要包括以下幾個重要模組:回聲時延估計;NLMS(歸一化最小均方自適應演算法);NLP(非線性濾波);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)演算法,這也是自適應濾波器的常用演算法。自適應濾波的更多資料可以參考simonhaykin 的《自適應濾波器原理》。

3) NLP(非線性濾波)

webrtc採用了維納濾波器。此處只給出傳遞函數的運算式,設估計的語音訊號的功率譜為Ps(w),雜訊訊號的功率譜為Pn(w),則濾波器的傳遞函數為H(w)=Ps(w)/(Ps(w)+Pn(w))。

4)CNG(舒適雜訊產生)

webrtc採用的舒適雜訊產生器比較簡單,首先產生在[0,1 ]上均勻分布的隨機雜訊矩陣,再用雜訊的功率譜開方後去調製雜訊的幅度。

總的說來,webrtc的aec演算法簡單、實用、易於商業化,另一方面猜測c代碼還有所保留。

由於工作需要,最近一直在研究WebRTC裡的AEC演算法。根據源碼裡面的fullaec.m檔案,總體來說,我認為該AEC演算法是屬於分段快頻域自適應濾波演算法,Partionedblock frequeney domain adaPtive filter(PBFDAF)。具體可以參考Paez Borrallo J M andOtero M G

使用該AEC演算法要注意兩點:

1)延時要小,因為演算法預設濾波器長度是分為12塊,每塊64點,按照8000採樣率,也就是12*8ms=96ms的資料,而且超過這個長度是處理不了的。

2)延時抖動要小,因為演算法是預設10塊也計算一次參考資料的位置(即濾波器能量最大的那一塊),所以如果抖動很大的話找參考資料時不準確的,這樣回聲就消除不掉了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.