Forum: FPGA, VHDL & Co. Moving Average Filter


von Matthias (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von ope (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

@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 ?

von Hagen (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

Dieser AVG wirkt wie ein Tiefpass.

Gruß hagen

von Matthias (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

Danke Olaf (ope) !!

von Matthias (Gast)


Lesenswert?

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