webrtc的回聲抵消(aec、aecm)算法主要包括如下幾個重要模塊:web
- 回聲時延估計
- NLMS(歸一化最小均方自適應算法)
- NLP(非線性濾波)
- CNG(溫馨噪聲產生)
回聲時延估計


這張圖不少東西能夠無視,咱們重點看T0,T1,T2三項。算法
- T0表明着聲音從揚聲器傳到麥克風的時間,這個時間能夠忽略,由於通常來講話筒和揚聲器之間距離不會太遠,考慮到聲音340米每秒的速度,這個時間都不會超過1毫秒。
- T1表明遠處傳到你這來的聲音,這個聲音被傳遞到回聲消除遠端接口(WebRtcAec_BufferFarend)的到播放出來的時間。通常來講接收到的音頻數據傳入這個接口的時候也就是上層傳入揚聲器的時刻,因此能夠理解成該聲音防到播放隊列中開始計時,到播放出來的時間。
- T2表明一段聲音被揚聲器採集到,而後到被送到近端處理函數(WebRtcAec_Process)的時刻,因爲聲音被採集到立刻會作回聲消除處理,因此這個時間能夠理解成麥克風採集到聲音開始計時,而後到你的代碼拿到音頻PCM數據所用的時間。
- delay=T0+T1+T2,其實也就是T1+T2。
通常來講,一個設備若是能找到合適的delay,那麼這個設備再作回聲消除處理就和降噪增益同樣幾乎沒什麼難度了。如iPhone的固定delay是60ms。不過這個要看代碼所在位置,假如在芯片內部,時間仍是比較少的,而且容易固定,假如在系統應用層軟件,整個時間就不肯定了。相對比較大了。dom
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)算法,這也是自適應濾波器的經常使用算法。該算法的原理以下:判斷遠端和近端是否說話的狀況,又稱爲雙端檢測,須要監測如下四種狀況:
1. 僅遠端說話, 此時有回聲,要利用這種狀態進行自適應濾波器的係數更新,儘快收斂
2. 僅近端說話, 這種時候是沒有回聲的,不用考慮
3. 雙端都在說話(Double Talk),此時係數固化,不進行係數更新
4. 雙端都沒有說話,這時候能夠掛電話了。。。這時候須要啓用近端VAD
- 自適應濾波的更多資料能夠參考simon haykin 的《自適應濾波器原理》。
NLP(非線性濾波)
非線性濾波器的原始數據與濾波結果是一種邏輯關係,即用邏輯運算實現,如最大值濾波器、最小值濾波器、中值濾波器等,是經過比較必定鄰域內的灰度值大小來實現的,沒有固定的模板,於是也就沒有特定的轉移函數(由於沒有模板做傅里葉變換)。函數
webrtc採用了維納濾波器。此處只給出傳遞函數的表達式,設估計的語音信號的功率譜爲Ps(w),噪聲信號的功率譜爲Pn(w),則濾波器的傳遞函數爲H(w)=Ps(w)/(Ps(w)+Pn(w))。性能
CNG(溫馨噪聲產生)
溫馨噪音生成(comfort noise generator,CNG)是一個在通話過程當中出現短暫靜音時用來爲電話通訊產生背景噪聲的程序。blog
webrtc採用的溫馨噪聲生成器比較簡單,首先生成在[0 ,1 ]上均勻分佈的隨機噪聲矩陣,再用噪聲的功率譜開方後去調製噪聲的幅度。接口
應用場景
webrtc AEC算法是屬於分段快頻域自適應濾波算法,Partioned block frequeney domain adaPtive filter(PBFDAF)。具體能夠參考Paez Borrallo J M and Otero M G隊列
使用該AEC算法要注意兩點:generator
- 延時要小,由於算法默認濾波器長度是分爲12塊,每塊64點,按照8000採樣率,也就是12*8ms=96ms的數據,並且超過這個長度是處理不了的。
- 延時抖動要小,由於算法是默認10塊也計算一次參考數據的位置(即濾波器能量最大的那一塊),因此若是抖動很大的話找參考數據時不許確的,這樣回聲就消除不掉了。