Basic_LMS.m
资源名称:speech.rar [点击查看]
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:3k
源码类别:
语音合成与识别
开发平台:
Matlab
- clear all;
- % the channel impulse response;
- Hn =[0.8783 -0.5806 0.6537 -0.3223 0.6577 -0.0582 0.2895 -0.2710 0.1278 -0.1508 0.0238 -0.1814 0.2519 -0.0396 0.0423 -0.0152 0.1664 -0.0245 0.1463 -0.0770 0.1304 -0.0148 0.0054 -0.0381 0.0374 -0.0329 0.0313 -0.0253 0.0552 -0.0369 0.0479 -0.0073 0.0305 -0.0138 0.0152 -0.0012 0.0154 -0.0092 0.0177 -0.0161 0.0070 -0.0042 0.0051 -0.0131 0.0059 -0.0041 0.0077 -0.0034 0.0074 -0.0014 0.0025 -0.0056 0.0028 -0.0005 0.0033 -0.0000 0.0022 -0.0032 0.0012 -0.0020 0.0017 -0.0022 0.0004 -0.0011 0 0 ];
- Hn=Hn(1:64);
- %读入语音; it is a column vector;
- r=wavread('C:MatlabworkWrite_In_PaperShi_Yan.wav');
- % cut the former 5000 points;
- r=r'; r=r(1:5000); r=r+0.2*randn(size(r));% r is the input noisy signal vector;
- mu=0.3;
- % the output signal vector;
- output=conv(r,Hn); N=length(r);
- output=output(1:N);
- % ss=wavread('C:MatlabworkWrite_In_PaperShi_Yan1.wav');
- % ss=ss(1:N);
- % output=output+sqrt(1000)*ss';
- k=length(Hn); % k is the order of the filter;
- win=zeros(1,k); % the filter coeffients vector;
- error=zeros(1,N);
- for i=k:N
- input=r(i:-1:i-k+1); % intercept the input vector;
- e=output(i)-win*input';%进行滤波
- win=win+mu*e*input;%修正系数
- error(i)=error(i)+e^2;%累积误差
- end;
- figure; plot(win,'r'); hold on; plot(Hn,'b');%绘制滤波器系数和信道脉冲响应曲线
- figure;
- semilogy(error,'b');
- %axis([0 N 10^(-30) 0]);
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%% Normalized LMS Algorithm
- mu=1.5;
- win=zeros(1,k); % the filter coeffients vector;
- error=zeros(1,N);
- for i=k:N
- input=r(i:-1:i-k+1); % intercept the input vector;
- e=output(i)-win*input';
- win=win+mu*e*input/(3.5+input*input');
- error(i)=error(i)+e^2;
- end;
- hold on;
- semilogy(error,'r');%对纵坐标取对数的误差曲线
- T=64;
- L=zeros(T,T);
- for j=1:T
- L(1,j)=sqrt(1/T);
- end;
- for i=2:T
- for j=1:T
- L(i,j)=sqrt(2/T)*cos((i-1)*(2*j-1)*pi/(2*T));%????
- end;
- end;
- win=zeros(1,k); % the filter coeffients vector;
- error=zeros(1,N);
- l=zeros(64,1);
- for i=k:N
- u=r(i:-1:i-k+1);
- for n=1:64
- l(n)=L(n,:)*u';
- end;
- input=l';
- mu=0.1;
- % intercept the input vector;
- e=output(i)-win*input';
- win=win+mu*e*input;
- error(i)=error(i)+e^2;
- end;
- hold on;
- semilogy(error,'y');