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
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.
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
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.
Dieses COC-Filter sieht schon mal gut aus. Das werde ich mal probieren.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.