Hi,
ich habe eine Frage zur Multiplikation in Filtern. Vielleicht ist das
auch ne allgemeine Filterfrage :) ... die Frage ist einfach so
aufgekommen, ohne Anwendung
Und zwar wie wird mit den Bits umgegangen die bei der Multiplikation
zuviel sind? Also bei einem 16Bit Filter die Bits 32 bis 17.
wird bei so einem Overflow einfach der maximal mögliche Wert angenommen?
(So ähnlich könnte das ja auch bei einer Addition auftreten.)
Schönen Abend,
Bene
Du machst Dir Gedanken um die Genauigkeit, rundest und verwirfst die
nicht benötigten Bits. Mit Filterdesignprogrammen kann man sich die
Wirkung des Filterrundungen auch ansehen. Je gröber, desto mehr
digitales Rauschen kommt in den Signalpfad. Daher sollte man stets in
Real rechnen, wo möglich.
Das kommt auf die Genauigkeit an, die extra Bits also die low-Bits
können zusätzliche genauigkeit bieten. Nur in Real zu rechnen, wie
Thomas, passt auch nicht, besonders in einem FPGA, da ist es meistens
schon besser die Genauigkeit zu bestimmen und dann die Rundung usw
entsprechend auszulegen
Thomas Werner schrieb:> Daher sollte man stets in Real rechnen, wo möglich.
Gerade die bekannten Real(aka 32-Bit-Float) Zahlen haben nur 6-7
signifikante Stellen. Eine Addition von z.B. 1000000 + 1 kann dann
durchaus wieder 1000000 geben. Mit einem 32-Bit Integerwert wäre das
nicht passiert.
Allerdings muss man sich dann selber Gedanken um die Skalierung machen
und das Filter möglichst hoch "aussteuern"...
Hallo,
die Koeffizienten für ein FIR-Filter liegen immer im Bereich -1..1. D.h.
das Ergebnis einer Multiplikation kann vom Betrag her nie größer werden.
Darum kann man auch in deinem Fall zwei Operanden mit 16 Bit die unteren
16 Bit weglassen.
Beispiel, mit Matlab rechnest du dir die Koeffizienten aus z.B. 0,25;
0,5; 0,25. Jeden davon multiplizierst du mit 2^16, damit du Ganzzahlen
hast (16384; 32768; 16384). Nach der Multiplikation und Summation ist
dein Ergebnis um 2^16 zu groß. Darum kannst/musst du die unteren 16 Bit
einfach wegwerfen, Division durch 2^16.
Das war der klassische Weg mit Ganzzahlen. VHDL-2008 kennt
Festkommaahlen (sfixed und ufixed). Wenn du dann die Koeffizienten im
Bereich 1..-1 lässt, erhältst du einfach mehr Nachkommastellen. Die
werden dann einfach weggelassen.
Tom
Thomas Reinemann schrieb:> die Koeffizienten für ein FIR-Filter liegen immer im Bereich -1..1. D.h.> das Ergebnis einer Multiplikation kann vom Betrag her nie größer werden.
Warum ist das so? Soll das so sein?
Mirco schrieb:> Thomas Reinemann schrieb:>> die Koeffizienten für ein FIR-Filter liegen immer im Bereich -1..1. D.h.>> das Ergebnis einer Multiplikation kann vom Betrag her nie größer werden.>> Warum ist das so? Soll das so sein?
Ja, weil sonst das Ergebnis vom Betrag her größer wird als das
Eingangssignal.
Wie immer gibt es Ausnahmen. Bei einem Downsampling von 4 gewinnt man
ein Bit (*2) an Auflösung hinzu. Das kann man in die Koeffizienten mit
rein rechnen.
Tom
Thomas Reinemann schrieb:> Ja, weil sonst das Ergebnis vom Betrag her größer wird als das> Eingangssignal.
Der entstehende Betrag hängt aber auch von der Zahl ab. Das hat mit den
Koeffizienten allein direkt nichts zu tun.
Lothar Miller schrieb:> Thomas Werner schrieb:>> Daher sollte man stets in Real rechnen, wo möglich.> Gerade die bekannten Real(aka 32-Bit-Float) Zahlen haben nur 6-7> signifikante Stellen. Eine Addition von z.B. 1000000 + 1 kann dann> durchaus wieder 1000000 geben. Mit einem 32-Bit Integerwert wäre das> nicht passiert.
Wie, was? Ich rechne seit Menschengedenken im 32 Bit-Core und kann ser
gut 100000 und 1000001 unterscheiden. (?????)
Thomas Werner schrieb:> Wie, was? Ich rechne seit Menschengedenken im 32 Bit-Core und kann ser> gut 100000 und 1000001 unterscheiden. (?????)
Wenn du die Zahl in Float umwandelst, kommst du irgendwann an die
Auflösungsgrenze deine Mantisse. Lies noch mal das, was du selbst
zitiert hast.
Solange man weiss, was man tut, ist die Addition zu kleiner Zahlen bei
begrenzter Mantisse kein Problem, weil die Auflösung an sich ja aufrecht
erhalten wird. Munteres Addieren kleiner Zahlen beim Integral muss
natürlich entsprechend gehandhabt werden, aber das ist genau die Aufgabe
des Programmierers.
Schließlich und endlich rechnet man man bei solchen Systemen auch in
double precision.
Brater schrieb:> Thomas Werner schrieb:>> Wie, was? Ich rechne seit Menschengedenken im 32 Bit-Core und kann ser>> gut 100000 und 1000001 unterscheiden. (?????)>> Wenn du die Zahl in Float umwandelst, kommst du irgendwann an die> Auflösungsgrenze deine Mantisse. Lies noch mal das, was du selbst> zitiert hast.
Darauf muss man eben achten, stimmt.
Thomas Reinemann schrieb:> die Koeffizienten für ein FIR-Filter liegen immer im Bereich -1..1. D.h.> das Ergebnis einer Multiplikation kann vom Betrag her nie größer werden.
Ich normiere immer entweder auf 2 hoch (n-1), das spart ein Bit und
damit nicht wenig Platz, bei der anschließenden Summation, ist aber von
der Wertigkeit praktisch dasselbe, oder auf die Energie des Filters, um
die Aussteuerung zu Maximieren.