mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Zahlenformate


Autor: dspler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

irgendwie stehe ich gerade voll auf dem Schlauch :(
Für die Uni sollen wir mit Hilfe eines Simulators [für den 2101]
verschiedene Dinge lösen/ausprobieren.
So sollen wir für den Zahlenbereich -1 bis 1 mit einer
Schrittweite von 0.1 die vom Simulator verwendeten
nächstgelegenen Fractional-Zahlen (Fixed) sowie ihre
Interpretation als vorzeicenbehaftete ganze Zahlen (Integer)
und als Hexadezimalzahlen angeben.

Habe ich das so richtig verstanden, dass beispielsweise
Dezimal 000001 (also 1) als Fractional-Zahl 0.000031 und
Hex $0001 ist? Und z.B. 0.9 als Fractional 0.000275 ist?

Danke für Hilfe!

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das noch richtig im Kopf hab:
usw.

Dementsprechend 0.11 = 0,5+0,25 = 0,75 etc.

Autor: dspler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE!

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist welches Zahlenformat der Simulator verwendet. Meistens ist 
das das Q1.15-Format (Q steht für die Fixkomma-Darstellung, Eins für den 
ganzen Teil, 15 für den Bruchteil der dargestellten Zahl), das 
folgendermaßen definiert ist:

x: x0 x1 x2 x3 ... x15 (BIN)

x = x0 * -2^0 + x1 * 2^-1 + x2 * 2^-2 + ... + x15 * 2^-15 (DEZ)

Z.B.:

1-2^-15 (DEZ) = 1111.1111.1111.1111 (BIN) = FFFF (HEX)
2^-15 (DEZ) = 1000.0000.0000.0001 (BIN) = 8001 (HEX)
-1 (DEZ) = 1000.0000.0000.0000 (BIN) = 8000 (HEX)
0 (DEZ) = 0000.0000.0000.0000 (BIN) = 0000 (HEX)

Diese Darstellung hat den Vorteil, dass das Ergebnis einer 
Multiplikation immer kleiner gleich +/- Eins ist, aber mit der Addition 
muss man höllisch aufpassen:

-1 + 2^-15 (DEZ) = 0x8000 + 0x0001 = 0x8001 = 2^-15 (DEZ)

Autor: dspler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

DANKE auch für Deine Antwort.
Ich habe noch eine Frage, hänge die einfach mal hier an weil es 
thematisch dazu passt. Da der Assembler keine Festkommazahlen umwandeln 
kann sollen wir die 1.15-Werte von Hand in das hexadezimale Format 
umsetzen.
"Berechnen Sie die hexadezimalen 24-bit-Werte"

h0 = 0,048401;
h1 = -0,135834;

Hm, wieso 24-bit-Werte? Ich dachte 16? Zumindest habe ich per Hand
h0 = 0x0640
h1 = 0xEE80
raus. Ist das also falsch?

Danke!!

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rechne es halt rückwärts: Die Hex-Zahlen in Binärzahlen umwandeln. Da wo 
Einsen stehen wird mit der Wertigkeit des entsprechenden Bits 
multipliziert und aufaddiert.
Das mit den 24 Bit versteh ich auch nicht, wenn von 1.15 Zahlen die Rede 
ist.

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Ich kenne leider deinen Simulator nicht. Kann es nicht sein, dass 
die Aufgaben zum Verständnis da sind, und mit dem Simulator nicht 
unbedingt zu tun haben?
Oder es kann noch sein, das es um den Akku geht, der in der Regel immer 
genauer ist, als der Rest des Prozessors (siehe Guard-bits).
Was deine Berechnung betrifft: wenn es sich um 24 Bits handelt, musst Du 
auch 24 Bits benutzen, will heißen: zwei Hexa-Stellen fehlen noch.

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Update: leider ist mein Beispiel vom 06.07.2009 fehlerhaft. Das Beispiel 
nochmal richtig:

1111.1111.1111.1111 (BIN) = FFFF (HEX) = -2^-15  (DEZ)
1000.0000.0000.0000 (BIN) = 8001 (HEX) = -1      (DEZ)
0111.1111.1111.1111 (BIN) = 8000 (HEX) = 1-2^-15 (DEZ)
0000.0000.0000.0000 (BIN) = 0000 (HEX) = 0       (DEZ)

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, es war immer noch nicht richtig, aber so müsste es korrekt sein:

1111.1111.1111.1111 (BIN) = FFFF (HEX) = -2^-15  (DEZ)
1000.0000.0000.0000 (BIN) = 8000 (HEX) = -1      (DEZ)
0111.1111.1111.1111 (BIN) = 7FFF (HEX) = 1-2^-15 (DEZ)
0000.0000.0000.0000 (BIN) = 0000 (HEX) = 0       (DEZ)

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unit* schrieb:
> Update: leider ist mein Beispiel vom 06.07.2009 fehlerhaft. Das Beispiel
> nochmal richtig:
>
> 1111.1111.1111.1111 (BIN) = FFFF (HEX) = -2^-15  (DEZ)
> 1000.0000.0000.0000 (BIN) = 8001 (HEX) = -1      (DEZ)

Bei mir ist 1000 0000 0000 0000 = 0x8000

> 0111.1111.1111.1111 (BIN) = 8000 (HEX) = 1-2^-15 (DEZ)

Und 0111 1111 1111 1111 ergibt bei mir 0x7FFF.

Ah, jetzt, ja :-)

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.048401 (DEZ) = 063201 (HEX)
-.135834 (DEZ) = EE9CFD (HEX)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.