Forum: Digitale Signalverarbeitung / DSP / Machine Learning Welches Filter für minimalen Phasenverlust


von DrowninginNoise (Gast)


Lesenswert?

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?

von Spartan-XL (Gast)


Lesenswert?

Das Stichwort heisst "Minimalphasenfilter".

Aber es wird nicht viel nuetzen.

von W.S. (Gast)


Lesenswert?

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.

von Detlef _. (detlef_a)


Lesenswert?

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.

: Bearbeitet durch User
von DrowninginNoise (Gast)


Lesenswert?

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.

Beitrag #6530498 wurde von einem Moderator gelöscht.
von W.S. (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

Bernd schrieb:
> Bullshit.

Redest du im täglichen Leben genauso?

W.S.

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.