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?
FIRTYPE = Eqiripple? Was heisst das? Kann es sein, dass er dort irgendwo die Begründung hernimmt, zu skalieren?
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?
>Wo erkenne ich einen Überlauf?
Bei 16 Bit bei 65537.
Gruß Jonas
:
Bearbeitet durch User
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
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.