求好心人帮我看下这个变步长LMS自适应滤波器算法matlab 的程序

结jie 2013-04-26 10:40:59
clear;%清除工作空间
close all%...
hold off%...
sysorder=5;%抽头数...
samples_per_period=50; %周期采样频率
N=10*samples_per_period-1;%总采样次数
signal=cos(pi*0.02*[0:N-1])+sin(2*pi*0.02*[0:N-1])+cos(3*pi*0.02*[0:N-1])+sin(4*pi*0.02*[0:N-1])+cos(5*pi*0.02*[0:N-1])...
+sin(6*pi*0.02*[0:N-1])+cos(7*pi*0.02*[0:N-1])+sin(8*pi*0.02*[0:N-1])+cos(9*pi*0.02*[0:N-1]);%初始输入信号/期望信号
figure;%作图1 的第一子图
subplot(2,1,1);
plot(signal);
grid;
title('自适应滤波器的理想输入');
nvar=0.5;%噪声方差
noise=nvar*randn(1,N );%噪声信号
X=signal+noise;%带加性噪声的输入信号
delayX=[0 X];% 输入信号延时
subplot(2,1,2);%作图1的第二子图
plot(delayX);
grid;
title('自适应滤波器的噪声输入');
SIGNAL=[signal 0];
%M=32;%滤波器长度
M=length(signal);%M为接收数据长度
mu=0.002;%迭代步长
totallength=size(X,1);%步长
N=60;%60结点作为训练序列
%算法的开始
w=zeros(sysorder,1);%初始化
for n=sysorder:N
e(n)=X-signal;
step=mu./(1+abs(e(n)).^2);
%u=inp(n:-1:n-sysorder+1);%u的矩阵
X=signal+noise;
y(n)=signal;%系统输出
%e(n)=d(n)-y(n);%系统误差
if n<20
mu=0.32;
else
mu=0.15;
end
w=w+stup*X*e(n);%迭代方程
end
%initial_status=initlms(zeros(1,M),mu);%滤波器设初值
%[Y,e,initial_status]=adaptlms(X,SIGNAL,initial_status);%LMS自适应滤波器输出
figure;%作图2的第一子图
subplot(2,1,1);
plot(0:N-1,Y,'r.',0:N ,SIGNAL,'k');
grid;
title('预测信号与实际信号的比较');
legend('预测信号', '实际信号');
error=signal-Y;%输出误差信号
subplot(2,1,2);%作图2的第二子图
plot(error);
grid;
title('自适应滤波器的预测误差');





1.%在采样点200时加入干扰信号
Pd=2000;
Fd=1;
Fs=4*Fd;
R=0.5;
Delay=5;
No=1;
M=4;
x1=randint (Pd,1,M);
x2=randint (Pd,1,M);
y1=modmap (x1,Fd,Fs,'psk',M);%modmap 把数字信号映射到模拟信号星座图(以供调制)
y2=modmap (x2,Fd,Fs,'psk',M);
[rev_a1,ti]=rcosflt (y1,Fd,Fs,'fir/sqrt/Fs',R,Delay);%rcosflt 升余弦滤波器
[rev_a2,ti]=rcosflt (y2,Fd,Fs,'fir/sqrt/Fs',R,Delay);
s1=amodce (rev_a1,10,'qam');%amodce 模拟基带调制器
s2=amodce (rev_a2,10,'qam');
save sigdata s1 s2

A=zeros(1,1000) ;%产生1*1000阶零矩阵
for j=1:2
for k=1:1000
t=rand;
m=1*sqrt(2*log(1/(1-t)));
t=rand;
A(k)=m*cos(2*pi*t);
end
end

