做维纳滤波,看了咱们论坛的不少帖子,但还是不明白,自己编了一个,仿真时候竟然把波形消除完了,我觉得是没有把维纳滤波理论搞清,找了好多书,但看了半天也没明白(有好多数学公式啊,我的底子有点差)。下面是我编的程序,请哪位大侠给看看怎么回事。
帧长256,128重叠,用前三个寂静帧估计噪声,得出维纳滤波器(估计是这部分有问题)
程序如下:
%维纳滤波
framelength=256;
[f,fs]=wavread('f:\sp01.wav');
yy=randn(1,length(f));
f1=f+0.1*yy';
f2=f+0.01*yy';
f3=f+0.005*yy';
input=f2;
s=input'; % 变成行向量
noiselength=fix(0.25*fs); %noise length is 250 ms
step=128;
lengthOfTailPad=framelength-rem(length(s),framelength);%求余数
tailPad=s(length(s)-lengthOfTailPad+1:length(s) );
tailPad=tailPad.*0;
s=[s,tailPad];% 用零补足最后一帧
nf = fix((length(s)-step)/step);%向0取整 计算帧数
w = hamming(framelength)';%加hamming窗
yd=[];
angleyy=[];
sn=zeros(nf,framelength);
for i=1:nf
sn(i,:)=s((i-1)*(framelength-step)+1:(i-1)*(framelength-step)+framelength).*w; %对每段分帧进行加窗处理
fy=fft(sn(i,:),framelength);
yd(i,:)=abs(fy).^2; % 将频域信号功率赋给矩阵变量yd
angleyy(i,:)=angle(fy); %将频域信号的相位角赋给矩阵变量ang
end
k=length(sn(:,1));
noise1=s(2*framelength+1:3*framelength);
noise2=s(3*framelength+1:4*framelength);
noise3=s(4*framelength+1:5*framelength);
noise(1,:)=abs(fft(noise1')');
noise(2,:)=abs(fft(noise2')');
noise(3,:)=abs(fft(noise3')');
ave_noise=mean(noise);
init_speech=(yd(1,:).^2-ave_noise.^2); %
H=1;
TT=(init_speech);
for i=2:k %维纳
kk=(yd(i,:).^2.*H);
H=kk./(kk.^2+ave_noise.^2);
pp=find(kk<0);%找出所有小于0的替代
kk(pp)=0;
TT=[TT;kk];
end
tt=sqrt(TT);
t=tt.*exp(j.*angleyy); % t=TT.*exp(j*angleyy);
ss=ifft(t,[],2);
ss=real(ss);
% temp_u=ss(1,1:128);
temp_u=[];
for i=1:k
temp=ss(i,:)./w;
temp=temp(129:256);
temp_u=[temp_u,temp];
end
temp=ss(1,:)./w;
temp_u=[temp,temp_u];
% ss=real(ss);%还原
subplot(311);
plot(f);
title('原始语音');
% a=1:length(s);
subplot(312);
plot(s);
title('带噪语音');
% b=1:length(temp_u);
subplot(313);
plot(temp_u);
title('增强语音');
wavwrite(temp_u,fs,'sp0002.wav');
figure;
subplot(311);
% SPECTROGRAM(f);
specgram(f);
title('原始语音');
% a=1:length(s);
subplot(312);
specgram(s);
title('带噪语音');
b=1:length(temp_u);
subplot(313);
specgram(temp_u);
title('增强语音');