拓展 - 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代碼還有所保留。web

 

因爲工做須要,最近一直在研究WebRTC裏的AEC算法。根據源碼裏面的fullaec.m文件,算法

整體來講,我認爲該AEC算法是屬於分段快頻域自適應濾波算法,Partioned block frequeney domain adaPtive filter(PBFDAF)。具體能夠參考Paez Borrallo J M and Otero M G數組

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

1)延時要小,由於算法默認濾波器長度是分爲12塊,每塊64點,按照8000採樣率,也就是12*8ms=96ms的數據,並且超過這個長度是處理不了的。函數

2)延時抖動要小,由於算法是默認10塊也計算一次參考數據的位置(即濾波器能量最大的那一塊),因此若是抖動很大的話找參考數據時不許確的,這樣回聲就消除不掉了。性能

相關文章
相關標籤/搜索