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