www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Fractional Format


Autor: Pablo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.