www.pudn.com > wienerlvbogai.rar > wienerlvbogai.m


%本程序为改进型维纳滤波法,参考Pascal Scalart and Jozue Vieira Filho ,“Speech enhancement based on a priori signal to noise estimation ”,ICASSP 1996 ,pp629-632  
%这种改进型维纳滤波法将先验信噪比引入的增益函数之中,利用"D-D"进行估计,计算量变化不大,但增强效果大大改善,确实是好的想法,适用于高信噪比条件下的语音增强 
%******************初始化部分****************************************% 
clear; 
d=wavread('E:\学位论文写作\音源\原始\f16__05dB.wav'); 
d=d'; 
le=length(d);  
s=fix(le/64);    
hn=hanning(256)'; 
hm(1:256)=hanning(256)'; 
xd(1:256)=0; 
mn(1:256)=0; 
x0(1:s*64)=0; 
snpr1=0.98;          %snpr1代表前一帧的先验信噪比,这是初始化 
%****************估计噪声*****************************************% 
%假设带噪语音开始部分为纯噪声 
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); 
    Man=abs(Xd); 
    En=angle(Xd); 
    snpo=Man.^2./xd; 
    snpr=(0.98.*snpr1+0.02.*max(snpo-1,0)).*1.1; 
    G=(snpr./(1+snpr)).^0.85; 
    M=Man.*G; 
    Mn=M.*exp(i.*En); 
    snpr1=M.^2./xd; 
    x(1:256)=ifft(Mn(1:256));   
    x1=real(x).*hm; 
    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:\学位论文写作\音源\结果\wiener滤波改进\f164.wav');%输出增强语音