logo资料库

matlab实现自适应滤波.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
自适应滤波的MATLAB实现
自适应滤波的 MATLAB 实现 1.LMS 算法的仿真程序: %lms 算法 clear all close all hold off%系统信道权数 sysorder = 5 ;%抽头数 N=1000;%总采样次数 inp = randn(N,1);%产生高斯随机系列 n = randn(N,1); [b,a] = butter(2,0.25); Gz = tf(b,a,-1);%逆变换函数 h= [0.0976;0.2873;0.3360;0.2210;0.0964;];%信道特性向量 y = lsim(Gz,inp);%加入噪声 n = n * std(y)/(10*std(n));%噪声信号 d = y + n;%期望输出信号 totallength=size(d,1);%步长 N=60 ; %60 节点作为训练序列 %算法的开始 w = zeros ( sysorder , 1 ) ;%初始化 for n = sysorder : N u = inp(n:-1:n-sysorder+1) ;% u 的矩阵 y(n)= w' * u;%系统输出 e(n) = d(n) - y(n) ;%误差 if n < 20 mu=0.32; else mu=0.15; end w = w + mu * u * e(n) ;%迭代方程 end %检验结果 for n = N+1 : totallength u = inp(n:-1:n-sysorder+1) ; y(n) = w' * u ;
e(n) = d(n) - y(n) ;%误差 end hold on plot(d) plot(y,'r'); title('系统输出') ; xlabel('样本') ylabel('实际输出') figure semilogy((abs(e))) ;% e 的绝对值坐标 title('误差曲线') ; xlabel('样本') ylabel('误差矢量') figure%作图 plot(h, 'k+') hold on plot(w, 'r*') legend('实际权矢量','估计权矢量') title('比较实际和估计权矢量') ; axis([0 6 0.05 0.35]) 2.NLMS 算法的仿真程序: %lms 算法 clear all close all hold off%系统信道权数 sysorder = 5 ;%抽头数 N=1000;%总采样次数 inp = randn(N,1);%产生高斯随机系列 n = randn(N,1); [b,a] = butter(2,0.25); Gz = tf(b,a,-1);%逆变换函数 h= [0.0976;0.2873;0.3360;0.2210;0.0964;];%信道特性向量 y = lsim(Gz,inp);%加入噪声 n = n * std(y)/(10*std(n));%噪声信号 d = y + n;%期望输出信号 totallength=size(d,1);%步长
N=60 ; %60 节点作为训练序列 %算法的开始 w = zeros ( sysorder , 1 ) ;%初始化 for n = sysorder : N u = inp(n:-1:n-sysorder+1) ;% u 的矩阵 y(n)= w' * u;%系统输出 r(n)=u'*u;%自相关矩阵 e(n) = d(n) - y(n) ;%误差 fai=.0001;%修正参数,为防止 u'*u 过小导致步长值太大而设置的 if n < 20 mu=0.32; else mu=0.15; end w = w + mu * u * e(n)/(r(n)+fai) ;;%迭代方程 end %检验结果 for n = N+1 : totallength u = inp(n:-1:n-sysorder+1) ; y(n) = w' * u ; e(n) = d(n) - y(n) ;%误差 end hold on plot(d) plot(y,'r'); title('系统输出') ; xlabel('样本') ylabel('实际输出') figure semilogy((abs(e))) ;% e 的绝对值坐标 title('误差曲线') ; xlabel('样本') ylabel('误差矢量') figure%作图 plot(h, 'k+') hold on
plot(w, 'r*') legend('实际权矢量','估计权矢量') title('比较实际和估计权矢量') ; axis([0 6 0.05 0.35]) 3.RLS 算法的仿真程序: % RLS 算法 randn('seed', 0) ; rand('seed', 0) ; NoOfData = 8000 ; % Set no of data points used for training Order = 32 ; % 自适应滤波权数 Lambda = 0.98 ; % 遗忘因子 Delta = 0.001 ; % 相关矩阵 R 的初始化 x = randn(NoOfData, 1) ;%高斯随机系列 h = rand(Order, 1) ; % 系统随机抽样 d = filter(h, 1, x) ; % 期望输出 % RLS 算法的初始化 P = Delta * eye ( Order, Order ) ;%相关矩阵 w = zeros ( Order, 1 ) ;%滤波系数矢量的初始化 % RLS Adaptation for n = Order : NoOfData ; u = x(n:-1:n-Order+1) ;%延时函数 pi_ = u' * P ;%互相关函数 k = Lambda + pi_ * u ; K = pi_'/k;%增益矢量 e(n) = d(n) - w' * u ;%误差函数 w = w + K * e(n) ;%递归公式 PPrime = K * pi_ ; P = ( P - PPrime ) / Lambda ;%误差相关矩阵 w_err(n) = norm(h - w) ;%真实估计误差 end ; % 作图表示结果 figure ; plot(20*log10(abs(e))) ;%| e |的误差曲线 title('学习曲线') ; xlabel('迭代次数') ; ylabel('输出误差估计') ;
figure ; semilogy(w_err) ;%作实际估计误差图 title('矢量估计误差') ; xlabel('迭代次数') ; ylabel('误差权矢量') ; 4.自适应均衡器的仿真程序: % Illustration of the conventional RLS algorithm close all; W=2.9; Nexp=10; N=2000; Nmc=1; % Number of ensemble realizations M=11;%抽头系数 lambda=0.99;%遗忘因子 varv=0.001;%噪声方差 h=zeros(3,1);%h 的初始化 er=zeros(N,Nmc);%er 的初始化 h(1)=0.5*(1+cos(2*pi*(1-2)/W)); h(2)=0.5*(1+cos(2*pi*(2-2)/W)); h(3)=0.5*(1+cos(2*pi*(3-2)/W)); % 学习曲线 hc=[0 h(1) h(2) h(3)]'; n0=7; t=(1:N)'; for i=1:Nmc y=sign(rand(N,1)-0.5);%输入信号 v=sqrt(varv)*randn(N,1);%噪声信号 x=filter(hc,1,y)+v;%信号混合 x=[zeros(M-1,1);x];%x 矩阵 yd=zeros(N+M-1,1); %延迟信号初始化 e=yd; yd(n0+M-1:N+M-1)=y(1:N-n0+1); % CRLS 算法 % Initialization lambda=0.98; P=(10^-3)*eye(M,M);
c=zeros(M,1); g=c; glambda=g; % 迭代范围 for n=M:M+N-1 xn=flipud(x(n-M+1:n)); glambda=P*xn; alphal=lambda+conj(glambda')*xn; g=glambda/lambda;a(n)=1-conj(g')*xn; P=(P-g*conj(glambda'))/lambda; P=(P+P')/2; e(n)=yd(n)-conj(c')*xn; c=c+g*conj(e(n)); end end eplot=e(M:M+N-1).^2; subplot(2,1,1), plot(t,abs(eplot)) ylabel('|e(n)|^2'); xlabel('n'); subplot(2,1,2), plot(t,a(M:M+N-1)); ylabel('\alpha(n)'); xlabel('n'); 5.自适应陷波器的仿真程序: N=400; %总采样长度 t=0:N-1; %时间的变化范围 s=sin(2*pi*t/20); %输入信号 A=0.5; %干扰信号的幅值 fai=pi/3;%干扰信号的相移 n=A*cos(2*pi*t/10+fai);%干扰信号 x=s+n;%信号混合 subplot(2,2,1);%作第一子图 plot(t,s); subplot(2,2,2); %作第二子图 plot(t,x); x1=cos(2*pi*t/10); x2=sin(2*pi*t/10);
%初始化 w1=0.1; w2=0.1; e=zeros(1,N); y=0; u=0.05;%迭代步长 for i=1:N y=w1*x1(i)+w2*x2(i); e(i)=x(i)-y;%误差信号 w1=w1+u*e(i)*x1(i);%迭代方程 w2=w2+u*e(i)*x2(i);%迭代方程 end subplot(2,2,3); %作第三子图 plot(t,e); subplot(2,2,4); %作第四子图 plot(t,s-e);
分享到:
收藏