本文主要是介绍speex降噪算法流程介绍与算法原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、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域(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)、加合成窗函数、交叠相加,最终得到去噪以后的时域信号
二、降噪算法原理介绍
speex降噪算法采用一种基于MMSE短时谱幅度估计的语音增强算法,即STSA-MMSE. 该算法利用了人耳对语音相位变换不敏感的特性,估算得到短时幅度谱之后,利用带噪语音相位信息,合成增强语音。另外spee还应用了MCRA算法进行噪声跟踪,此处不讨论。以下是STSA-MMSE算法原理推导:
三、算法优化思路
1、优化先验信噪比的估计,先验信噪比能反映声场噪声的变化,其反应速度越灵敏,消噪效果越好。speex中是采用的”直接判决法“估计先验信噪比,该方法中平滑因子是固定的,可以采用自适应变化的平滑因子提高估计准确度。
2、优化噪声谱跟踪算法,更精准的噪声跟踪对消噪能力提升明显。
3、优化能量谱计算
这篇关于speex降噪算法流程介绍与算法原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!