WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Block LMS im Frequenzbereich

 

stefatronik
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.08.13
Wohnort: Köln
Version: R2013a
     Beitrag Verfasst am: 22.08.2013, 11:34     Titel: Block LMS im Frequenzbereich
  Antworten mit Zitat      
Hallöchen!
Ich schreibe meine Masterarbeit über active noise cancelling und speziell dem LMS Algorithmus.
Ich habe bisher einen gewöhnlichen LMS programmiert der die gleichen Ergebnisse liefert, wie jener aus der DSP Toolbox.
Da ich mehr Filterkoeffizienten benötige und zugleich die Performance steigern möchte, habe ich nach [Kuo, Morgan Active Noise Control Systems, S252] einen sog. Frequency Domain Adaptive Filter programmiert. Der allerdings nicht funktioniert. Die Filterkoeffizienten schwingen auf. Ich kann das zwar unterbinden, indem ich die Schrittweite sehr stark verringere, dann passiert aber auch nichts mehr mit der Fehlersumme.
Zur Info: Ich möchte aus einem Gesamtsignal Sprache herausfiltern und den Lärm behalten. (ja, wirklich so herum)
Code:

for n=1:1:numIterations                 % process input vector blockwise
    blockIn=(n-1)*L+1;                  % start index for addressing
    blockOut=blockIn+L-1;               % end index for addressing
    xblock=x(blockIn:blockOut);         % use L samples to build block    
    Xblock=fft(xblock, L);              % FFT of the xk segment
        yn=ifft(Xblock.*W(:,n)');           % multiply and ifft --> convolution
    y(blockIn:blockOut)=yn;             % add values to output vector
    % calculate error vector (subtract output vector from desired signal)
    en=d(blockIn:blockOut)-yn;          % actual error block to be written
    e((blockIn):(blockOut))=en;         % on NEXT position in error vector
%% update all L filter weights and save the new ones as columns
% INFO: weight matrix [L] rows and [num_iterations] colums
    for m=1:1:L                         % m is the actualizing weight
        m1=conj(Xblock(m));
        Eblock=fft(en,L);
        W(m,n+1)=W(m,n) + stepsize*m1*Eblock(m);
    end % for (filter update)

 


Wie gesagt werden einige wenige Filterkoeffizienten recht groß ... (etwa 10^60) Confused
Ansonsten noch ein paar Parameter, die ich verwende:
Länge der Blöcke = Länge der FFT = getestet von 32...2048
Stepsize im bereich von 0.001...2
numIterations ist die Anzahl der Iterationen, die sich als ganzzahliger Teiler aus der Länge des Referenzsignals x und der Filterlänge L ergibt.

Ich könnte mir vorstellen, dass es irgendwo beim Update der Filterkoeffizienten (W-Matrix) Probleme gibt. Hier verstreicht auch jede Menge Zeit, die den Algorithmus langsamer macht, als es der Algo mit der konventionellen Faltung war! Rolling Eyes
Weitere Infos liefere ich gerne nach...
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.