歡迎加入webrtc學習群(659922087)獲取免費學習資源,共同交流、成長。
webrtc
的回聲抵消
(aec、aecm)演算法主要包括以下幾個重要模組:回聲時延估計;nlms(歸一化最小均方自適應演算法);nlp(非線性濾波);cng(舒適雜訊產生)。一般經典aec演算法還應包括雙端檢測(dt)。
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**還有所保留。
由於工作需要,最近一直在研究webrtc裡的aec演算法。根據原始碼裡面的fullaec.m檔案,總體來說,我認為該aec演算法是屬於分段快頻域自適應濾波演算法,partioned block frequeney domain adaptive filter(pbfdaf)。具體可以參考paez borrallo j m and otero m g
使用該aec演算法要注意兩點:
1)延時要小,因為演算法預設濾波器長度是分為12塊,每塊64點,按照8000取樣率,也就是12*8ms=96ms的資料,而且超過這個長度是處理不了的。
2)延時抖動要小,因為演算法是預設10塊也計算一次參考資料的位置(即濾波器能量最大的那一塊),所以如果抖動很大的話找參考資料時不準確的,這樣回聲就消除不掉了。
WebRTC回聲消除(1)
語音通話中回聲分為兩種 1.電路回聲 已經被解決 2.聲學回聲 webrtc源 中設計了兩個回聲消除模組 1.aec acoustic echo canceller 電腦端 2.aecm acoustic echo canceller mobile 移動端 aecm 產生聲學回聲的原因 近端說話者的...
硬體設計13 什麼是回聲抵消?
回聲消除 echo cancellation 又稱回聲抑制 echo suppression 是電路 移動 voip等語音裝置提公升語音質量的一項重要技術。那什麼是回聲呢?1.回聲 回聲本質上是自己的聲音經過一段時間後又傳回到自己耳朵中,如果回聲的時延小於10ms,則稱為側音,時延如果在50ms左右...
speex與webrtc回聲消除小結
回聲消除aec包含 延時估計對齊 線性自適應濾波器 nlp 雙講檢測 處理 舒適雜訊cng 一 speex aec 1 沒有nlp 2 只考慮實時dsp系統,即是沒有延時對齊等 3 自適應濾波 mdf 使用雙濾波器結構,自適應濾波器因子自動更新 二 webrtc aec 1 雙講檢測沒有,雙講時遠端...