Hallo Leute Kann mir jemand einen kommentierten (!) Beispiel-Code (VHDL) für einen simplen Moving Average Filter geben? Wäre nett, wenn mir jemand noch erklären könnte, wie das Teil funktioniert. Danke. Danke. Danke. Matthias
VHDL hab ich keines, kann aber erklären wie der funktioniert. Angenommen für 16 Datenwerte: Ein FIFO speichert kontinuierlich die letzten 16 Samples. Über diese gibt es eine Summe, also ein 17.ter Wert der die additive Summe über alle Werte im FIFO enthält. Wenn jetzt das nächste Sample reinkommt so passiert folgendes: 1.) den Wert des ältesten Samples aus dem FIFO von Summe subtrahieren 2.) den Wert des neusten Samples auf Summe addieren 3.) den neuesten Sample im FIFO ablegen Die Summe dividiert durch 16 ist der Durchschnitt. Je größer das Window des moving AVG's sein soll desto größer muß also der FIFO werden. Ansich also ein "komplizierter" Name für eine einfache Sache. Gruß Hagen
Hallo Hagen Lass mich ein Beispiel machen. Das sind 16 Werte. 5, 7, 4, 6, 5, 5, 6, 4, 7, 9, 3, 4, 6, 5, 7, 1. Ausummiert und durch 16 geteilt liefert: 84/16 = 5,25. Der Wert 5,25 wird weitergegeben. Jetzt kommt ein neuer Wert: 3. Nun wird dieser neue Wert 3 zu 84 addiert und die 1 abgezogen, wobei die 1 gleichzeitig rausfliegt. Also krieg ich 84 + 3 - 1 = 86. Das teile ich durch 16 und kriege 5,375. Der Wert 5,375 wird weitergegeben. Jetzt kommt der nächste Wert: 2. Nun wird dieser neue Wert 2 zu 86 addiert und die 7 abgezogen, wobei die 7 gleichzeitig rausfliegt. Also krieg ich 86 + 2 - 7 = 82. Das teile ich durch 16 und kriege 5,125. Der Wert 5,125 wird weitergegeben. Hagen, stimmt's bis hierher. Jetzt eine Frage: Alle Werte kommen "überabgetastet". Wie erreiche ich nun eine Dezimation? Kann einfach so Pi mal Daumen immer 7 Werte weglassen und nur jeden 8. Werte weitergeben? Gruss, Matthias
An sich ändert die Überabtastung nichts am Average selbst, da ja die events gleich verteilt bleiben. Jetzt ist es eine Frage, um wieviel Du überabgetastet hast; evtl. wird's schneller/einfacher, wenn Du einfach über alles den average bildest oder wirklich Dezimation lt. Lehrbuch betreibts, was aber auf jeden Fall mehr Resourcen benötigt (imo sinnvoll bei > 30-facher Abtastung). Viele Grüße Olaf
@Matthias Bei der Dezimation nimmt man normalerweise einen Tiefpass um hohe Frequenzanteile zu beseitigen und nach dem TP wird nur noch jeder N-te Abtastwert genommen, die anderen werden einfach ignoriert. Wo liegt denn das Average-Filter im Signalweg ?
Das stimmt so, zumindestens nach meinem Verständnis des moving AVGs. Die Dezimation hängt von dir ab wie du sie machen möchtest. In deinem Beispiel also eine 8 fach Dezimation. So wie du sie durchführst gehen 7/8 tel der Samples verloren und haben keinen Einfluß auf das Ergebnis mehr, du dezimierst also schon vorher. Du könntest aber auch einen 8 fach AVG benutzen und so die Dezimation von 8 Samples auf 1 Sample per Durchschnittsberechnung durchführen. Würdest du das nun kaskadieren zb. 1 solcher 8 fach AVG's wobei dessen Ausgabesample in einen 3 fach Moving AVG eingerechnet werden, dann hättest du schon fast wieder eine Interpolation gesehem vom 2. Output dieses 3 fach moving AVGs. Du benötigst im Grunde nur ein Entity das eine neue Component eines moving AVGs in VHDL implementiert. Zum Downsampling allozierst du ein 8 fach moving AVG und dessen Summenwert landet nach jeweils 8 Samples in einem 3 fach moving AVG. Du hast also mit dem 8 fach AVG dezimiert = Samplerate reduziert, aber "ohne Verluste". Mit dem anschließenden 3'er AVG glättest du diese Eingabe nochmals. Falls du das benötigst. Was willst du machen ? eventuell klärt diese Frage mehr. Gruß Hagen
Hi FPGA-User Bingo! Aber kann ich das denn einfach so machen, wie du gesagt hast: "...und nach dem TP wird nur noch jeder N-te Abtastwert genommen, die anderen werden einfach ignoriert." Dank' Dir. M.
Hagen, was das Teil genau machen soll, weiss ich auch nicht so genau, es ging mir halt so um das Grundverständnis des digitalen Teils eines Delta-Sigma-Wandlers und wie man anschliessend wieder zu einer niedrigen Frequenz kommt. Ich sage: DANKE !! Falls du irgendwo einen lehrreichen beispielhaften VHDL-Code auftreiben kannst, so wäre das mehr als genial. Ich versuche jetzt, mich weiter in dieses Thema einzulesen. Gruss, M.
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.