MATLAB高手来,帮忙改改程序,关于自适应滤波器算法的

2024-11-08 06:31:15
推荐回答(2个)
回答1:

clear all;
clc;
m=500;%将输入量赋值
u=0.002;%将输入量赋值
a1=-1.6;a2=0.8;
w1(1)=0;w2(1)=0;
w1(2)=0;w2(2)=0;
n(1)=1;n(2)=2;
%%%%%%%%
% true sequence x(n)
rd=randn(1,m);
x(1)=rd(1);x(2)=rd(2);
for k=3:m
x(k)=rd(k)-a1*x(k-1)-a2*x(k-2);
end
R=[x(1)*x(1) 0;0 0];
T=0;
e(1)=0;
W=[0;1];
X=[x(2);x(1)];
e(2)=x(2)-W'*X;
%%%%%%%%%%
for i=3:1:m %权系数迭代m次
R=[x(i-1)*x(i-1) x(i-1)*x(i-2);x(i-1)*x(i-2) x(i-2)*x(i-2)];%列出自相关矩阵
T=1/(T+trace(R)); %求出迹的值,为后续u的判断做准备
if(u>T)
error('u is larger than 1/t[R]');%判断u的值是否小于迹的倒数
end
W=W+2*u*X*e(i-1); %LMS算法的权系数迭代公式
X=[x(i-1) x(i-2)]'; %LMS算法中输入信号矢量的递推
e(i)=x(i)-W'*X;
w1(i)=-W(1); %LMS算法中权系数a1的提取
n(i)=i;
end
lambda=eig(R);%由R得出特征值
v=[1;1];%给主轴坐标赋初值
for n1=1:50
w(n1)=v(1)*v(1)*lambda(1)*((1-2*u*lambda(1))^(2*n1))+v(2)*v(2)*lambda(2)*((1-2*u*lambda(2))^(2*n1));%学习曲线的迭代公式
end
figure(1)
plot(w1,'r-'); %曲线绘图
%title('LMS算法权值收敛情况');
xlabel('迭代次数');
ylabel('权值变化');
grid on;
hold on;

% m=500;%权系数迭代m次
len=0.98;%%%%遗忘因子
% a1=-1.6;a2=0.8;
% w1(1)=1;
% w2(1)=1;
% w1(2)=1;
% w2(2)=2;
% n(1)=1;
% n(2)=2;
% %%%%%%%%%%%输入序列产生%%%%%%%%%%%%
% rd=randn(1,m);% 生成白噪声序列
% x(1)=rd(1);x(2)=rd(2);%产生前两个输入序列
% for k=3:m
% x(k)=rd(k)-a1*x(k-1)-a2*x(k-2);%产生其余输入序列
% end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
R=[0,0;0,0];%自相关矩阵初值R(-1)=0
W=[w1(2);w2(2)]; %初始权值
P=[0;0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=3:1:m
X=[x(i-1),x(i-2)]';
R= len*R+ X*X';%迭代公式中自相关矩阵的计算
e=x(i)-W'*X;%输出信号误差e(n\n-1)
W=W+inv(R)*X*e; %RLS算法的权系数迭代公式
w1(i)=-W(1); %RLS算法中权系数a1的提取
w2(i)=-W(2); %RLS算法中权系数a2的提取
n(i)=i;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
plot(w1,'b-'); %曲线绘图
title('自适应权系数a1(n)的过渡过程(RLS和LMS算法比较)');
xlabel('迭代次数');
ylabel('权值变化');
legend('LMS','RLS');
grid on;
hold off;
for k=3:m
y(k)=x(k)+w1(k)*x(k-1)+w2(k)*x(k-2);
end
figure(2);
hold on;
plot(x,'b-'); %曲线绘图
grid on;
plot(y,'r-');
title('RLS滤波效果');
xlabel('迭代次数');
ylabel('输入及输出值');
legend('噪音','滤波器输出');
hold off;

回答2:

figure(2)
plot(x,'b-'); %曲线绘图
xlabel('你需要的注释 但不能是汉语');
ylabel('你需要的注释 但不能是汉语'); /*上面这两行 就能给图2注释*/