www.pudn.com > MMSE-denoising.rar > MMSE.m
% 本程序为经典MMSE方法,引自Y. Ephraim and D.Malah “Speech enhancement using a minimum mean-square error short-time spectral amplitude estimator ,”
%IEEE trans.Acoust.Speech Signal Processing, Vol.ASSP-32,no.6, pp. 1109-1121,1984
%1984年,Y. Ephraim and D.Malah提出的MMSE方法是基于语音短时谱估计的增强方法中的代表算法,一直被称为well kown,可见其重要程度。
%从1984年至今,他们一直在语音增强领域作着不懈的努力,有着突出的贡献,成为语音增强领域的著名人物
%Y. Ephraim在IEEE上及相关刊物发表有关语音增强文章七十余篇。1992年,受IEEE约稿,Ephraim发表了一篇长达四十多页,参考文献300多篇的文章,全面的总结语音增强发展的过程
%二人的研究成果和个人简介均可可从网上得到
%******************初始化部分****************************************%
clear;
d=wavread('E:\学位论文写作\音源\原始\white__05dB.wav'); %读入带噪语音,要求为8Kz采样
d=d';
le=length(d); %求输入带噪语音序列长度
s=fix(le/64); %帧间重叠3/4,所以算出所需循环次数
hn=hanning(256)'; %得到STFT分析窗,汉宁窗,帧长256点
hm(1:256)=hanning(256)'; %得到STFT合成窗,汉宁窗,帧长256点
xd(1:256)=0; %噪声谱估计赋初值
mn(1:256)=0;
x0(1:s*64)=0; %增强后语音赋初值
snpr1=0.98; %snpr1代表前一帧的先验信噪比,这是初始化设为0.98,也可以设为别的值,经过更新之后,会达到较真实的值
%****************估计噪声*****************************************%
%假设带噪语音开始部分为纯噪声
for n=1:1:20 %用前5帧带噪语音进行噪声估计,周期图法
d1(1:256)=d((n-1)*64+1:(n-1)*64+256).*hn;
mn=abs(fft(d1,256)); %本算法是基于短时谱的语音增强,所以不考虑噪声相位
mn=mn.*mn;
xd=xd+mn;
end
xd=xd./20; %对几帧的噪声谱进行了平均,求出噪声的幅度谱
%****************主体增强部分****************************************%
for n=1:1:s-3
d1(1:256)=d((n-1)*64+1:(n-1)*64+256).*hn; %时域加窗
Xd(1:256)=fft(d1,256); %FFT
Man=abs(Xd); %带噪语音幅度
En=angle(Xd); %带噪语音相位
snpo=Man.^2./xd; %计算后验信噪比,利用"D-D"法
snpr=(0.98.*snpr1+0.02.*max(snpo-1,0))*1.1;%计算先验信噪比,实验结果表明乘以1.1增强效果较好
v=min(snpr.*snpo./(1+snpr),100); %v有时出现奇异值,所以将它控制在100之内
Gm=0.5.*sqrt(v.*pi)./snpo.*exp(-v./2).*((1+v).*besseli(0,v./2)+v.*besseli(1,v./2));%计算有音时的增益函数
gam=4*exp(v)./(1+snpr); %计算似然比,q设为0.2
G=gam./(1+gam).*Gm; %计算考虑有/无音概率的增益函数;增益函数还可考虑在无声时赋一个较小的值
M=Man.*G;
Mn=M.*exp(i.*En);
snpr1=M.^2./xd; %先验信噪比更新
x(1:256)=ifft(Mn(1:256));
x1=real(x).*hm; %进行IFFT后,有时会出现较小的复数值,所以加real函数.同时加合成窗
x0((n-1)*64+1:(n-1)*64+256)=x0((n-1)*64+1:(n-1)*64+256)+x1;
end
%****************归一化部分****************************************%
g0=hn.*hm; %由于在STFT分析合成时加了分析窗和合成窗,所以进行归一化,抵消加窗造成的影响
gl(1:64)=g0(1:64)+g0(65:128)+g0(129:192)+g0(193:256);
gain=repmat(gl,1,s);
x0=x0./gain;
wavwrite(real(x0),8000,8,'E:\学位论文写作\音源\结果\MMSE\m109.wav');%输出增强语音