基础版存在的问题

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

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

所以我们采用一种过减的方法来避免负值的出现,过减的基本实现如下图:

谱减法是机器学习吗_ruby


图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