LMS的公式
1. 最陡梯度下降法计算公式
(1)
H
(
n
+
1
)
=
H
(
n
)
−
1
2
δ
V
G
(
n
)
H(n+1)=H(n)-\frac{1}{2}\delta V_G(n) \tag{1}
H(n+1)=H(n)−21δVG(n)(1)
其中
δ
\delta
δ 取0.4,H(0)=
[
3
−
4
]
T
[3\quad-4]^T
[3−4]T
(2)
V
G
(
n
)
=
2
R
x
x
H
(
n
)
−
2
r
y
x
=
2
[
r
x
x
(
0
)
r
x
x
(
1
)
r
x
x
(
1
)
r
x
x
(
0
)
]
−
2
[
22
r
y
x
(
0
)
r
y
x
(
1
)
]
V_G(n)=2R_{xx}H(n)-2r_{yx}= 2 \left[ \begin{matrix} r_{xx}(0) & r_{xx}(1) \\ r_{xx}(1) & r_{xx}(0) \end{matrix} \right]-2 \left[22 \begin{matrix} r_{yx}(0)\\ r_{yx}(1) \end{matrix} \right] \tag{2}
VG(n)=2RxxH(n)−2ryx=2[rxx(0)rxx(1)rxx(1)rxx(0)]−2[22ryx(0)ryx(1)](2)
(3)
r
x
x
(
k
)
=
1
16
∑
i
=
0
15
(
2
s
i
n
2
π
i
16
)
(
2
s
i
n
2
π
(
i
−
k
)
16
)
=
c
o
s
2
π
k
16
r_{xx}(k)=\frac{1}{16}\sum_{i=0}{15}\Big(\sqrt{2}sin\frac{2\pi i}{16}\Big)\Big(\sqrt{2}sin\frac{2\pi (i-k)}{16}\Big)=cos\frac{2\pi k}{16} \tag{3}
rxx(k)=161i=0∑15(2sin162πi)(2sin162π(i−k))=cos162πk(3)
(4)
r
y
x
(
k
)
=
1
16
∑
i
=
0
15
[
2
s
i
n
(
2
π
i
16
+
π
10
)
]
(
2
s
i
n
2
π
(
i
−
k
)
16
)
=
1
2
c
o
s
(
2
π
k
16
+
π
10
)
r_{yx}(k)=\frac{1}{16}\sum_{i=0}{15}\Big[\sqrt{2}sin\Big(\frac{2\pi i}{16}+\frac{\pi}{10}\Big)\Big]\Big(\sqrt{2}sin\frac{2\pi (i-k)}{16}\Big)=\frac{1}{\sqrt{2}}cos\Big(\frac{2\pi k}{16}+\frac{\pi}{10}\Big) \tag{4}
ryx(k)=161i=0∑15[2sin(162πi+10π)](2sin162π(i−k))=21cos(162πk+10π)(4)
得
V
G
(
n
)
=
2
[
1
0.9239
0.9239
1
]
[
h
0
(
n
)
h
1
(
n
)
]
−
2
[
0.6725
0.5377
]
V_G(n)=2\left[ \begin{matrix} 1 & 0.9239 \\ 0.9239 &1 \end{matrix} \right] \left[ \begin{matrix} h_0(n) \\ h_1(n) \end{matrix} \right] -2\left[ \begin{matrix} 0.6725\\ 0.5377 \end{matrix} \right]
VG(n)=2[10.92390.92391][h0(n)h1(n)]−2[0.67250.5377]
V
G
(
0
)
=
[
−
2.7362
−
3.5320
]
V_G(0)=\left[ \begin{matrix} -2.7362\\ -3.5320 \end{matrix} \right]
VG(0)=[−2.7362−3.5320]
2. LMS法计算公式
e
(
n
+
1
)
=
y
(
n
+
1
)
−
H
T
(
n
)
X
(
n
+
1
)
e(n+1)=y(n+1)-H^T(n)X(n+1)
e(n+1)=y(n+1)−HT(n)X(n+1)
H
(
n
+
1
)
=
H
(
n
)
+
δ
e
(
e
+
1
)
X
(
n
+
1
)
,
n
=
0
,
1
,
2
…
H(n+1)=H(n)+\delta e(e+1)X(n+1),n=0,1,2 \dots
H(n+1)=H(n)+δe(e+1)X(n+1),n=0,1,2…
其中
δ
\delta
δ取0.4
误差性能曲面和等值曲线
matlab代码
[h0,h1]=meshgrid(-2:0.1:4,-4:0.1:2);
J=0.55+h0.*h0+h1.*h1+2*cos(pi/8)*h1.*h0-sqrt(2)*h0*cos(pi/10)-sqrt(2)*h1*cos(9*pi/40);%???
v=0:0.1:2;
figure;
surf(h0,h1,J);
xlabel('h0');
ylabel('h1');
title('误差性能曲面');
figure;
contour(h0,h1,J,v);
xlabel('h0');
ylabel('h1');
title('误差性能曲面等值曲线');
matlab的白噪声
使用函数mvnrnd(0,0.05,k)‘生成一列长度为K,均值为0,方差为0.05的白噪声
图像如下:
LMS算法程序
matlab代码如下
%LMS算法演示(matlab) 假如我年少有为
%设置参数,N为采样个数,u为步长
close all
clear,clc;
N=16;u=0.4;
%设置迭代次数k
k=1000;
t=1:k;
rk = mvnrnd(0,0.05,k)'; %方差为0.05的白噪声
%figure,plot(1:k,rk);%绘制白噪声
y=rk(t)+sin(2*pi*t/N+pi/10);
x=sqrt(2)*sin(2*pi*t/N);
figure;subplot(3,1,1);
plot(t,rk);
title('白噪声');
subplot(3,1,2);
plot(t,x);
title('相关噪声');
subplot(3,1,3);
plot(t,y);
title('叠加后噪声');
%设置起始权值
wk(1,:)=[3 -4];
%用LMS算法迭代求最佳权值
for i=2:k
xk(i,:)=[x(i) x(i-1)];%输入信号
yk(i-1)=xk(i-1,:)*wk(i-1,:)';%输出信号
dk(i-1)=y(i-1);%期望信号
err(i-1)=dk(i-1)-yk(i-1);%误差
wk(i,:)=wk(i-1,:)+u*err(i-1)*xk(i-1,:);%权值迭代
end
Rxx=[[1 0.9239]',[0.9239 1]'];
Ryx=[0.6725 0.5377]';
wk2(:,1)=[3 -4]';
vg=[-2.736 -3.5320]';
for i=1:k-1
vg=2*Rxx*wk2(:,i)-2*Ryx;
wk2(:,i+1)=wk2(:,i)-1/2*u*vg;
end;
[x,y]=meshgrid([-2:0.1:4],[-4:0.1:2]);
%求性能表面
%生成曲面值
[h0,h1]=meshgrid(-2:0.1:4,-4:0.1:2);
J=0.55+h0.*h0+h1.*h1+2*cos(pi/8)*h1.*h0-sqrt(2)*h0*cos(pi/10)-sqrt(2)*h1*cos(9*pi/40);%???
v=0:0.1:2;
figure;
surf(h0,h1,J);
xlabel('h0');
ylabel('h1');
title('误差性能曲面');
figure;
contour(h0,h1,J,v);
xlabel('h0');
ylabel('h1');
title('误差性能曲面等值曲线');
%画迭代时权值的变化
hold on;plot(wk(:,1),wk(:,2),'r');
hold on;plot(wk2(1,:),wk2(2,:),'g');
%绘制误差与迭代次数的图
figure,plot(err);
多次LMS的统计平均
matlab代码如下
clear all;
close all;
g=100;
N=1000;
q=0.4;
k=2;
jn=zeros(1,N-k+1);
en0=zeros(1,N-k+1);
ejn = zeros(1,N-k+1,g);
for j=1:g
rk = mvnrnd(0,0.05,N)';
n=1:N;
y=rk(n)+sin(2*pi*n/16+pi/10);
x=sqrt(2)*sin(2*pi*n/16);
h=[3 -4]';
for i=k:N
u=x(i:-1:i-1);
en=y(i)-u*h;
h=h+q*en*u';
en0(i-k+1)=en;%保留最后一次的en
jn(i-k+1)=en^2;%保留最后一次的jn
ejn(:,i-k+1,j)=en^2;%保留所有的J(n)
end
end
%计算统计平均值
for i=1:N-k+1
jn(i)=sum(ejn(1,i,:))/g;
end
figure;
subplot(2,1,1);
plot(jn);
title('一次的J(n)');
subplot(2,1,2);
plot(en0);
title('一次的e(n)');
figure(2);
plot(jn);
title('100下的平均J(n)');
多次LMS下的平均误差性能曲线
matlab代码如下
clear all;
close all;
N=1000;q=0.4;
k=2;
t=1:N;
g=100;
wk =zeros(2,N,g);
for j=1:g
rk = mvnrnd(0,0.05,N)'; %方差为0.05的白噪声
y=rk(t)+sin(2*pi*t/16+pi/10);
x=sqrt(2)*sin(2*pi*t/16);
%设置起始权值
h=[3 -4]';
wk(:,1)=[3 -4]';
hm=zeros(2,N);
hm(:,1)=[-3,4]';
%用LMS算法迭代求最佳权值
for i=k:N
u=x(i:-1:i-1);
en=y(i)-u*h;
h=h+q*en*u';
hm(:,i)=h;
wk(:,i,j)=h;
end
Rxx=[[1 0.9239]',[0.9239 1]'];
Ryx=[0.6725 0.5377]';
wk2(:,1)=[3 -4]';
vg=[-2.736 -3.5320]';
for i=1:N-1
vg=2*Rxx*wk2(:,i)-2*Ryx;
wk2(:,i+1)=wk2(:,i)-1/2*q*vg;
end
end
for i=1:N-k+1
wk_e(1,i+1)=sum(wk(1,i+1,:))/g;
wk_e(2,i+1)=sum(wk(2,i+1,:))/g;
end
wk_e(:,1)=[3,-4]';
[h0,h1]=meshgrid(-2:0.1:4,-4:0.1:2);
J=0.55+h0.*h0+h1.*h1+2*cos(pi/8)*h1.*h0-sqrt(2)*h0*cos(pi/10)-sqrt(2)*h1*cos(9*pi/40);%???
v=0:0.1:2;
figure;
surf(h0,h1,J);
xlabel('h0');
ylabel('h1');
title('误差性能曲面');
figure;
contour(h0,h1,J,v);
xlabel('h0');
ylabel('h1');
title('误差性能曲面等值曲线');
hold on
plot(wk_e(1,:),wk_e(2,:),'r');
plot(wk2(1,:),wk2(2,:),'g');
title('100次LMS法平均轨迹');legend('等值曲线','最陡法','平均LMS法');