- refactored
This commit is contained in:
Executable
+55
@@ -0,0 +1,55 @@
|
||||
% RLS-Algorithmus
|
||||
% ---------------
|
||||
% function [dd,e,wf,fpo] = rls(x,d,N,mu,rho,wi)
|
||||
%
|
||||
% Parameter:
|
||||
% x : Eingangssignal
|
||||
% d : erwünschtes Signal (Referenzsignal)
|
||||
% N : Filterordnung
|
||||
% mu : konstante Schrittweite
|
||||
% rho : Vergessensfaktor
|
||||
% wi : Startwerte der Filterkoeffizienten im Zeitbereich
|
||||
%
|
||||
% Rückgabewerte:
|
||||
% dd : Schätzung d' des Referenzsignals d aus x
|
||||
% e : Fehler d - d'
|
||||
% wf : Filterkoeffizienten am Ende der Adaption im Zeitbereich
|
||||
% fpo : Anzahl der benötigten Floating-Point Operationen
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
% Datum : 27.3.2002
|
||||
% Autor : Jens Ahrensfeld
|
||||
% Thema : Diplomarbeit
|
||||
% Datei : rls.m
|
||||
%
|
||||
% -------------------------------------------------------------------------
|
||||
function [dd,e,wf,fpo] = rls(x,d,N,mu,rho,wi)
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
% Initialisierung RLS
|
||||
% -------------------------------------------------------------------------
|
||||
wf = wi;
|
||||
dd = zeros(length(x),1);
|
||||
e = zeros(length(x),1);
|
||||
eta = 1000000;
|
||||
R_ = eta * eye(N); % inverse Autokorrelationsmatrix R
|
||||
flops(0);
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
% RLS Adaptation
|
||||
% -------------------------------------------------------------------------
|
||||
for n = N : length(x)
|
||||
xs = x(n:-1:n-N+1); % Eingangsvektor
|
||||
dd(n) = xs' * wf; % Filterung
|
||||
e(n) = d(n) - dd(n); % a priori-Fehler
|
||||
z = R_ * xs; % gefilterter Datenvektor z
|
||||
vn = 1/(rho + xs'*z); % Normierungskonstante
|
||||
zn = vn*z; % Normierung
|
||||
wf = wf + mu*e(n)*zn; % Aktualisierung der Filterkoeffizienten
|
||||
R_ = 1/rho * (R_ - zn*xs'*R_); % Aktualisierung der inversen
|
||||
% Autokorrelationsmatrix R
|
||||
end ;
|
||||
fpo = flops;
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
% Ende rls.m
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% %
|
||||
% RLS Algorithm %
|
||||
% %
|
||||
% Written By: Sundar Sankaran and A. A. (Louis) Beex %
|
||||
% DSP Research Laboratory %
|
||||
% Dept. of Electrical and Comp. Engg %
|
||||
% Virginia Tech %
|
||||
% Blacksburg VA 24061-0111 %
|
||||
% %
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
randn('seed', 0) ;
|
||||
rand('seed', 0) ;
|
||||
|
||||
NoOfData = 8000 ; % Set no of data points used for training
|
||||
Order = 32 ; % Set the adaptive filter order
|
||||
|
||||
Lambda = 0.98 ; % Set the forgetting factor
|
||||
Delta = 0.001 ; % R initialized to Delta*I
|
||||
|
||||
x = randn(NoOfData, 1) ;% Input assumed to be white
|
||||
h = rand(Order, 1) ; % System picked randomly
|
||||
d = filter(h, 1, x) ; % Generate output (desired signal)
|
||||
|
||||
% Initialize RLS
|
||||
|
||||
P = Delta * eye ( Order, Order ) ;
|
||||
w = zeros ( Order, 1 ) ;
|
||||
|
||||
% RLS Adaptation
|
||||
|
||||
for n = Order : NoOfData ;
|
||||
|
||||
u = x(n:-1:n-Order+1) ;
|
||||
pi_ = u' * P ;
|
||||
k = Lambda + pi_ * u ;
|
||||
K = pi_'/k;
|
||||
e(n) = d(n) - w' * u ;
|
||||
w = w + K * e(n) ;
|
||||
PPrime = K * pi_ ;
|
||||
P = ( P - PPrime ) / Lambda ;
|
||||
w_err(n) = norm(h - w) ;
|
||||
|
||||
end ;
|
||||
|
||||
|
||||
% Plot results
|
||||
|
||||
figure ;
|
||||
plot(20*log10(abs(e))) ;
|
||||
title('Learning Curve') ;
|
||||
xlabel('Iteration Number') ;
|
||||
ylabel('Output Estimation Error in dB') ;
|
||||
|
||||
figure ;
|
||||
semilogy(w_err) ;
|
||||
title('Weight Estimation Error') ;
|
||||
xlabel('Iteration Number') ;
|
||||
ylabel('Weight Error in dB') ;
|
||||
Executable
+71
@@ -0,0 +1,71 @@
|
||||
%===================================================================
|
||||
%-------------------------------------------------------------------
|
||||
%
|
||||
% Adaptive Filter
|
||||
%
|
||||
% Simulationen
|
||||
%
|
||||
% [E,W,w,inv_R]=rls(N,X,D,w_start,rho)
|
||||
%
|
||||
% RLS-Algorithmus
|
||||
%
|
||||
% E = Fehlersignal E[.]
|
||||
% W = Filterkoeffizienten im zeitlichen Verlauf
|
||||
% w = Filterkoeffizienten am Ende der Adaption
|
||||
% inv_R = Inverse deterministische Korrelationsmatrix
|
||||
% nach Adaptionsende
|
||||
% N = Anz. Filterkoeffizienten = Filterordnung+1
|
||||
% X = Filtereingang X[.]
|
||||
% D = erwuenschtes Signal D[.]
|
||||
% w_start = Startwerte Filterkoeffizienten
|
||||
% rho = Vergessensfaktor
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
%
|
||||
% author: Markus Hofbauer
|
||||
% ISI, ETH Zuerich (Switzerland)
|
||||
%
|
||||
% created: 7/2000
|
||||
%
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
%
|
||||
% File : rls.m
|
||||
%
|
||||
% Startfile: simX.m
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
%===================================================================
|
||||
|
||||
function [E,W,w,inv_R]=rls(N,X,D,w_start,rho)
|
||||
|
||||
p0=1000000; % Initialisierung von
|
||||
inv_R=p0*eye(N); % inv_R
|
||||
|
||||
adaptlen=length(X);
|
||||
w= w_start;
|
||||
W=zeros(N,adaptlen);
|
||||
E=zeros(adaptlen,1);
|
||||
|
||||
%-------------------------------------------------------------------
|
||||
% RLS Update Loop
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
for i=N:adaptlen
|
||||
|
||||
W(:,i)=w;
|
||||
|
||||
x = X(i:-1:i-N+1); % Eingangsvektor (x[k],x[k-1],..,x[k-N+1])
|
||||
y=x'*w; % Filterausgang
|
||||
e=D(i)-y; % Fehler
|
||||
|
||||
c=1/(rho+x'*inv_R*x);
|
||||
inv_R=1/rho*(inv_R-c*inv_R*x*x'*inv_R); % Aufdatierung von inv_R
|
||||
w=w+inv_R*e*x; % Aufdatierung von w
|
||||
|
||||
E(i)=e;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user