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.
Ich habe immer FIR-tools von Medatronic verwendet, wird aber offenbar nicht mehr weiterentwickelt, bzw angeboten.
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.