Forum: Digitale Signalverarbeitung / DSP / Machine Learning Fractional Format


von Pablo (Gast)


Lesenswert?

Morgen,

hat jemand von euch schon Zahlen konvertiert und zwar von float format
zu Fractional Format ? Spache C, VDSP++
Ich habe nähmlich Float Zahlen, die ich mal im Blackfin rechnen will,
dazu gehörte klar FIR-Filter und EingangsSignale . . .

Danke im Voraus

von Alex (Gast)


Lesenswert?

Du musst einfach alle Koeffizienten auf einen Wert zwischen +0.999999
und -1 skalieren. Genau dasselbe gilt für deine Eingangswerte.

Wenn du z.B. die Zahl 0.75 hast, so musst du diese mit 2^15
multiplizieren (1.15 Format). Dabei erhältst du 24576. In
Hex-Darstellung entspricht das 0x6000. Bei negativem Vorzeichen machst
du erst eine Betragsbildung, dann die Multiplikation und dann musst du
noch das MSB setzen. -0.75 wäre also gleich 0xE000.

Die Rechengenauigkeit ist im 1.15-Format jedoch eher mies - besser ist,
wenn man sich z.B. ein 16.16-Format selbst definiert und mit 32 Bit
Genauigkeit rechnet. Dazu muss man aber ein wenig Übung im Rechnen mit
binären Zahlen haben :)

von Michi (Gast)


Lesenswert?

@
Die Rechengenauigkeit ist im 1.15-Format jedoch eher mies - besser
ist,
wenn man sich z.B. ein 16.16-Format selbst definiert und mit 32 Bit
Genauigkeit rechnet. Dazu muss man aber ein wenig Übung im Rechnen mit
binären Zahlen haben :)


genau das verstehe ich nicht. Wie berechne ich eine Multiplikation mit
16.16 Format? (Dabei muss ich doch die shift Operation benutzen?)

Bei einem DSP von Analog wird zwischen signed und unsigned bei der
Multiplikation entschieden. Man muss diese sogar expliziet angeben.
(my1*mx1 (ss)) warum?

Danke
Michi

von Alex (Gast)


Lesenswert?

16.16-Format

Jede Variable besteht also aus 2 Worten, wobei das H-Wort alles
ganzzahlige erfasst und das L-Wort alle Kommastellen.

HW1.LW1 * HW2.LW2 = LW1 * LW1 + HW1 * LW2 + HW2 * LW1 + HW1 * HW2

Hierbei musst du beachten, dass die Wertigkeiten in den Produkten
verschieden sind. Also:

0.16 * 0.16 => 0.32 (davon kannst du also die niedrigsten 16 Bit direkt
verwerfen)

0.16 * 16.0 => 16.16 (das erfässt du alles direkt)

16.0 * 16.0 => 32.0 (hier musst du die oberen 16 Bit verwerfen ->
Zahlenüberlauf in deinem Format)

Du musst nur die Ergebnisse entsprechend ihrer Wertigkeiten summieren
und dann passt das Ergebnis. Für Sättigung bzw. Überlauf musst du
selbst sorgen.

Zum Thema SS, US, SU bzw. UU empfehle ich dir ein genaueres Studium der
Datenblätter/AN von AD. Wenn du dein Zahlenformat signed machen willst,
dann musst du die H-Teile mittels SS, die "Querprodukte" mit US bzw.
SU und die L-Teile mit UU multiplizieren.

So, und jetzt lass mal ein wenig Eigeninitiative und Kreativität
erkennen :)


Alex

von arc (Gast)


Lesenswert?

> Man muss diese sogar expliziet angeben. (my1*mx1 (ss)) warum?
Beispiel: -1  3 in Komplementdarstellung 0xffff  0x0003
signed 0xfffd (-3), unsigned 0x2fffd (196605 = 65535 * 3)

Bei einer 16.16 * 16.16 Multiplikation wird genauso gerechnet wie bei
zwei 32Bit Zahlen nur ist das Ergebnis dann u.U. zu skalieren
(16.16 * 16.16 ergibt 32.32)
Bsp:  4660.5    *  4660.5 = 21720260.25
     0x12348000 * 0x12348000 (0x1234.0x8000)
   = 0x14b6cc440000000 (0x14b6cc4.0x40000000)
   = 21720260.25
Anderes Beispiel 1.15 * 16.16 = (17.31)
1.5 (0xc000) * 1.5 (0x00018000) = 0x120000000 (0b10010...)
Einleuchtender wird's wenn man sich dann 0x120000000 << 1 ansieht...

von Michi (Gast)


Lesenswert?

Hallo,

Vielen Dank für die bisherigen erklärungen.

Ich habe aber noch eine Frage:

Wie Multipliziere ich die Formate:  1.15 * 16.0

also zB. 0,5 * (-13) = 0x4000 * 0xFFFA = 0x3FFCC000  ????



Danke,
Michi

von arc (Gast)


Lesenswert?

Genau wie oben, nur das das Vorzeichen beachtet werden muss.
Wenn man mit vorzeichenbehafteten 32-Bit-Integern rechnet 0xfffffff3
statt 0xfff3. Ergebnis 0xfffcc000 * -1 (0xffffffff) = 0x34000

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.