【问题标题】:Matlab: How to fix Least Mean square algorithm codeMatlab:如何修复最小均方算法代码
【发布时间】:2015-05-01 10:12:00
【问题描述】:

我正在研究最小均方算法并看到了这段代码。根据算法步骤,误差和权重更新的计算看起来没问题。但是,它无法给出正确的输出。有人可以帮忙解决问题吗?代码取自:

http://www.mathworks.com/matlabcentral/fileexchange/35670-lms-algorithm-implementation/content/lms.m

clc
close all
clear all

N=input('length of sequence N = ');
t=[0:N-1];
w0=0.001;  phi=0.1;
d=sin(2*pi*[1:N]*w0+phi);
x=d+randn(1,N)*0.5;
w=zeros(1,N); 
mu=input('mu = ');
for i=1:N
   e(i) = d(i) - w(i)' * x(i);
   w(i+1) = w(i) + mu * e(i) * x(i);
end
for i=1:N
yd(i) = sum(w(i)' * x(i));  
end
subplot(221),plot(t,d),ylabel('Desired Signal'),
subplot(222),plot(t,x),ylabel('Input Signal+Noise'),
subplot(223),plot(t,e),ylabel('Error'),
subplot(224),plot(t,yd),ylabel('Adaptive Desired output')

编辑

答案中的代码:

N = 200;
M = 5;
w=zeros(M,N); 
mu=0.2;%input('mu = ');
y(1) = 0.0;
y(2) = 0.0;
for j = 3:N
 y(j) = 0.95*y(j-1) - 0.195*y(j-2); 
end

x = y+randn(1,N)*0.5;
%x= y;
d = y;
for i=(M+1):N
   e(i) = d(i) -  x((i-(M)+1):i)*w(:,i);
   w(:,i+1) = w(:,i) + mu * e(i) * x((i-(M)+1):i)';
end
for i=(M+1):N
    yd(i) = x((i-(M)+1):i)*w(:,i);  
end

存储系数的权重矩阵 w 全部为零,这意味着 LMS 方程不能正常工作。

【问题讨论】:

  • 你从哪里得到错误?对于 N=10 和 mu=0.1,代码有效。
  • 没有语法错误。但是,所需输出的图表甚至与实际信号相差甚远。其次,当我应用此代码对自回归模型 AR(2) 进行参数估计时,我没有得到正确的权重/参数。我的目标是估计 AR(2) 模型的参数,其中 d(I) = 0.95*d(i-1) - 0.195*d(I-2); x = d+randn(1,N)*0.5;算法的输出应该给我 w_estimates 接近 w_actual = [0.95 -0.195]

标签: matlab least-squares


【解决方案1】:

我也没有在您的代码中发现任何错误。但我怀疑这个算法是否适合这种噪音。使用更高阶的过滤器(在本例中为 M)时,您将获得更好的结果:

M = 5;
w=zeros(M,N); 
mu=0.2;%input('mu = ');
for i=(M+1):N
   e(i) = d(i) -  x((i-(M)+1):i)*w(:,i);
   w(:,i+1) = w(:,i) + mu * e(i) * x((i-(M)+1):i)';
end
for i=(M+1):N
    yd(i) = x((i-(M)+1):i)*w(:,i);  
end

【讨论】:

  • 对不起。我的错。我将公式与我在维基百科上找到的公式进行比较。有y用过,所以我换了。我更正了。
  • 那么,y = d 所需信号和 x = 噪声添加噪声信号?
  • 是的。或地面实况或一些参考信号。
  • 您的输入信号 y(或 d)始终为零。您的体重也被初始化为零。所以误差总是零。使用不同的y(0)y(1) 值或设置一些初始权重:w(:,M+1) = 0.1;
  • 对不起,我没有答案。我建议它总是为每个样本点产生权重。您可以尝试平均所有权重mean(w,2)。由于你的噪声是零均值,这可以给你一些好的固定系数。
【解决方案2】:
   N=input('length of sequence N = ');
    t=[0:N-1];
   w0=0.001;  phi=0.1;
   d=sin(2*pi*[1:N]*w0+phi);
   x=d+randn(1,N)*0.5;
    w=zeros(1,N); 
   mu=input('mu = ');
   for i=1:N
   yd(i)=w*x'; 
  e(i) = d(i) - w * x';
 for m=1:N
 w(m) = w(m) + mu * e(i) * x(m);
  end
 end
    subplot(221),plot(t,d),ylabel('Desired Signal'),
  sub plot(222),plot(t,x),ylabel('Input Signal+Noise'),
  subplot(223),plot(t,e),ylabel('Error'),
  subplot(224),plot(t,yd),ylabel('Adaptive Desired output')

您缺少的是单次迭代中的误差项与每个输入样本的乘积和权重的单独更新

【讨论】:

  • 你应该试着解释一下你的答案,而不是只给出代码答案。
  • 根据 lms 权重向量更新机制,e(i) 的当前值应该与输入的每个样本相乘,例如(e(i)* x(n))将更新 w1(第一个条目权重向量)和 e(i)*x(n-1) 将更新 w2(第二个条目)......所以如果你有 1000 个权重,如上例所示,那么你需要使用每次迭代的误差值更新 1000 个权重....一个变化是存储每次迭代的自适应滤波器 (yd) 的输出.....在迭代开始时,这不是一个很好的近似值,但在权重 ,,,(yd) 的一些更新后将变为期望输出的更好近似.....
猜你喜欢
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2019-10-11
  • 2021-08-29
  • 2021-12-05
  • 1970-01-01
相关资源
最近更新 更多