Forum: Digitale Signalverarbeitung / DSP / Machine Learning Einfaches Filterdesign im FPGA


von Jan (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Siehe 
http://www.mikrocontroller.net/articles/Digitale_Signalverarbeitung#FIR-_und_IIR-Filter.

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.

von Detlef _. (detlef_a)


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

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Ähm, hier

von Chefingenieur (Gast)


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.

von Jan (Gast)


Lesenswert?

Dieses COC-Filter sieht schon mal gut aus. Das werde ich mal probieren.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

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.