⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adapt_lms.m

📁 利用matlab编写的自适应最小二乘滤波程序
💻 M
字号:
function adapt_lms(block)
% Level-2 M file S-Function for system identification using 
% Least Mean Squares (LMS).
%   Copyright 1990-2004 The MathWorks, Inc.
%   $Revision: 1.1.6.3 $

  setup(block);
  
%endfunction

function setup(block)
  
  %% Register dialog parameter: LMS step size 
  block.NumDialogPrms = 1;
  block.DialogPrmsTunable = {'Tunable'};
  % block.DialogPrm(1).Name = 'StepSize';
  % block.DialogPrm(1).DataTypeId = 0;
  
  %% Regieste number of input and output ports
  block.NumInputPorts  = 2;
  block.NumOutputPorts = 1;

  %% Setup functional port properties to dynamically
  %% inherited.
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;

  block.InputPort(1).Complexity   = 'Real'; 
  block.InputPort(1).DataTypeId   = 0;
  block.InputPort(1).SamplingMode = 'Sample';
  block.InputPort(1).Dimensions   = 16;
  
  block.InputPort(2).Complexity   = 'Real';
  block.InputPort(2).DataTypeId   = 0;
  block.InputPort(2).SamplingMode = 'Sample';
  block.InputPort(2).Dimensions   = 16;
  
  block.OutputPort(1).Complexity   = 'Real';
  block.OutputPort(1).DataTypeId   = 0;
  block.OutputPort(1).SamplingMode = 'Sample';
  block.OutputPort(1).Dimensions   = 16;
  
  %% Register methods
  block.RegBlockMethod('CheckParameters',         @CheckPrms);
  block.RegBlockMethod('ProcessParameters',       @ProcessPrms);
  block.RegBlockMethod('PostPropagationSetup',    @DoPostPropSetup);
  block.RegBlockMethod('Start',                   @Start);  
  block.RegBlockMethod('WriteRTW',                @WriteRTW);
  block.RegBlockMethod('Outputs',                 @Outputs);
  
  %% Block runs on TLC in accelerator mode.
  block.SetAccelRunOnTLC(true);
  
%endfunction

function CheckPrms(block)
  mu = block.DialogPrm(1).Data;
  
  if mu <= 0 || mu > 1
    error('Step size must be a scalar between 0 and 1.');
  end
  
%endfunction

function DoPostPropSetup(block)

  %% Setup Dwork  
  N = 16;                    %% Filter length   
  block.NumDworks = 2;
  block.Dwork(1).Name = 'X'; %% u[n],...,u[n-15]
  block.Dwork(1).Dimensions      = N;
  block.Dwork(1).DatatypeID      = 0;
  block.Dwork(1).Complexity      = 'Real';
  block.Dwork(1).UsedAsDiscState = true;
  
  block.Dwork(2).Name = 'H'; %% Filter coefficients
  block.Dwork(2).Dimensions      = N;
  block.Dwork(2).DatatypeID      = 0;
  block.Dwork(2).Complexity      = 'Real';
  block.Dwork(2).UsedAsDiscState = true;
  
  block.Dwork(2).Name = 'Y'; %% y[n],...,y[n-15]
  block.Dwork(2).Dimensions      = N;
  block.Dwork(2).DatatypeID      = 0;
  block.Dwork(2).Complexity      = 'Real';
  block.Dwork(2).UsedAsDiscState = true;
  
  %% Register all tunable parameters as runtime parameters.
  block.AutoRegRuntimePrms;

%endfunction

function ProcessPrms(block)

  block.AutoUpdateRuntimePrms;
 
%endfunction

function Start(block)
  
  %% Initialize Dwork 
  block.Dwork(1).Data = zeros(16, 1);
  block.Dwork(2).Data = zeros(16, 1);
  
%endfunction

function Outputs(block)
  
  mu = block.RuntimePrm(1).Data;
  N  = 16; 
  
  u = block.InputPort(1).Data;
  d = block.InputPort(2).Data;
  
  X = block.Dwork(1).Data;
  H = block.Dwork(2).Data;
  
  %%
  %% H^(n+1)[i] = H^(n)[i]+mu*(d(n)-y(n))*u(n-i) 
  %% 
  %% X(2:N) = X(1:N-1);
  %% X(1)   = u;
  X      = u;
  y      = X'*H;
  e      = d-y;
  H      = H+mu*e*X;
  Y(2:N) = X(2:N);
  Y(1)   = y;

  block.Dwork(1).Data = X;
  block.Dwork(2).Data = H;
  block.OutputPort(1).Data = Y;

  %% Outputs the difference between the estimated filter coefficients
  %% and the actual coefficients.
  b = evalin('base','b'); %% b is the actual filter coefficients
  block.OutputPort(2).Data = norm(b'-H);
  
%endfunction

function WriteRTW(block)
  
  b = evalin('base','b');
  block.WriteRTWParam('matrix', 'ActualCoefs', b);

%endfunction

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -