⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wiener.m

📁 维纳滤波matlab源码
💻 M
字号:
function Y=Wiener(x,L,lap,alph,lamd,bet)

fram_len=L;%帧长
alpha=alph;
fram_lap=lap;
lamda=lamd;
beta=bet;

data_len=length(x);
fram_num=ceil(data_len/fram_len);
data_tot=fram_num*fram_len;
noi_fram=4;%ceil(0.1*fram_num);%无信号的帧数

noi_pow=zeros(1,fram_len);%噪声功率


Xo=zeros(1,fram_len);
xo=zeros(1,data_tot);

%初始化无语音时的噪声功率
for  l=1:noi_fram
   for j=1:fram_len
      z(j)=x((l-1)*fram_lap+j);
   end;
   Z=abs(fft(hanning(fram_len)'.*z,fram_len)).^2;%分针后作fft再取模平方
   noi_pow=noi_pow+Z;
end
noi_pow=alpha^2*noi_pow/noi_fram;

%initial 
pre_snr=abs(fft(hanning(fram_len)'.*x(1:fram_len),fram_len)).^2./noi_pow;
Xo_pow=pre_snr.*noi_pow;
%remove noise
for k=1:1:fram_num*2-1
    Ls=(k-1)*fram_lap+1;
    Rs=(k-1)*fram_lap+fram_len;
       temp=x(Ls:Rs);
  
   Xi=fft(hanning(fram_len)'.*temp,fram_len);
   
   now_snr=lamda*Xo_pow./noi_pow+(1-lamda)*(pre_snr-1);
   temp_pow=abs(Xi).^2;
   pre_snr=temp_pow./noi_pow;
   for ii=1:fram_len
     if now_snr(ii)>0
     Xo(ii)=now_snr(ii)*Xi(ii)/(1+now_snr(ii));
     else 
      Xo(ii)=sqrt(beta*noi_pow(ii))*Xi(ii)/abs(Xi(ii));
     end
   end
        Xo_pow=abs(Xo).^2;
        xo(Ls:Rs)=xo(Ls:Rs)+real(ifft(Xo,fram_len));
end;

Y=xo;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -