谱减法去噪升级版

基础版存在的问题

在谱减法去噪基础版中: https://blog.csdn.net/qq_45510888/article/details/105717159
我们通过对前几帧的估计得到了噪声的功率谱,在带噪信号与估计噪声进行谱减出现负值时,我们没有进行处理,这是应当改进的地方。对这种现象最简单的处理就是将负值设为0,以保证非负的功率谱。但是对负值的这种处理,会导致信号帧频谱的随机位置上出现小的,独立的峰值。

这些峰值听起来就像帧与帧之间频率随机变化的多频音,这种情况在清音段尤其明显,这种由于半波整流引起的“噪声”被称为“音乐噪声”。导致音乐噪声的原因主要有:
(1)对谱减算法中的负数部分进行了非线性处理
(2)对噪声谱的估计不准

所以我们采用一种过减的方法来避免负值的出现,过减的基本实现如下图:谱减法去噪升级版_第1张图片

图1.过减处理示意

其中alpha(大于等于1)为过减因子,它主要影响语音谱的失真程度。beta(大于0小于1)是谱下限参数,可以控制残留噪声的多少以及音乐噪声的大小。
在高信噪比中,alpha应取小值;对低信噪比中,alpha建议取大值。Berouti等人做了大量实验来确定alpha与beta的最优值,在这里我们直接使用就可以了。具体请参考论文:Enhancement of speech corrupted by a acoustic noise。

代码改进

我们将alpha和beta的确定加到原代码中,其中alpha的确定我们写成函数berouti.m:

% 确定alpha的函数
function a=berouti(snr)
if snr>=-5 && snr<=20
	a=4-snr*3/20;
else
    if snr<-5.0
        a=5;
    end
    if snr>20
        a=1;
    end
end

调用方法:

% 改进,添加过减因子,增益补偿因子
alpha=berouti(snr);
beta=0.002;

在原来的谱减处加入条件判定,即可实现初步的改进:

% 以下是改进部分
    for k=1:nfft
        if S(k)>meannoise(k)
            SUB(k,:)=S(k)-alpha*meannoise(k);
        else
            SUB(k,:)=beta*meannoise(k);
        end
    end

MATLAB代码高亮

最后说一下关于CSDN不支持matlab相应语法高亮的问题,如果什么都不加的话最后就会是黑白2色,代码篇幅较长的话阅读体验很不好。基于matlab原生编辑器突出的高亮部分,经过一个一个的尝试,CSDN的代码块与其相似的有powershellrubysqlvbnet这几个,个人比较喜欢ruby进行编辑,大家有更适合的欢迎互相交流。

推荐的博客:https://blog.csdn.net/leixiaohua1020/article/details/47276353

你可能感兴趣的:(MATLAB)