webRTC中語音降噪模組ANS細節詳解(一)

ANS(adaptive noise suppression) 是webRTC中音頻相關的核心模組之一,為眾多公司所使用。從2015年開始,我在幾個產品中使用了webRTC的3A(AEC/ANS/AGC)模組。以前僅僅是使用,對其中的演算法原理只是初步了解。近半年來,我利用業餘時間在看著《語音增強:理論與實踐》和《實時語音處理實踐指南》這兩本書,對降噪演算法有了更深的理解,同時又對ANS的程式碼進行了調試,基本掌握了演算法實現。我想把我對ANS的理解寫出來。由於內容細節較多,就出一個系列吧。webRTC中的ANS是基於維納濾波來降噪的,本篇就先講講維納濾波的基本原理。

 

如圖1所示,輸入訊號y(n)經過一個濾波器後產生一個輸出訊號x(n),希望x(n)盡量逼近期望訊號d(n)。這可以通過計算估計誤差e(n)並使其最小化來實現,能夠最小化這個估計誤差的最優濾波器叫做維納濾波器。

通常維納濾波器為線性的,且是FIR濾波器,因為FIR濾波器是穩定的,以及它是線性的方便計算。因而濾波器輸出x(n)可以寫成式1:

                                                       (1)

其中h(k)為濾波器係數,M為濾波器個數,即是M階的濾波器。x(n)可以改寫成式2:

                                                                                               (2)

其中h為M行1列的濾波器係數向量,y為M行1列的包括過去M個樣本的輸入向量。h和y表示如下:

所以是一個實數值。

估計誤差e(n)可以表示如式3:

                                                                     (3)

為了找到最優的濾波器係數,得求估計誤差的統計均方值,即式4:

                                                                                                   (4)

其中E[•]表示期望。因為

所以

 令

從而得到式5:

                                                             (5)

展開後得到如下系列式子:

 

因為

所以

定義表示兩個輸入值之間的自相關,n表示序列差。所以:

再定義表示輸入值和期望輸出值之間的互相關,n表示序列差。所以:

 

所以上面式子5可以改寫成式子6

      (6)

展開後得式7:

                                  (7)

再改寫成如下形式,得到式8:

                                                 (8)

上面的式8是有限脈衝響應濾波器。再來考慮一種雙邊的無限脈衝濾波器,形式如式9:

                                                        (9)

則式8可寫成式10:

                                              (10)

寫成卷積形式,得到式11:

                                                                                         (11)

對兩邊做傅里葉變換,時域卷積變成頻域就是乘積,所以得到式12:

                                                                                      (12)

其中是輸入的自功率譜,自功率譜等於自相關的傅里葉變換。 是輸入與輸出的互功率譜,互功率譜等於互相關的傅里葉變換。所以得到式13:

                                                                                                  (13)

上式就是頻域維納濾波器的一般形式。

 

如果要把維納濾波用到語音降噪上,圖1中的y(n)就是帶噪語音訊號,x(n)就是純凈語音訊號。假設n(n)表示雜訊訊號,如果只考慮加性雜訊,則帶噪語音訊號、純凈語音訊號和雜訊訊號的關係如下:y(n) = x(n) + n(n),做傅里葉變換後的表達式如下:

 假設雜訊與語音不相關且具有零均值,則

 

 

其中表示純凈語音的自功率譜,表示雜訊的自功率譜。

帶入式13可得式14:

                                                                               (14)

如果定義為頻點為時的先驗信噪比(prior SNR,表示純凈語音和雜訊的功率比值,後驗信噪比(post SNR)表示帶噪語音和雜訊的功率比值) ,則式14可以表示為式15:

                                                                                          (15)

式15就是維納濾波器的通用的表示形式,是用先驗信噪比來表示的。webRTC里的ANS就是基於這個表達式做語音降噪的。下篇將講ANS的處理流程以及語音訊號在時域和頻域相互轉換時的一些細節。