a b/preprocessOfApneaECG/BioSigKit/Algorithms/RLS.m
1
function [yn,en] = RLS(ref,sig,M,lamda)
2
%% ================== Recursive Least Squares Filter ================ %%
3
%% === Inputs ===== %%
4
% ref: Reference signal channel (vector)
5
% sig: Input signal channel (vector)
6
% M : Order of the filter
7
% lambda : learning parameter
8
%% ==== Outputs ====== %%
9
% yn : output signal 
10
% en : error signal
11
%% ============= Author =============== %%
12
% Hooman Sedghamiz, May, 2018
13
if nargin < 4
14
    lamda = 1; % default
15
end
16
17
%% ==================== Initialization ======================== %%
18
n = length(sig);              %Signal Length
19
w = randn(M,1);               %Weights
20
P = eye(length(w))*0.01;      %Inverse input autocorrelation
21
invlamda = 1/lamda;
22
u = zeros(M,1);               %Input Signal
23
yn = zeros(1,n);              %Output
24
en = zeros(1,n);              %error sig
25
26
%% ===================== Adaptive Loop ========================= %%
27
 for i = 1 : n
28
    u = [ref(i); u(1:end-1)]; %[u(n)...,u(n-M+1)]
29
    yn(i) = w'*u;             %Output of Adaptive Filter
30
    en(i) = sig(i) - yn(i);   %Error Sig
31
    
32
    r = invlamda*P*u;         % Inverse Correlation Matrix
33
    g = r/(1+u'*r);           % Update Gradient
34
    w = w + g.*en(i);         % Update Weights
35
    
36
    P = invlamda*(P-g*u'*P);  % Inverse Corr matrix   
37
 end
38
39
40
41
42
43
44
45
46
47
48
end