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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.