webRTC中語音降噪模組ANS細節詳解(三)
上篇(webRTC中語音降噪模組ANS細節詳解(二) )講了ANS的處理流程和語音在時域和頻域的相互轉換。本篇開始講語音降噪的核心部分,首先講雜訊的初始估計以及基於估計出來的雜訊算先驗信噪比和後驗信噪比。
1,初始雜訊估計
webRTC中ANS的初始雜訊估計用的是分位數雜訊估計法(QBNE,Quantile Based Noise Estimation),對應的論文為《Quantile Based Noise Estimation For Spectral Subtraction And Wiener Filtering》。 分位數雜訊估計認為,即使是語音段,輸入訊號在某些頻帶分量上也可能沒有訊號能量,那麼將某個頻帶上所有語音幀的能量做一個統計,設定一個分位數值,低於分位數值的認為是雜訊,高於分位數值的認為是語音。演算法大致步驟如下:
webRTC ANS在做初始估計時,分三個階段,第一個階段是前50幀,第二個階段是51~200幀,第三個階段是200幀以後的。50幀以後的只用分位數雜訊估計法來估計雜訊,而前50幀是分位數雜訊估計法和雜訊模型相結合,使雜訊估計的更準確。先看每個階段都有的分位數雜訊估計的處理,過程如下:
1) 算出每個頻點的幅度譜的自然對數值,即對數譜inst->lmagn,後續用lmagn表示
2) 更新分位數自然對數值(inst->lquantile,後續用lquantile表示)和概率密度值(inst->density,後續用density表示)。 共有三組lquantile和density值,每一幀有129個頻點,所以lquantile和density的數組大小為387(129*3)。記憶體布局示意如圖1:
圖1
三組不同的lquantile和density的更新由inst->counter(後續用counter表示)來控制。counter數組有三個整數值,每個值控制一組。counter數組的初始值基於200(表示前200幀),將200一分為三,即為[66, 133, 200]。每處理完一幀counter值會加1,當值變為200時就會變為0。這樣處理第二幀時counter值變為[67, 134, 0],處理第三幀時counter值變為[68, 135, 1],以此類推。當初始200幀處理完後,counter也完成了0~200的遍歷。
下面看counter怎麼控制lquantile和density的,對於第i組第j個頻點而言,先定義變數:
更新分位數:當頻點對數譜lmagn[j] > lquantile[i*129 + j]時,表示lquantile偏小,需要增大,反之則需要減小。更新數學表達式如下式1
(1)
更新概率密度:當|lmagn[j] – lquantile[i*129+j]| < WIDTH(值為0.01)時,意味著當前的雜訊估計比較準確了,因此要更新概率密度。更新的數學表達式如下式2:
(2)
3) 當幀數小於200時,對最後一組(即第二組)的lquantile做自然指數運算,將其作為雜訊估計值(noise[j],每個頻點一個值),可以看出每幀估出的雜訊是不同的。當幀數大於等於200後,只有當counter數組裡的值等於200時,才會將對應的組的lquantile做自然指數運算,將其作為雜訊估計值。可以看出當幀數大於等於200後每過66幀或者67幀雜訊估計值才會更新。
再看前50幀利用分位數雜訊估計法與雜訊模型相結合來估計初始雜訊。先定義如下四個變數:
需要注意的是上述4個變數定義時均沒有用到前5個頻點,因為i是從5開始的。再利用上面定義的變數表示白雜訊(white noise)和粉紅雜訊(pink noise)的參數,表示如下:
其中overdrive是根據設置的降噪程度而得到的一個值(在初始化中設置)。
其中blockInd表示當前幀的index 。
這樣就可以利用白雜訊和粉紅雜訊的參數來估計模型雜訊了,具體如下:
其中當頻點id小於5時,usedBin = 5, 其他情況下usedBin = 頻點id。
最後根據分位數估計雜訊noise和模型估計雜訊parametric_noise得到最終的估計雜訊了。對於每個頻點j來說,表達式如下式3:
(3)
至此,前50幀的結合分位數雜訊估計和模型雜訊估計的雜訊就估計出來了。這樣不管是第幾幀,初始雜訊都能估計出來,下面根據估計出來的初始雜訊來算先驗信噪比和後驗信噪比。
2,算先驗信噪比和後驗信噪比
在webRTC中語音降噪模組ANS細節詳解(一)中說過後驗信噪比σ是帶噪語音Y與雜訊N的功率比值,先驗信噪比ρ是乾淨語音S與雜訊N的功率比值,表達式如下式4和5:
(4)
(5)
其中m表示第幾幀,k表示第幾個頻點,即每一個頻點上都有先驗SNR和後驗SNR。由於雜訊N已通過分位數估計法估計出來,而且帶噪語音Y已知,因而後驗SNR可以算出來。
因為
從而
所以得到式6:
(6)
即先驗SNR等於後驗SNR – 1。
至於算先驗SNR,用的是判決引導法(Decision-Directed,簡稱DD)。根據式5和式6可以得到式7:
(7)
對先驗SNR的估算可以將上式遞推化得到,具體如式8:
(8)
這裡α為權重(或叫平滑係數),以代替上式中的1/2。從上式看出估算當前幀的先驗SNR是基於上一幀的先驗SNR和當前幀的後驗SNR。max()用以保證估值是非負的。平滑係數α取值範圍為0 < α < 1,典型取值為0.98,webRTC ANS中就是用的這個值。
在具體軟體實現中,WebRTC中為了減小運算load,並未嚴格按照定義的公式去計算,而是採用幅度譜的比值去計算,即式9和式10中第二個等號的右邊部分。
(9)
(10)
算當前幀的先驗SNR時,上一幀的帶噪語音Y(k, m-1)是已知的,上一幀的維納濾波器係數的值H(k, m-1)(即inst-smooth數組裡的值)也是已知的,根據維納濾波原理,從而上一幀的估計出來的乾淨語音S(k, m-1) = H(k, m-1)Y(k, m-1)也是已知的,所以上一幀的先驗SNR計算如式11:
(11)
將其帶入式8可得當前幀的先驗SNR計算表達式如式12:
(12)
這樣當前幀的先驗SNR和後驗SNR都計算出來了,用於後面的語音雜訊概率計算中。下一篇將講基於帶噪語音和特徵的語音和雜訊的概率計算方法和雜訊估計更新以及基於維納濾波的降噪。