📄 wiener.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 + -