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的處理流程以及語音訊號在時域和頻域相互轉換時的一些細節。