解析自適應濾波回聲消除

回聲消除是語音信號處理領域比較常見的處理方法,基於自適應預測的回聲消除是其中比較基礎的一種。但在很多博客中卻沒有將其中的一些細節講清楚,導致讀者一頭霧水,這裏做一個詳細的總結。回聲分爲線路回聲和聲學回聲,本文重點關注聲學回聲。

1. 回聲產生及消除機制

回聲產生是由揚聲器和麥克風之間的聲波反射和聲學耦合引起的。如下圖所示,在電話會議系統中,揚聲器輸出信號由房間內的牆壁,地板和其他物體定向反射後產生的遠端產生語音信號被近端的麥克風接收,導致回聲被髮送回遠端。

由於回聲的存在干擾了正常的通信,因此人們希望消除回聲來更好的通信。一般的回聲消除算法都包含以下幾個步驟:

  1. 估計房間的回聲路徑的特徵

  2. 人爲生成回聲信號的拷貝

  3. 然後從麥克風信號中減去回聲

經過以上三個步驟就可以達到回聲消除的目的了。

2. 基於自適應濾波的回聲消除

因爲回聲路徑通常是未知且時變的,所以自適應濾波器是生成回聲信號的一個比較好的選擇,這裏我們使用最小均方誤差(Least Mean Square, LMS)算法設計自適應濾波器,其原理如下圖所示:

此時,對應於上一節的一般回聲消除算法,使用自適應預測的回聲消除步驟如下:

  1. 估計回聲路徑特性,我們訓練自適應濾波器,使得濾波的聲學特性接近於近端房間的聲學特性

  2. 通過我們訓練好的自適應濾波器,生成回聲

  3. 從麥克風信號中減去我們生成的回聲

這裏注意的是我們訓練自適應濾波器獲得房間的聲學特性,而很多博客介紹自適應濾波器的目的是直接輸出純淨語音。

我們把自適應濾波這部分單獨抽取出來研究如下圖所示,這就是一個FIR維納濾波器,其目的是使得輸出信號與期望信號的誤差最小,如果使用LMS來衡量這種誤差,那麼就是基於LMS的自適應濾波器。

 

我們假設濾波器權重爲w,階數爲p,期望信號(有的地方也叫參考信號)爲d(n),那麼濾波器輸出爲輸入信號x(n)和濾波器權重w的卷積:

那麼LMS誤差則爲:

而我們的目的是最小化這個誤差,因此需要更新濾波的權重,自適應濾波器的訓練採用隨機梯度下降法,沒錯就是神經網絡那個梯度下降。推到過程就不展開了,直接給出權重更新公式爲:

其中μ爲迭代步長,相當於神經網絡中的學習速率。以上就是基於LMS的自適應濾波器訓練過程。

其實完整的回聲消除流程如下圖所示,包括雙向通話檢測,自適應濾波和非線性處理。雙向通話檢測是由於近端有人說話時會干擾濾波器的期望輸出,導致濾波器無法正常收斂,因此當檢測當雙講時就停止濾波器係數更新。而非線性處理是抑制濾波後信號中的殘留回聲,因此可以劃分到回聲抑制範圍。

 

3. 回聲消除算法實現

真正工程上的AEC較爲複雜(可以參考開源的AEC算法,如WebRTC/Speex等),大致都如下面的流程圖所示。本文只是個Demo, 實現和最終的效果意思意思就可以了,因此NLP就不實現了。

下圖左聲道(上面的)是近端語音,右聲道(下面的)是遠端語音。

AEC的參數太難調了,隨便調了下看下效果就好。

本文完整的代碼可以在我的公衆號語音算法組菜單欄點擊FindMe->Github->SpeechAlgorithms獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章