LMS-Adaption

Gast #390457
Lesenswert?
• ▲
▼
Hallo zusammen,

ich versuche im Moment den LMS-Algorithmus zu verstehen und
anschließend zu implementieren. Jedoch verstehe ich den Ablauf der
Tap-Adaption nicht so recht!?! Im Moment bin ich mir nicht sicher ob
die Tabs zwischen jeden Filtertakt mit min(e[k]) adaptiert werden oder
ob nach jedem Filtertakt w(k+1) errechnet wird und die Adaption sich
aus mehreren Filterzyklen ergibt.

Die Verwirrung kommt dadurch, dass es zwei es Formel gibt, welche ich
vermutlich falsch interpretiere:

w_i[k+1] = w_i[k] + step * x[k] *e[k];
=> Adaption über die Filterzyklen???

w_i_neu[k] = w_i_alt[k] + step * x[k-i] * e[k]
mit i = Tapindex
    k = Zeitindex
=> Adaption zwischen den Filtertakten???


Vielleicht gibt es auch einfach zwei Möglichkeiten den LMS zu
implementieren!?!

Gruß && Danke

Jochen
#390460
Lesenswert?
• ▲
▼
Ihr dürft ja interessante Sachen machen, oh seliges Studentenleben!

Die drei Formel von Seite 5-8:

1. mit der aktuellen geschätzten Impulsantwort hdach des zu
adaptierenden Sstems und Deinem aktuellen Eingangswert x[k] berechnest
Du ydach.

2. Das vergleichste mit Deinem realen Meßsignal y[k] und kriegst den
Fehler.

3. Anhand dieses Fehlers und Deiner Schrittweite ziehst Du hdach nach.

Ich verstehe an Deinem post nicht, was Du mit Filtertakten und
Filterzyklen meinst. hdach[k] und x[k] sind Vektoren, das sind nicht
nur Skalare!

Cheers
Detlef
Gast #390461
Lesenswert?
• ▲
▼
hallo,

zu deiner Frage:
=> Filterzyklen => Zeit um einen Sig.Vek. x[k]=[0 0 0 1 0 0 3 0 0] zu
filtern, K = 0...N-1.
=> Filtertakt => Zeit um einen Wert des Sig.Vek. zu filtern z.B. x[k=3]
= 1

Also ich habe jetzt eine Lösung nach dem folgenden Algorithmus
implementiert:

solange 1==1
{
   /* Filterzyklus => der Sig.Vek. wird zyklisch gefiltert*/
   bis k-- == 0
   {
       /* Filtertakt=> der Sig.Wert wird x[k=1,2...] wird gefiltert*/
       Filter  x[k] /*(call fir)*/
       errechne (e[k])
       adaptiere die TAP's/*(call adap)*/
   }
}

Die Tabs's werden in einem Zirkulären-Puffer gespeichert. Den Puffer
habe ich mit (Anzahl_TABs*länge_SigVek*2) dimensioniert. Somit habe ich
die Möglichkeit für alle k+1 die TABs zu speichern mit den berechneten
TABs im nächsten Zyklus zu filtern und dieser wieder neu zu berechnen.
Realisiert habe ich das mit zwei Pointern auf den Zierklären-Puffer.
Der erste zeigt auf den Anfang des SP-Bereichs der zweite in die Mitte.
Da es sich um einen Zirk.-Puffer handelt laufen diese im Kreis mit dem
Abstand Anzahl_TABs*länge_SigVek.

Nun das ganze funktioniert auch, aber ich bin mir nicht sicher ob dies
 einer guten Lösung entspricht, da der Sp.-Bedarf bei entsprechend
vielen Koeffs ernorm groß wird!?!

jetzt muss ich noch das 1.15 Format ergänzen... Damit ich eine kleinere
Schrittweite wählen kann.

Danke für deine Hilfe...

Gruß Jochen

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.