mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Einfaches Filterdesign im FPGA


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine hochfrequent abgetastetes Signal als digitalen Datenstrom 
im FPGA (32 Bit mit etwa 1MHz). Das Signal zeichnet logischerweise alles 
auf, was vom Wandler kommt. Aufgrund der Schaltung kommen da recht hohe 
Amplituden von etwa 20kHz an Störung rein. Man kann die 
16kHz-Messfrequenz richtig schön in den Daten sehen: ;-)  Für meine 
Bewertung muss ich jetzt dies soweit glätten, daß alles oberhalb von 
10kHz so ziemlich weg ist, und ich einen glatten Datenstrom mit wieder 
1MHz bekomme, aus dem ich alles niederfrequente herausziehen kann. Ich 
brauche in jedem Fall alle Frequenzen unterhalb von 2kHz sehr genau, da 
in diesem Bereich das Messsignal liegt. Da das Messignal wegdriftet und 
ich dies berechnen und korrigieren muss, will ich alles unter 100Hz 
nochmal rausfiltern und dann die Schaltung gegensteuern, daß der Drift 
kompensiert wird. (Ausgang DAc auf einen OP).

Wie das Analog zu machen wäre, ist mir klar: Einfach 2 steile Filter mit 
4kHz und 20Hz hintereinander, wobei der letzte den OP steuert, sodaß das 
niederfrequente Brummen aus dem Messsignal verschwindet.

Aber wie baut man das digital im FPGA ?

Reicht da einfach eine Mittelwertbildung mit Glättung ?

Wie stellt man die Grenzfrequenz ein?

Vielen Dank

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe 
http://www.mikrocontroller.net/articles/Digitale_S....

Die einfachste Vorgehensweise: berechne mit einem Filterdesignprogramm 
die Koeffizienten für einen FIR-Filter mit dem gewünschten Frequenzgang, 
und baue den Filteralgorithmus in VHDL nach. Problem: bei so einem 
schmalen Filter brauchst du (je nachdem wie steil die Flanken sein 
sollen) sehr viele Koeffizienten, und da pro Sample und Koeffizient eine 
32-Bit-Multiplikationen fällig ist ergibt das einen exorbitanten 
Rechenaufwand. Deshalb würde ich zuallererst mal mit einem Polyphasen- 
oder CIC-Filter die Samplerate um Faktor >10 reduzieren. Der Endfilter 
braucht dann weniger Koeffizienten und muss weniger Samples pro Sekunde 
verarbeiten. Außerdem würde ich überlegen ob die Auflösung nicht 
reduziert werden kann (welcher AD-Wandler liefert 32 Bit?).

Das nur ganz grob zur Vorgehensweise. Nimm dir am besten erst mal 
Matlab, Octave oder irgend eine andere Programmiersprache, und probier 
verschiedene Möglichkeiten offline aus, damit kannst du direkt sehen wie 
der Rechenaufwand und die Ergebnisse sind.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am einfachsten ist CIC: 
http://www.xilinx.com/ipcenter/catalog/logicore/docs/cic.pdf
Allerdings hat nen CIC mit 64fach downsampling zwischen 2 und 3 kHz nur 
schlappe 14dB Dämpfung oder so wenn ich richtig gerechnet habe, siehe 
Bild. Außerdem willst Du aller kleiner 100Hz ja auch wegwerfen, 
eigentlich ist das ne wunderbare Aufgabe für ein oder zwei IIR Filter 
zweiter Ordnung. Das design bzgl. Integer-Rechnung und Overflows ist 
aber nicht so trivial, auf jeden Fall benötigt Du Multiplizierer in 
Deinem FPGA.

Cheers
Detlef

Autor: Detlef _a (detlef_a)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, hier

Autor: Chefingenieur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei diesem Problem stellt sich die Frage nach der Signalintegrität. Wie 
genau muss das Signal noch sein? Jeder digitale Filter liefert 
Artefakte. Anders herum kann man auch mit diskrten Filtern arbeiten, 
wenn die Genauigkeit nicht so hoch sein soll. Ich denke mal, daß (da 
Wegfiltern der 10kHz verlangt wird) sowieso Rauschen im Signal ist und 
wir eher von 8 Bit reden, als von 32 Bit, oder?

Du kannst das Signal einfach mit 1:256 samplen und glätten, indem Du 
aufintegrierst. Dann werden aus der 1MHz die gewollten 4kHz.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieses COC-Filter sieht schon mal gut aus. Das werde ich mal probieren.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Chefingenieur:
Aufsummieren ist genau das was ein CIC-Filter erster Ordnung macht; wenn 
man damit direkt auf 4 kHz dezimiert hat man aber schon bei 1 kHz 
mehrere dB Dämpfung, mit "alle Frequenzen unterhalb von 2kHz sehr genau" 
wird es also nichts. Ich würde deshalb wie schon gesagt mehrstufig 
filtern: erst mit CIC auf einige kHz, und dann den Rest mit einem oder 
zwei FIR-Filtern.

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]
  • [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.