Eigentlich sagt der Titel schon was ich suche: ich habe einen digitalen
Regler (Spannungsregler eines Buck Wandlers) in einem FPGA und meine
Spannungsmessung ist total gestört. Jetzt möchte ich diese Störungen aus
dem Messsignal rausfiltern, habe jedoch das Problem, dass ich auch eine
gute Dyanmik erreichen möchte und daher den Phasenverlust für die
Messung klein halten möchte. Ganz allgemein kam daher die Frage auf: was
für einen Filtertyp nimmt man in so einem Fall? Ich habe mich bisher
leider zu wenig mit digitalen Filtern auseinandergesetzt und kann daher
nicht wirklich exakte Anforderungen nennen. Was mir so ca. vorschwebt:
- Die Störungen liegen bei ca. 500 kHz und darüber. Ca. -40 dB (besser
-60 dB) für f > 500 kHz würde ich anpeilen.
- Eine Grenzfrequenz von 50 kHz wäre akzeptabel, mit weniger als -45°
Phase bei dieser Frequenz
- Sampling Frequenz ist 50 MHz, Resourcen sind erheblich vorhanden (fast
leeres Zynq FPGA)
Ist mein Vorhaben überhaupt realistisch? Einfach realisierbar oder nicht
zu schaffen? Welche Filterordnung, Typ (IIR, FIR,...?) würdet ihr für
sowas empfehlen?
DrowninginNoise schrieb:> Phasenverlust
Sowas wie einen Phasen-VERLUST gibt es gar nicht. Was du vermutlich
meinst, ist das Ansteigen der Verzögerungszeit in der Regelschleife, das
dadurch bewirkt wird, daß ein einigermaßen symmetrisches Filter immer
zugleich eine Verzögerung darstellt.
Bedenke mal, daß für ein symmetrisches Filterverhalten das Filter
gleiche Anzahl von Samples in der Vergangenheit und Zukunft braucht. Mit
der Vergangenheit hat man ja kein Problem, aber um auch Samples in der
Zukunft zu haben, braucht es einen Vorlauf voon soviel Abtastperioden,
wie du Samples in der Zukunft haben willst.
Jetzt weiß ich nicht, ob du mit asymmetrischem Filterkernel arbeiten
bzw. experimentieren willst. Also z.B. mit 10 Samples in der
Vergangenheit, einem aktuellen und einem in der Zukunft. Das würde nur
eine Verzögerung um eine Abtastperiode ausmachen, aber ich wage da keine
Prognose, ob dir das den erhofften Effekt oder nur Ärger einbringt.
W.S.
So schwer ist die Anforderung nicht, Butterworth 5er Ordnung mit
Grenzfrequenz 200kHz@50Ms/s kriegt das hin.
Phase bei 50kHz ~ -45°, Amplitude bei 500kHz -40dB.
Implementierung in integer ist etwas tricky, weil die Pole so nahe am
Einheitskreis liegen, 16x16Bit reichen da nicht.
[fb,fa]=butter(5,200e3/25e6,'low');
H=freqz(fb,fa,25000);
fa = 1.000000000000000 -4.918669365405449 9.677974987219251
-9.521826441504182 4.684406647007157 -0.921885817686204
fb = 1.0e-08 *
0.030095542724595 0.150477713622976 0.300955427245952
0.300955427245952 0.150477713622976 0.030095542724595
Cheers
Detlef
PS: wenn ich den Faktor 1e-8 sehe wird das sehr tricky.
So, über die Feiertage kam ich endlich dazu, mich mit dem Thema ein
bisschen mehr auseinander zu setzen. So einfach wie ich mir das
vorgestellt hatte dürfte das wieder einmal nicht werden. Zudem haben
sich die Anforderungen auch noch zu geändert, vor allem die Samplerate
soll auf 150 MS/s hochgehen (damit wir es auch noch in einem anderen
Projekt einsetzen können).
-https://www.xilinx.com/support/documentation/white_papers/wp330.pdf
habe ich gelesen. Das Dokument wird immer wieder zitiert, scheint ein
"Standardwerk" zu sein.
- Als erstes habe ich mit dem Filter Designer von Matlab herumgespielt.
Das Tool ist an sich eigentlich recht interessant und hat mir mit ein
bisschen Probieren gleich ganz passable Ergebnisse ausgespuckt. Ich habe
dann das Filter quantisiert, war zwar ab der vielen Optionen
einigermassen überfordert, aber für den Anfang reichts. Anschliessend
habe ich den VHDL Code aus Matlab heraus generieren lassen.
- Die Simulation des VHDL Codes in Vivado funktioniert ganz gut, also
bin ich anschliessend zur Synthese + Implementierung übergegangen. Hier
stiess ich anschliessend auf das Problem, dass ich keine Chance hatte
das Timing zu erfüllen (mit riesigem Slack von ca. 17 ns auf einigen
Pfaden).
- Dass ich das Timing nicht einhalten konnte wunderte mich eigentlich
überhaupt nicht. Ich habe zwar das Filter in SOS zerlegen lassen und
Pipeline Register zwischen den Sections platziert, die Daten müssen aber
immer noch durch einige Addierer und Multiplizierer durch.
- Es stellt sich für mich nun die Frage, was ich gegen das Timing
Problem unternehmen kann. Beim ersten naiven Versuch hatte ich einen
Clock von 250 MHz auf einem Artix FPGA (Speedgrade 1) eingestellt. Das
finale Design wird auf einem Kintex (Speedgrade 3) mit nur 150 MHz
implementiert -> etwas Luft nach oben dürfte es geben, aber vermutlich
nicht genug, um 17 ns negative Slack rauszuholen.
- Da es sich um ein IIR Filter handelt gestaltet sich Pipeling (bedingt
durch den Rückkoppelpfad) offenbar als eher schwierig. Im obigen
Whitepaper von Xilinx ist eine Möglichkeit drin, bei der zusätzliche
Pole platziert werden, die dann durch zusätzliche Nullstellen
kompensiert werden ("Scattered Lookahead"). Ich habe das Prinzip zwar
verstanden, allerdings (zumindest habe ich nichts entsprechendes
gefunden) unterstützt der Filter Designer von Matlab diese Option nicht.
Somit müsste ich diese zusätzlichen Pole und Nullstellen von Hand
platzieren und alle nachfolgenden Schritte (insbesondere die
Quantiesierung + Beschreibung in VHDL) von Hand durchführen. Das traue
ich mir ob der vielen Optionen (verschiedene Arten von Rundung,
Overflow, Bitbreiten der internen Grössen) nicht so ganz zu.
Bei meiner Suche im Internet habe ich erstaunlich wenig gefunden. Ich
dachte eigentlich, vor einem Standardproblem zu sitzen für das es
bereits dutzende Lösungen und vor allem fertige Tools gibt, dem scheint
aber nicht so. Wie geht ein Profi hier also vernünftig (also vor allem
zeiteffizient) vor? Ich hatte eigentlich gehofft, um Dinge die Wahl der
Bitbreiten für Koeffizienten, Handling von Overflows, Quantisierung und
Stabilitätsanalyse etc. herumzukommen. Den VHDL Code zu schreiben wär
mit diesen Daten dann eher weniger ein Problem.
DrowninginNoise schrieb:> Wie geht ein Profi hier ... vor?
Auch wenn es weder mir noch dir schmecken mag: Die Leute, die mit sowas
umgehen und ihre Brötchen damit verdienen, die schweigen sich aus und
publizieren nichts.
Es könnte ja Konkurrenz aufkommen.
Und das, was man im Inet so findet, sind akademische Publikationen, die
deshalb geschrieben und im Inet veröffentlicht werden, damit man kein
Geld an die einschlägigen Zeitschriften zahlen muß und seinen
Veröffentlichungspflichten nachkommen kann. Inhalt eigentlich immer
unbrauchbar.
Tja, so ist das Leben in der Informationsgesellschaft.
W.S.
W.S. schrieb:> Die Leute, die mit sowas> umgehen und ihre Brötchen damit verdienen, die schweigen sich aus und> publizieren nichts.>> Es könnte ja Konkurrenz aufkommen.
Bullshit.
Die Leute, die damit ihre Brötchen verdienen haben schlicht keine Zeit,
etwas zu publizieren...
W.S. schrieb:> Inhalt eigentlich immer unbrauchbar.
Ja, leider. An der Stelle in der Laufbahn fehlt den Akademikern oft noch
die Erfahrung.