LMS滤波器MATLAB函数
function [yn,W,en]=LMSPrediction(xn,M,mu,k) % LMS(Least Mean Squre)算法 % 输入参数:
% xn 输入的信号序列 (列向量)
% M 滤波器的阶数 抽头数 (标量)
% mu 收敛因子(步长) (标量) 要求大于0,小于xn的相关矩阵最大特征值的倒数
% k 预测阶数 (标量) % 输出参数:
% W 滤波器的权值矩阵 (矩阵) % 大小为M x itr,
% en 误差序列(itr x 1) (列向量)
% yn 实际输出序列 (列向量) % 参数个数必须为4个或5个
itr = length(xn); % 4个时递归迭代的次数为xn的长度 % 初始化参数
en = zeros(itr,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
W = zeros(M,itr); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0 % 迭代计算
yn = zeros(size(xn)+k,1);
for n = (M+k):itr % 第n次迭代
xn_k = (-1)*xn((n-k):-1:(n-k-M+1));%-x(n-k) -x(n-k-1).... -x(n-k-M+1) en(n) = xn(n) - W(:,n-1).' * xn_k; % 第n次迭代的误差 % 滤波器权值计算的迭代式
W(:,n) = W(:,n-1) + mu*en(n)*xn_k;
x = (-1)*xn(n:-1:n-M+1); % 滤波器M个抽头的输入 x= -x(n) -x(n-1) ....-x(n-m+1)
yn(n+k) = W(:,n).' * x; % 滤波器的预测输出 end
LMS算法试用程序
%function main() clear; clc;
% 信号的产生
load 'E:\\skeleton\\角度计算数据\\角度计算数据\\leftknee8p36m.mat';
Fs = 120; % Sampling frequency T = 1/Fs; % Sample time xs=beta;
xs(159:160)=xs(159:160) + 50;
L = length(xs); % Length of signal t = (0:L-1)*T; % Time vector % 信号滤波
xn = xs.' ; % 输入信号序列 列向量 dn = xn ; % 预期结果序列 列向量 M = 20 ; % 滤波器的阶数 k = 0; %预测阶数
mu = 0.000009; % 收敛因子 0 < mu < 2 0.0002 [yn,W,en] = LMSPrediction(xn,M,mu,k);
[MAXet,RMSet,MAEet,PR,STS] = AccuaryCalculate(xn,yn(1:L),M,k); % 绘制自适应滤波器输出信号,预期输出信号和两者的误差 figure
plot(t,yn(k+1:end),'-r',t,dn,'-b');grid;
legend('LMS滤波输出yn','原始信号xn'); ylabel('幅值'); xlabel('时间');
title('na=20 k=1 u=0.000009 STS=0.0789 PR=88.88%');
运行结果
自适应滤波器40滤波输出yn原始信号--dn 302010幅值0-10-20-30 00.5时间11.5