- refactored
This commit is contained in:
Executable
+108
@@ -0,0 +1,108 @@
|
||||
%===================================================================
|
||||
%-------------------------------------------------------------------
|
||||
%
|
||||
% Adaptive Filter
|
||||
%
|
||||
% Simulationen
|
||||
%
|
||||
% [ee,w,dd,calc,Px]=flms2(mu,N,C,L,x,d,w_start)
|
||||
%
|
||||
% FLMS-Algorithmus
|
||||
%
|
||||
% ee = Fehlersignal
|
||||
% w = Filterkoeffizienten am Ende der Adaption
|
||||
% dd = Filterausgang, Schaetzung von d
|
||||
% calc = Rechenzeit
|
||||
% Px = Schaetzung des Leistungsdichtespektrums vom x
|
||||
% mu = Schrittweite
|
||||
% N = Anz. Filterkoeffizienten = Filterordnung+1
|
||||
% X = Filtereingang x[.]
|
||||
% d = erwuenschtes Signal d[.]
|
||||
% w_start = Startwerte Filterkoeffizienten
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
%
|
||||
% author: Markus Hofbauer
|
||||
% ISI, ETH Zuerich (Switzerland)
|
||||
%
|
||||
% created: 7/2000
|
||||
%
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
%
|
||||
% File : flms2.m
|
||||
%
|
||||
% Startfile: sim5.m
|
||||
%
|
||||
%-------------------------------------------------------------------
|
||||
%===================================================================
|
||||
|
||||
function [ee,w,dd,calc,PX,u]=flms2(mu,N,C,L,x,d,w_start)
|
||||
|
||||
% Initialisierungen
|
||||
|
||||
ee=zeros(lge(x),1); % Fehlervektor
|
||||
dd=zeros(lge(x),1); % Filterausgang, Schaetzung von d
|
||||
WS = zeros(C,1); % Gewichtsvektor im Frequenzbereich
|
||||
w = zeros(C,1); % Gewichtsvektor im Zeitbereich
|
||||
PX = zeros(C,1); % Schaetzung des Leistungsdichtespektrums
|
||||
X = zeros(C,1); % Eingangsvektor im Frequenzbereich
|
||||
u = zeros(C,1);
|
||||
|
||||
%% FLMS Parameter
|
||||
numblk = floor(lge(x)/L); % Anzahl Verarbeitungsbloecke
|
||||
begin=ceil(C/L)-1; % erster Blockindex
|
||||
gamma = 0.97; % Vergessensfaktor
|
||||
alpha = 1.0; % 0 < alpha < 1
|
||||
|
||||
tic; % Stopuhr laeuft
|
||||
|
||||
dspMul = C
|
||||
dspShift = log2(dspMul)
|
||||
|
||||
%-------------------------------------------------------------------
|
||||
% FLMS Update Loop
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
for j = begin: numblk-1
|
||||
|
||||
% DFT von x, Laenge C
|
||||
X = dspfft(x((j+1)*L-C+1:(j+1)*L),C); % aktuellster Wert
|
||||
% des Blockes: (j+1)*L
|
||||
% Filterung im Frequenzbereich
|
||||
YS = ((X*dspMul) .* (WS*dspMul));
|
||||
|
||||
ys = real(dspifft(YS,C)); % IDFT, Filterausgang im Zeitbereich
|
||||
|
||||
% Fehlersignal im Zeitbereich
|
||||
ee(j*L+1:(j+1)*L) = d(j*L+1:(j+1)*L) - ys(C-L+1:C);
|
||||
% Overlap-Save-Verfahren: nur die letzten L Werte von ys
|
||||
% werden verwendet um eine lineare Faltung zu erhalten
|
||||
|
||||
% Fehlersignal im Frequenzbereich
|
||||
E = dspfft([zeros(C-L,1); ee(j*L+1:(j+1)*L)],C);
|
||||
|
||||
% Update von PX
|
||||
PX=abs((1-gamma)*conj(X).*X*dspMul + gamma * PX);
|
||||
|
||||
% umax = alpha
|
||||
u = (alpha*mu/dspMul) ./(PX+mu/dspMul);
|
||||
|
||||
% Update von WS
|
||||
WS = WS + u .* conj(X).* E ; % Adaption von WS
|
||||
|
||||
% Projektion (letzten L-1 Werte von w zu Null setzten)
|
||||
w = real(dspifft(WS,C));
|
||||
WS = dspfft(w(1:C-L+1),C);
|
||||
|
||||
|
||||
dd(j*L+1:(j+1)*L) = ys(C-L+1:C); % Abspeichern der Schaetzung
|
||||
|
||||
end;
|
||||
|
||||
calc=toc; % Stopuhr angehalten
|
||||
w = [w(1:C-L+1) ; zeros(L-1,1)]; % Filterkoeffizienten am Ende der Adaption
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user