i=sqrt(-1);
j=i;
m=4;p=2;
angle1=0; angle2=20; angle3=0;
th=[angle1;angle2;angle3];
nn=1024;
SN1=10;
SN2=30;
SN3=40;
SI1=0;
SI2=-20;
SI3=-30;
sn=[SN1;SN2;SN3];
si=[SI1;SI2;SI3];
Deg2rad=pi/180;
load sigdata
s3=zeros(8040,1);
s3(200,1)=s1(200,1)/10.^(SI3/20);
tt=1:nn;
S=[s1(tt).';s2(tt).';s3(tt).'];%S1为期望信号,S2为干扰信号,s3为干扰信号
nr=randn(m,nn);
ni=randn(m,nn);
U=nr+j*ni;%噪声
Ps=S*S'/nn;%期望与干扰信号的相关矩阵
ps=diag(Ps);%期望与干扰信号的自相关矩阵
refp=2*10.^(sn/10);
resi=10.^(si/20);
tmp=sqrt(ps./refp); %???
tmpsi=(1./resi);
S2=diag(tmpsi)*(diag(tmp)*S);%第一行为本地参考信号=期望信号,第二行为干扰信号,第三 行为干扰信号
tmp=-i*pi*sin(th'*Deg2rad);
tmp2=[0:m-1]';
a2=tmp2*tmp;
A=exp(a2);%导引向量矩阵
x=A*S2+U;%阵元输出信号矩阵
Rxx=x*x'/nn;%阵元输出信号的相关矩阵
Rinv=inv(Rxx);%Rxx的逆矩阵

y3=zeros(1,1000);
output3=zeros(1,1000);
w_lms=zeros(4,1);
emax=0.0001;
for n=1:1000
e(n)=S2(1,n)-w_lms'*x(:,n)/nn;
emax=max(emax,abs(e(n)));
u(n)=0.2*((abs(e(n))/emax).^0.2);
w_lms=w_lms+2*u(n)*conj(e(n))*x(:,n);
output3(1,n)=10*log10(abs(w_lms'*x(:,n)).^2/2);
y3(1,n)=abs(e(n)).^2;
end

y1=zeros(1,1000);
output1=zeros(1,1000);
w_lms=zeros(4,1);
for n=1:1000
e(n)=S2(1,n)-w_lms'*x(:,n)/nn;
u(n)=0.2*abs(e(n)).^2/(2*20+1);
w_lms=w_lms+2*u(n)*conj(e(n))*x(:,n);
output1(1,n)=10*log10(abs(w_lms'*x(:,n)).^2/2);
y1(1,n)=abs(e(n)).^2;
end

y2=zeros(1,1000);
output2=zeros(1,1000);
w_lms=zeros(4,1);
for n=1:1000
e(n)=S2(1,n)-w_lms'*x(:,n)/nn;
u(n)=1.5*(1/(1+exp(-abs(e(n))))-0.5);
w_lms=w_lms+2*u(n)*conj(e(n))*x(:,n);
output2(1,n)=10*log10(abs(w_lms'*x(:,n)).^2/2);
y2(1,n)=abs(e(n)).^2;
end
m=1:1000;
plot(m,output1,m,output2,m,output3,'-')
legend('26','25','归一化LMS算法');



这句话出错了 y(n)=signal;%系统输出 In an assignment A(I) = B, the number of elements in B and I must be the same.

Error in Untitled2 (line 36)


这该怎么改呢,,谢谢各位了
...全文
474 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiankongyun20 2015-04-09
  • 打赏
  • 举报
回复
在LMS算法循环中:
1. 运算维度不匹配。e(n)=X-signal; 该语句中n为一个单值,但X与signal都为一个矩阵,需要具体幅值。 另有y(n)=signal;语句也是如此。

2. LMS算法部分不正确。 正确的迭代过程应该为:初始化权值w;选择合适的miu值;在滤波器阶数循环过程中多次计算W*X(此处W和X都为向量); 在每一点用x(n)-W*X求得误差e(n);使用算法迭代W(k)=W(k-1)+2*e(n)*X(k). 算法结束,整个程序做小部分修改即可。
hansandgz 2013-05-13
  • 打赏
  • 举报
回复
调料一下,维数不匹配的太多 ,有的变量前后不一 如y Y,函数modmap???没定义等等太多

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