Multiplikation in Filtern

Gast #3193978
Lesenswert?

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
Gast #3193985
Lesenswert?

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.
Gast #3194307
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #3194351
Lesenswert?

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"...
(Firma: abaxor engineering) #3194426
Lesenswert?

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
(Firma: abaxor engineering) #3195625
Lesenswert?

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
Gast #3271904
Lesenswert?

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. (?????)
Gast #3272531
Lesenswert?

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.
Persönliche Seite #3303902
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren