Forum: Digitale Signalverarbeitung / DSP / Machine Learning Pyfda und die Amplitude


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende gerne Pyfda https://github.com/chipmuenk/pyfda zum Entwurf 
von Filtern. Aber ich habe ein Problem das ich nicht verstehe:

Die Amplitude im Passband ist nicht gleich der Eingangsamplitude sondern 
oft deutlich niedriger, teilweise nur die Hälfte. Und das obwohl das 
Filter so entworfen wurde, dass das Signal dort nicht gedämpft wird.
Mir ist klar, dass es im Passband oft Ripple gibt, aber eine Dämpfung im 
gesamten Passband finde ich seltsam.

Aber vielleicht ist ja auch einer meiner Schritte falsch:
Ich entwerfe das Filter wie im ersten Bildchen Filter_1.
Dann stelle ich ein, dass die Koeffizienten Integers mit maximal 16 Bits 
sind. Also signed wie im Bildchen Filter_2.
Seltsam ist, dass trotz der 16 Bits der maximale Wert der Koeffizienten 
hier bei nur 8192 liegt. Das ist 2**13 und etwas wenig. Der maximale 
positive Wert bei 16 Bit signed ist ja 2**15-1.
Die Koeffizienten kopiere ich dann in das FIR Filter und bekomme eben 
als Ergebnis ein gefiltertes Signal mit deutlich reduzierter Amplitude 
im Passband.
Wenn ich aber alle Koeffizienten so skaliere, dass sie die vollen 16 
Bits ausnutzen ändert das nix an der Amplitude. Ist ja auch 
verständlich, denn es werden ja positive und negative Koeffizienten 
skaliert. Die gewichtete Summe bleibt also gleich.

Aber wo kommt das her und wie schaffe ich es die Amplitude zu erhöhen? 
Klar könnte ich das Ergebnis, also das gefilterte Signal multiplizieren, 
aber dazu sehe ich keinen Grund wenn das Filter das ebenfalls können 
müsste.

von Detlef _. (detlef_a)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Wenn ich aber alle Koeffizienten so skaliere, dass sie die vollen 16
> Bits ausnutzen ändert das nix an der Amplitude. Ist ja auch
> verständlich, denn es werden ja positive und negative Koeffizienten
> skaliert.

Nein. Wenn Du die Koeffizienten skalierst muss die Amplitude mitgehen. 
Du hast wahrscheinlich Overflows bei den Zwischenwerten.

Cheers
Detlef

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nun, ich verwende das Filter von Xilinx. Da erwarte ich schon, dass das 
richtig funktioniert. Seltsam ist auch, dass das unterschiedlich 
aussieht wenn ich das in Pyfda oder im Xilinx Tool angucke. Bei dem 
Xilinx Tool verstehe ich die Achsenbeschriftung nicht. Also wo die den 
Nullpunkt der y-Achse hingelegt haben.

Die Koeffizienten:

0,0,0,0,-2,-4,-5,0,15,32,34,0,-72,-143,-139,0,249,463,427,0,-713,-1306,- 
1211,0,2290,5054,7318,8192,7318,5054,2290,0,-1211,-1306,-713,0,427,463,2 
49,0,-139,-143,-72,0,34,32,15,0,-5,-4,-2,0,0,0,0

Es stimmt, doch, dass ich die Nullen am Anfang und am Ende weglassen 
kann oder?

Detlef _. schrieb:
> Nein. Wenn Du die Koeffizienten skalierst muss die Amplitude mitgehen.

Das stimmt natürlich. Ich hatte nur den Fall betrachtet wenn die Summe 
der Koeffizienten Null ist. Dann ändert sich DC nicht wenn man die 
Koeffizienten skaliert. Aber für höhere Frequenzen ändert sich dann 
schon die Amplitude, das hatte ich nicht bedacht.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

Gustl B. schrieb:
> Bei dem
> Xilinx Tool verstehe ich die Achsenbeschriftung nicht. Also wo die den
> Nullpunkt der y-Achse hingelegt haben.

Summier' alle Koeffizienten mal auf, das ist ja dann das, was aus dem 
Filter rauskommt, wenn man es mit einem Einheitssprung, also sowas wie 
Gleichspannung, anregt.
Das ist dann also die Zahl, die aus dem Filter mit jedem Takt rauskommt. 
Und wenn du diese Zahl logarithmierst und das dann x20 nimmst...

Die Unterschiede im Sperrverhalten in den Diagrammen sehen so aus, als 
ob Xilinx mit den auf Bitaufloesung gerundeten Koeffizienten arbeitet 
und Pyfda mit Floatingpoint.

Gruss
WK

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Dergute W. schrieb:
> Summier' alle Koeffizienten mal auf

32766

Das ist also fast 2**15.

Dergute W. schrieb:
> Und wenn du diese Zahl logarithmierst

4.515423

Dergute W. schrieb:
> und das dann x20 nimmst...

90.30846

Ja, fein. Das passt zu dem was mir das Xilinx Tool anzeigt. Aber wie 
ändere ich die Amplitude?

Ich habe auch schon alle Koeffizienten mit 1,5 multipliziert.

0, 0, 0, 0, -3, -6, -7, 0, 22, 48, 51, 0, -108, -214, -208, 0, 373, 694, 
640, 0, -1069, -1959, -1816, 0, 3435, 7581, 10977, 12288, 10977, 7581, 
3435, 0, -1816, -1959, -1069, 0, 640, 694, 373, 0, -208, -214, -108, 0, 
51, 48, 22, 0, -7, -6, -3, 0, 0, 0, 0

Dann sagt mir das Xilinx Tool und die selbe Rechnung wie oben 93.83. 
Aber die Amplitude in der Simulation ändert sich genau nicht.

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

Gustl B. schrieb:
> Dann sagt mir das Xilinx Tool und die selbe Rechnung wie oben 93.83.
> Aber die Amplitude in der Simulation ändert sich genau nicht.

Die 93.83 passen ja zum Faktor 1.5.
Warum das bei der Simulation nix aendert? keinen Blassen...

Gruss
WK

von Detlef _. (detlef_a)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Nun, ich verwende das Filter von Xilinx. Da erwarte ich schon, dass das
> richtig funktioniert.

Sicher funktioniert das. Aber Du hast bei der Bedienung irgendeinen 
Fehler gemacht oder was mißverstanden. Jetzt gibs zwei Möglichkeiten: 
entweder fummelst Du Dich in die Xilinx tools rein und findest den 
Fehler oder Du bastelst selber nen FIR in Verilog oder VHDL zusammen. 
Mach Letzteres, weil dann hast Du nicht lediglich die tools verstanden 
sondern kannst FIR, egal in welcher Implementationssprache. So hab ich 
das gemacht, und FIR kann ich :)))

Cheers
Detlef

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Detlef _. schrieb:
> oder Du bastelst selber nen FIR in Verilog oder VHDL zusammen.

Das hatte ich schon gemacht. Und zwar in mehreren Formen je nachdem was 
man will, wenig DSPs oder höhere Samplerate. Siehe 
Beitrag "FIR parallel und seriell braucht zu viele LUTs."

Aber der Xilinx FIR Compiler IP der optimiert halt doch besser. Den 
würde ich gerne verwenden. Klar, kann ich machen und am Ende das 
Ergebnis passend skalieren, aber das sollte doch auch ohne so eine 
Skalierung funktionieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.