www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Moving Average Filter


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser AVG wirkt wie ein Tiefpass.

Gruß hagen

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Olaf (ope) !!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.