Forum: FPGA, VHDL & Co. Xilinx FIR Compiler Frequenzgang


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

FIRTYPE = Eqiripple? Was heisst das? Kann es sein, dass er dort irgendwo 
die Begründung hernimmt, zu skalieren?

von Christian R. (supachris)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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.

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Christian R. (supachris)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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?

von Jonas B. (jibi)


Lesenswert?

>Wo erkenne ich einen Überlauf?

Bei 16 Bit bei 65537.

Gruß Jonas

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

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...

von Christian R. (supachris)


Lesenswert?

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?

von Chris (Gast)


Lesenswert?

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...

von Christian R. (supachris)


Lesenswert?

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.

von Jonas B. (jibi)


Lesenswert?

>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?

von Chris (Gast)


Lesenswert?

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

von Jonas B. (jibi)


Lesenswert?

Na das ist doch bestens!

Schönen Tag noch!

Gruß Jonas

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.