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都計算出來了,用於后面的語音噪聲概率計算中。下一篇將講基於帶噪語音和特征的語音和噪聲的概率計算方法和噪聲估計更新以及基於維納濾波的降噪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM