|
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 |