2016-07-11 3 views
1

Ich verwende einen Relatek Audio-Codec ALC5621 für einige benutzerdefinierte Audio-Processing-Anwendung. Ich benutze i2c Bit Banging, um die Kommunikation zwischen dem Codec und einem soc (cc1110) zu steuern. Beim Herausfinden des Entzerrerteils stieß ich auf ein Problem, , das wie folgt angegeben wird ---> Ein 16-Bit-Register, das einen Binäreingang akzeptiert, dessen Format ---> "2er-Komplement im Format 3.13 ist (Der Bereich ist von - 4 ~ 3.99) "Registergröße 16 Bit (15,0), wie kann ich in dieses Register Daten eingeben, zB: -4, -1 usw.?2`s Komplement in 3.13 Format (Der Bereich ist von -4 ~ 3.99) was bedeutet das?

+0

Ich verstehe dein Problem nicht. Könnten Sie präziser sein, vielleicht mit einem verständlicheren Beispiel? – ckruczek

+0

Ich muss die Werte wie -4, + 3.99, -2, + 1.99 auf ein 16-Bit-Register im Codec anwenden, das Werte im 2er-Komplement im Format 3.13 akzeptiert, wie soll ich das anwenden? –

Antwort

1

3.13-Format dargestellt in binärer Festkomma-Arithmetik Notation namens "Q" -Nummernformat.
Siehe auch: Fixed-point arithmetic
3.13 beschreibt eine Zahl mit 3 Integer-Bits und 13 Bruchbits, die als 16-Bit-Zweierkomplement-Integer gespeichert sind (Zitat Wikipedia).
Die Umwandlung eines in Q3.13 angegebenen Werts für den Festkommawert in einen "physischen" Gleitkommawert erfolgt durch Division des ganzzahligen Werts durch 2^13.
Die 16-Bit-Ganzzahl kann dargestellt werden als short C-Variable: short q;
Der "physikalische" (d.h. Spannung) Wert kann dargestellt werden als doppelt C Variable: double v;

short q; //Q3.13 integer format. 
double v; //"physical" value (assuming voltage). 

Konvertieren q v:

v = (double)q/(double)(1<<13); 

Konvertieren v q:

q = (short)floor(v*(double)(1<<13) + 0.5); //Add 0.5 for rounding - round(x) = floor(x+0.5) 

Beispiele:

q = -32768; //Minimum short range 
//v = -32768/8192 = -4.0 

q = 32767; //Maximum short range 
//v = 32767/8192 = 3.9998779 

v = -4.0; 
//q = floor(-4.0*8192.0 + 0.5) = -32768 

v = -1.0; 
//q = floor(-1.0*8192.0 + 0.5) = -8192 
+0

Das hat wirklich geholfen. Danke @ Rotem, Du bist wirklich großartig –