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');%输出增强语音