Hi
ich erstelle mir gerade einen FIR Filter für mein FPGA Projekt.
Dazu designe ich diesen mit MATLAB und dem Filter Design & Analysis
Tool. Der Frequenzgang mit den groben Einstellungen ist im ersten Bild
auch mal gezeigt. Zum Export erzeuge ich eine .coe Datei für den Xilinx
FIR Compiler 5.0. Dazu habe ich fixed point, signed und 16 bit
ausgewählt. Die Koeffizienten sehen dann alle in etwa so aus:
-0.0027618408203125
0.0009613037109375
Wenn ich im FIR Compiler von Xilinx nun die .coe Datei lade, sieht mein
Frequenzgang plötzlich wie im zweiten Bild aus. Das ganz ist um 96dB
angehoben. Laut diesem Frequenzgang hätte ich da ja eine enorme
Verstärkung im Durchlassbereich und selbst teilweise im Sperrbereich.
Ich habe das Ding auch mal generiert und simuliert. Da ich nur
Zufallswerte aus einem CIC Filter (bei dem ist der Frequenzgang im
IPCore generator richtig gewesen) füttere, erwarte ich keine speziellen
Ergebnisse, aber da die Ergebnisse immer entweder am Maximum oder
Minimum liegen, gehe ich jetzt mal davon aus, dass ich wirklich 96dB
Verstärkung im Durchlassbereich habe.
Meine Einstellung für die Koeffizienten in Xilinx sind Width 16,
smmetrisch und signed. Integer value ist fest eingestellt und kann nicht
geändert werden.
Hat jemand ne Ahnung wo das Problem liegt und obd as überhaupt ein
problem ist? generiert MATLAB die Koeffizienten irgendwie skaliert?
Interpretiert der FIR Compiler die Koeffizienten falsch? Oder ist das
nur ne Darstellungssache und hat praktisch nix zu sagen?
Da sist normal, du musst dann halt dein Ergebnis um 16 Bits verschieben
oder entsprechend runden. Denn 2^16 sind ja 65536 und das sind in dB
etwa 96. Die unteren 16 Bit des Ausgangs sind also dann für deine
Anwendung dann nicht besonders relevant. Auf irgendwas muss der das ja
skalieren, denn sonst leidet ja die Genauigkeit der Koeffizienten ganz
ungemein. Und wenn du 16 Bit Eingang hast und 16 Bit Koeffizienten dann
ist das Ergebnis halt riesengroß, dazu kommt ja dann noch die Anzahl der
Taps. Du musst also den Ausgang unten Abschneiden und oben noch
begrenzen, denn das kann auch mal schnell über 1 rausgehen und dann
kriegst du seltsame Artefakte rein.
Das ist soweit ichd as verstanden habe nur die Methode zur Erzeugung der
Filter Übertragungsfunktion.
Das funktioniert entweder mit dem besagten Equiripple oder der
Fenstermethode. Zumindest sind das wohl die üblichen.
Christian R. schrieb:> Da sist normal, du musst dann halt dein Ergebnis um 16 Bits> verschieben> oder entsprechend runden. Denn 2^16 sind ja 65536 und das sind in dB> etwa 96. Die unteren 16 Bit des Ausgangs sind also dann für deine> Anwendung dann nicht besonders relevant. Auf irgendwas muss der das ja> skalieren, denn sonst leidet ja die Genauigkeit der Koeffizienten ganz> ungemein. Und wenn du 16 Bit Eingang hast und 16 Bit Koeffizienten dann> ist das Ergebnis halt riesengroß, dazu kommt ja dann noch die Anzahl der> Taps. Du musst also den Ausgang unten Abschneiden und oben noch> begrenzen, denn das kann auch mal schnell über 1 rausgehen und dann> kriegst du seltsame Artefakte rein.
Das hört sich ja schonmal sinnvoll an.
Im Anhang ist mal das Bild für meinen Ausgang.
Ich gebe 16 bit rein und da ich auch 16 bit am Ausgang haben will,
schneide ich ja die LSBs ab. So hätte ich das auch bei dir verstanden.
Oder muss ichd as hier anders einstellen. So ganz verstanden habe iche s
scheinbar nocht nicht...
Naja, wenn du das so machst, kannst du aber einen Überlauf nicht
erkennen, denn der Ausgang hat dann nur 16 Bit. Es kann aber je nach
Filter und Anregung schnell mal einen (wenn auch minimalen) Überlauf
geben. Deswegen lass ich mir alle Bits ausgeben und mach das dann
selber.
Christian R. schrieb:> Naja, wenn du das so machst, kannst du aber einen Überlauf nicht> erkennen, denn der Ausgang hat dann nur 16 Bit. Es kann aber je nach> Filter und Anregung schnell mal einen (wenn auch minimalen) Überlauf> geben. Deswegen lass ich mir alle Bits ausgeben und mach das dann> selber.
Aber woher weiß ich, welche Bits ich brauche, wenn ich mir die 33 Bit
(Maximum) ausgeben lasse? Ich müsste das Ergebnis ja theoretisch 16 mal
durch 2 teilen, also 16 mal nach rechts shiften und damit würden 16 LSBs
wegfallen. Übrig bleiben dann 17 bit, wobei dann nach meinem Verständnis
das MSB den Überlauf anzeigen würde. Da mein 16 Bit Ergebnis aber
aktuell bereits teilweise 16 Einser anzeigt, wäre ich ja wirklich
komplett am Limit inkl. Überlauf. Ist das so richtig? Wenn es das
Überlauf-Bit wäre hätte ich ja dann aber effektiv auch nur 15 Bit Info,
obwohl im dem Compiler ja sage ich möchte 16 Bit.
Vielleicht kannst du noch etwas ins Detail gehen, bitte?
Zu den 33 Bit kommen aber noch die Bits die durch die Summierung
entstehen, bei 64 Taps dann noch mal 6 Bit beispielsweise. Die sind auch
noch oben dran. Wie gesagt ich lasse mir das nicht runden, das ist immer
irgendwieseltsam, lieber selber raus fummeln, aber nicht nur das 17.Bit
beachten, denn es kann ja auch mal mehr als das doppelte heraus kommen.
Am besten mit ModelSim in der Analogen Darstellung anschauen.
Aber ich kann mir mit dem FIR Compiler maximal 33 Bit ausgeben lassen.
Das ist dann full precision.
Ich simuliere mit ISim und Truncate LSB ist das gleiche wie wenn ich die
oberen 16 Bit nehme. Also vom MSB abwärts. Macht ja auch sinn. Das
sollte ja dann mein Ergebnis sein.
Aber ich kann mir immernoch nicht erklären, woran ich hier einen
Überlauf erkenne? Mein Filter gibt mir am Ausgang ein Signal mit 33Bit
aus. Was kann ich aus diesem Signal ablesen und wie geht das? Gehen die
nutzbaren Daten schon beim MSB los? Wo erkenne ich einen Überlauf?
Ok, das tritt bei mir nicht auf.
Bedeutet das, dass wenn ich die Option "Truncate LSB" wähle und dann als
Ausgabe 16Bit wähle, ich auch wirklich das richtige Ergebnis erhalte und
da keine 96dB Versätrkung im Passband auftreten?
Im Endeffekt steuere ich ja durch das Abschneiden nur die Genauigkeit
meines Ergebnisses.
Ich kann erst morgen wieder an den FIR Compiler, aber wenn ich mich
recht erinnere, dann hatte es keinen Einfluss auf die
Übertragungsfunktion des Filters, wenn ich die Genauigkeit der
Koeffizienten erhöht habe...
Probier es einfach aus, bzw. simulier es. Wie schließt du aus, dass es
keinen Übrlauf gibt? Was sagt Matlab nach der Quantisierung der
Koeefizienten an, welcher Pegel maximal auftritt?
Also ich habe jetzt heute mal die Koeffizienten per Hand eingegeben.
Also nicht die 16bit hex Werte, sondern die 0,000xxx usw Koeffizienten
als Vekotr.
Dabei wird die Übertragungsfunktion korrekt angezeigt, also Passband ist
auch bei einer Verstärkung von 0dB. Das Ergebnis des Filters bleibt das
gleiche. Das ist also nur eine unterschiedliche Interpretation der
Koeffizienten, keine effektive Verstärkung.
Die erhöhte Genauigkeit hat übrigens doch wie du gesagt hast Einfluss
auf die angezeigte Verstärkung der Übertragungsfunktion.
Matlab zeigt mir die quantisierte Variante zusätzlich zur Referenz
Variante an und auch hier ist der Pegel maximal 0dB, bzw. ein Ripple von
0.1 dB.
Ich weis nicht genau, wie ich einen Überlauf ausschließen kann. Wie
machst du es denn? Jonas hat dazu ja was geschrieben. Ist es so einfach?
Kann ich jetzt einfach so viele Bit abschneiden, so genau ich es brauche
oder muss ich bei der Ausgabe noch etwas beachten?
Ich gebe unsigned Daten rein, die bekomme ich ja auch so raus, richtig?
Kein Zweierkomplement. Kann ich nirgends definieren, aber dann wären
einige Ergebnisse bei mir negativ...
Da ich immer signed hatte, nehme ich den gesamten oberen Rest und kappe
auf 32767 wenn es drüber liegt und kappe unten auf -32768 wenn es
kleiner ist. Somit kann ich auch große Überläufe abfangen, kommen schon
mal vor.
>Da ich immer signed hatte, nehme ich den gesamten oberen Rest und kappe>auf 32767 wenn es drüber liegt und kappe unten auf -32768 wenn es>kleiner ist. Somit kann ich auch große Überläufe abfangen, kommen schon>mal vor.
Saturation also:
http://en.wikipedia.org/wiki/Saturation_arithmetic
Kannst du deine vektoren nicht einfach breiter machen?
Hi,
folgendes Feedback:
In der Dokumentation zum Compiler steht drin, dass ein Overflow
ausgeschlossen werden kann. Deswegen habe ich mich da jetzt nicht weiter
verrückt gemacht.
Der Filter funktioniert soweit wie gewollt. Das bedeutet die angezeigte
Verstärkung ist tatsächlich nicht vorhanden und ich kann die LSBs auch
dort abschneiden, wo ich es gerne möchte. Ich normiere den Ausgang
natürlich am Ende in Matlab noch auf 1.
Danke für eure Hilfestellungen und beste Grüße,
Chris