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
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 :)
@ 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
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
> 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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.