webrtc的回聲抵消(aec、aecm)算法主要包括以下幾個重要子產品:
- 回聲時延估計
- 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。不過這個要看代碼所在位置,假如在晶片内部,時間還是比較少的,并且容易固定,假如在系統應用層軟體,整個時間就不确定了。相對比較大了。
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 的《自适應濾波器原理》。
非線性濾波器的原始資料與濾波結果是一種邏輯關系,即用邏輯運算實作,如最大值濾波器、最小值濾波器、中值濾波器等,是通過比較一定鄰域内的灰階值大小來實作的,沒有固定的模闆,因而也就沒有特定的轉移函數(因為沒有模闆作傅裡葉變換)。
webrtc采用了維納濾波器。此處隻給出傳遞函數的表達式,設估計的語音信号的功率譜為Ps(w),噪聲信号的功率譜為Pn(w),則濾波器的傳遞函數為H(w)=Ps(w)/(Ps(w)+Pn(w))。
舒适噪音生成(comfort noise generator,CNG)是一個在通話過程中出現短暫靜音時用來為電話通信産生背景噪聲的程式。
應用場景
- 延時要小,因為算法預設濾波器長度是分為12塊,每塊64點,按照8000采樣率,也就是12*8ms=96ms的資料,而且超過這個長度是處理不了的。
- 延時抖動要小,因為算法是預設10塊也計算一次參考資料的位置(即濾波器能量最大的那一塊),是以如果抖動很大的話找參考資料時不準确的,這樣回聲就消除不掉了。