Forum: FPGA, VHDL & Co. Multiplikation in Filtern


von Bene (Gast)


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

von Tom W. (Gast)


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.

von user (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Thomas R. (Firma: abaxor engineering) (abaxor)


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

von Mirco (Gast)


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.

Warum ist das so? Soll das so sein?

von Bene (Gast)


Lesenswert?

Danke für die Erläuterungen!

von Thomas R. (Firma: abaxor engineering) (abaxor)


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

von high tec ingenieur (Gast)


Lesenswert?

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.

von Tom W. (Gast)


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. (?????)

von Brater (Gast)


Lesenswert?

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.

von T.R. (Gast)


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.

von Tom W. (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


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.

von high tec ing (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.