開源speex的語音增強(去噪)演算法介紹

技術從未如此性感發表於2018-04-28
speex的語音增強(去噪)演算法介紹

speex是一套主要針對語音的開源免費,無專利保護的應用集合,它不僅包括編解碼器,還包括VAD(語音檢測),

          DTX(不連續傳輸),AEC(回聲消除),NS(去噪)等實用模組。Speex的強(去噪)演算法效能較好,而一般文件都是側重於

          對應用介面的介紹。 本文對speex去噪演算法步驟做一些簡要整理和介紹,以提供給對該演算法感興趣的讀者參考。

1)preprocess_analysis()包括兩部分,主要是加窗交疊傅立葉(fft)變換等常用的訊號處理演算法。
1.1)預處理
      訊號輸入,加窗,交疊(overlap),時頻傅立葉變換(fft)
1.2)計算能量
      計算頻域能量ps,而filterbnak_compute_bank32()計算基於Bark帶(臨界頻帶)內的帶噪訊號能量。
2)update_noise_prob()更新噪聲能量,使用的方法比較簡單,即一般的固定迭代因子平滑演算法;
3)更新mel噪聲譜能量;
4)計算後驗訊雜比和進行先驗訊雜比更新:
post_SNR = ps/noise - 1;
gamma = 0.1 + 0.89*(old/(old+noise))^2;
priori_SNR= gamma*max(0,post) + (1-gamma)*old_ps/noise;
5)先驗訊雜比平滑(zeta[i]),用於本底增益計算,計算範圍包括fft域和Bark域。 
6)計算Bark帶(臨界頻帶)內的EM演算法增益和線性頻域上的EM演算法增益。
{注:EM(YARIV EPHRAIM 和 DAVID MALAH) 是語音增強領域的泰斗。}
考慮到在臨界頻帶內幅度譜並不一定符合高斯隨機分佈,所以EM演算法在Bark帶內不能嚴格適用,這一點JEAN-MARC也在c程式碼中做了說明,所以此處只以線性頻率上的EM增益為例進行說明。
    6.1 )   weiner 濾波:prior_snr=   prior_snr /(   prior_snr +1);
    6.2 )  超幾何分佈增益引數 theta= prior_snr *(1+post_snr);
    6.3)   超幾何分佈增益 MM=exp(-theta/2)*[(1+theta)*I0(theta/2)+theta*I1(theta/2)];其中I0和I1是貝塞爾函式。
    6.4)   增益 g=min(1,prior_ratio*mm);
    6.5)   p=gain2[i];gain2是由臨界頻率計算後的增益擴充套件到線性頻域後的增益。
    6.6)   約束增益:如果 g/3>st->gain  則 g=3*st->gain  ;
    6.7)  gain=g;     如果 gain<gain_floor  則  gain =gain_floor  ;
    6.8) 最終幅度譜增益
             gain2={p*sqrt(g)+(1-p)*sqrt(st->gain_floor  )}^2;
  7)將幅度譜增益gain2作用於fft幅度譜
  8)後處理,包括反傅立葉變換(ifft)、加合成窗函式、交疊相加,最終得到去噪以後的時域訊號。

附EM演算法的推導和結論:

相關文章