Forum: Digitale Signalverarbeitung / DSP / Machine Learning LMS-Adaption


von Jochen B. (Gast)


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

von Detlef _. (detlef_a)


Lesenswert?

Ehm, worauf beziehst Du Dich bei Deiner Namensgebung, was willst Du auf
was adaptieren, e[] ist Fehler(?) von was, x[] ist Eingang(?) von was,
was issn w.

Paar Details und Referenzen kämen gut!

Cheers
Detlef

von Jochen B. (Gast)


Lesenswert?

oh, sorry...

K: Zeit , 0...k
x: Eingangssignal
y: Ausgangssignal
d: desire signal
w: Filterkoeffizienten
i: Tapindex

e[k] = d[k] - y[k]: Fehler

Refs: Erste Formel, jedoch habe ich h(Impulsantwort) durch w(weight)
ersetzt:
http://www-nt.e-technik.uni-erlangen.de/LMS/lecture/prakt_dsv/script/v5.pdf
Seite 5-8,
Zweite Formel kommt von meinem Prof. Die hat er mal hergeleitet.

von Detlef _. (detlef_a)


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

von Jochen B. (Gast)


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

von Jochen B. (Gast)


Angehängte Dateien:

Lesenswert?

Hier mein SourceCode(ADSP2100-Assembler)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.