matlab 维纳滤波恢复运动模糊,Matlab维纳滤波遇到很多问题啊,请教!

做维纳滤波,看了咱们论坛的不少帖子,但还是不明白,自己编了一个,仿真时候竟然把波形消除完了,我觉得是没有把维纳滤波理论搞清,找了好多书,但看了半天也没明白(有好多数学公式啊,我的底子有点差)。下面是我编的程序,请哪位大侠给看看怎么回事。

帧长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('增强语音');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值