1. 程式人生 > >speex語音增強(去噪)演算法簡介

speex語音增強(去噪)演算法簡介

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

speex是一套主要針對語音的開源免費,無專利保護的應用集合,它不僅包括編解碼器,還包括VAD(語音檢測), DTX(不連續傳輸),AEC(回聲消除),NS(去噪)等實用模組。Speex的增強(去噪)演算法效能較好,而一般文件都是側重於
對應用介面(API)的介紹。 本文對speex去噪演算法步驟做一些簡要整理和介紹,以提供給對該演算法感興趣的讀者參考。
1. preprocess_analysis()包括兩部分,主要是加窗交疊傅立葉(fft)變換等常用的訊號處理演算法。
1.1 預處理
訊號輸入,加窗,交疊(overlap),時頻傅立葉變換(fft)(加窗,分幀,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