最小二乘(Least Square)准则:以误差的平方和最小作为最佳准则的误差准则
定义式中, ξ(n)是误差信号的平方和;ej是j时刻的误差信号,
dj是j时刻的期望信号,Xj是j时刻的输入信号构成的向量, W表示滤波器的权系数构成的向量。通过选择W,使ξ(n)取得最小值的滤波称为最小二乘(Least Square,简称LS)滤波,而满足E[e2j]取得最小值的滤波称为最小均方误差(Least Mean Square, 简称LMS)滤波。
最小二乘法代码
function [yn,W,en]=LMS(xn,dn,M,mu,itr)% LMS(Least Mean Squre)算法% 输入参数:%xn 输入的信号序列(列向量)%dn 所期望的响应序列 (列向量)%M 滤波器的阶数 (标量)%mu 收敛因子(步长)(标量)要求大于0,小于xn的相关矩阵最大特征值的倒数 %itr 迭代次数 (标量)默认为xn的长度,M<itr<length(xn)% 输出参数:%W 滤波器的权值矩阵(矩阵)%大小为M x itr,%en 误差序列(itr x 1) (列向量) %yn 实际输出序列 (列向量)% 参数个数必须为4个或5个if nargin == 4 % 4个时递归迭代的次数为xn的长度 itr = length(xn);elseif nargin == 5 % 5个时满足M<itr<length(xn)if itr>length(xn) | itr<Merror('迭代次数过大或过小!');endelseerror('请检查输入参数的个数!');end% 初始化参数en = zeros(itr,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差W = zeros(M,itr); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0% 迭代计算for k = M:itr % 第k次迭代x = xn(k:-1:k-M+1); % 滤波器M个抽头的输入y = W(:,k-1).' * x; % 滤波器的输出en(k) = dn(k) - y ; % 第k次迭代的误差% 滤波器权值计算的迭代式W(:,k) = W(:,k-1) + 2*mu*en(k)*x;end% 求最优时滤波器的输出序列yn = inf * ones(size(xn));for k = M:length(xn)x = xn(k:-1:k-M+1);yn(k) = W(:,end).'* x;end
测试调用已经写好的最小二乘法算法
%function main()close all% 周期信号的产生 t=0:99;xs=10*sin(0.5*t);figure;subplot(2,1,1);plot(t,xs);grid;ylabel('幅值');title('{输入周期性信号}');% 噪声信号的产生randn('state',sum(100*clock));xn=randn(1,100);subplot(2,1,2);plot(t,xn);grid;ylabel('幅值');xlabel('时间');title('{随机噪声信号}');% 信号滤波xn = xs+xn;xn = xn.' ; % 输入信号序列dn = xs.' ; % 预期结果序列M = 20 ; % 滤波器的阶数rho_max = max(eig(xn*xn.')); % 输入信号相关矩阵的最大特征值mu = rand()*(1/rho_max) ; % 收敛因子 0 < mu < 1/rho[yn,W,en] = LMS(xn,dn,M,mu);% 绘制滤波器输入信号figure;subplot(2,1,1);plot(t,xn);grid;ylabel('幅值');xlabel('时间');title('{滤波器输入信号}');% 绘制自适应滤波器输出信号subplot(2,1,2);plot(t,yn);grid;ylabel('幅值');xlabel('时间');title('{自适应滤波器输出信号}');% 绘制自适应滤波器输出信号,预期输出信号和两者的误差figure plot(t,yn,'b',t,dn,'g',t,dn-yn,'r');grid;legend('自适应滤波器输出','预期输出','误差');ylabel('幅值');xlabel('时间');title('{自适应滤波器}');
如果觉得《最小二乘算法MATLAB代码实现》对你有帮助,请点赞、收藏,并留下你的观点哦!