【优化算法】改进型的LMS算法-SVSLMS算法【含Matlab源码 632期】

428 阅读3分钟

一、简介

最小均方(LMS, Least Mean Squares)是最基本的自适应滤波算法。
LMS算法是自适应滤波器中常用的一种算法与维纳算法不同的是其系统的系数随输入序列而改变。维纳算法中截取输入序列自相关函数的一段构造系统的最佳系数。而LMS算法则是对初始化的滤波器系数依据最小均方误差准则进行不断修正来实现的。因此理论上讲LMS算法的性能在同等条件下要优于维纳。但是LMS是在初始值下逐步调整的,因此在系统稳定前,会有一段调整时间,调整时间受步长因子的控制,一定范围内,步长因子越大,调整时间越小,步长因子的最大取值为R的迹。LMS采用平方误差最小的原则代替均方误差最小的原则,信号基本关系如下:
在这里插入图片描述
在这里插入图片描述

二、源代码

%%------------------- 定义变量:----------------------%%
% N - # of elements in array                                  %
% d - 阵元间距                          %
% ang - theta in deg                                          %
% thetaS - 期望用户波达角                             %
% thetaI - 干扰波达角                              %
% T - 期望信号的周期                               %
% t - 期望信号的时间轴                            %
% S - 期望信号                                        %
% I - 干扰信号                                    %
% vS,vI - 期望用户和干扰用户的转移矢量   %
% X - 总阵列因子                                     %
% Rxx - 总接收信号相关矩阵             %
% mu - 收敛参数                                  %
% w - 用LMS算法确定的均匀线阵权值          %
% x - 总接收信号                                   %
% y - 阵列输出                                            %
% e - 阵列输出和期望信号的误差           %
% theta - range of AOA's (rad)                                %
% AF - 加权阵列输出                                  %
%%-----------------------------------------------------------%%

%%----- 赋值-----%%

N = 8; d =0.5; 

thetaS = 30*pi/180; thetaI = -60*pi/180;%期望信号方向30. 干扰-60.%

%%----- 期望和干扰信号-----%%

T = 1E-3; t = (1:100)*T/100; it = 1:100;%1E-3表示1ms%

S = cos(2*pi*t/T); %,此时,S已经是一个矩阵!1100列


I = randn(1,100);%生成1100列的正态分布随机矩阵%
  
%%----- 为每个用户的线性阵列信号创建的阵列因子 -----%%

vS = []; vI = [];
i = 1:N;
vS = exp(1j*(i-1)*2*pi*d*sin(thetaS)).';%’表示厄米特转置,产生N行1列的阵列向量,然后后面在此基础上乘以信号就得到天线每个阵元接收到的信号
vI = exp(1j*(i-1)*2*pi*d*sin(thetaI)).';

%%----- 用LMS解决权值 -----%%

w = zeros(N,1);%初始天线阵权值全为0%
X = vS + vI;
Rxx = X*X';%X'为X的厄米特转置%
mu = 1/(4*abs(trace(Rxx)));%trace,迹%

wi = zeros(N,max(it));%初始权值都为0%
for n = 1:length(S)%n是迭代次数?%
    x = S(n)*vS + I(n)*vI;
    y(n) = w'*x;
    e = conj(S(n)) - y(n);     esave(n) = abs(e)^2;%conj,求复数的共轭%
    nu=mu*(1-exp(-(abs(e))^2));
    w = w + nu*conj(e)*x;
    wi(:,n) = w;
end               %没有判断收敛,要判断是从误差收敛曲线来看
w = w/w(1);    % 第一权值的规范解%

%%----- 显示权值 -----%%

disp(' ')
disp('%------------------------------------------------------------------------%')
disp(' ')
disp(['    N = ',num2str(N),' 的权值是:'])
disp(' ')
for m = 1:length(w)
    disp(['   w',num2str(m),' = ',num2str(w(m),3)])
end
disp(' ')

%%----- 输出结果 -----%%

% 1.) Plot 权重与迭代次数

wi = wi.';
figure(1), plot(it,abs(wi(:,1)),'kx',it,abs(wi(:,2))...
    ,'ko',it,abs(wi(:,3)),'ks',it,abs(wi(:,4)),'k+',...
    it,abs(wi(:,5)),'kd','markersize',2)
xlabel('Iteration no.'), ylabel('|weights|')
title('\bf  阵列权值')

% 2.) Plot 信号采集和跟踪

figure(2)
plot(it,S,'k',it,real(y),'k--')
xlabel('迭代次数'), ylabel('Signals')
title('\bf  期望信号采集与跟踪')
legend('期望信号','阵列输出')

% 3.) Plot 最小均方误差

figure(3), plot(it,esave,'k')
xlabel('Iteration no.'), ylabel('|e|^2')
title('\bf 均方误差与迭代次数.')

% 4.) Plot 阵列因子

theta = -pi/2:.01:pi/2;
AF = 0;
for i = 1:N
    AF = AF + w(i)'.*exp(j*(i-1)*2*pi*d*sin(theta));
end

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a