13

Ich habe einen C-Code, der Doppel verwendet. Ich möchte den Code auf einem DSP (TMS320) ausführen können. Der DSP unterstützt jedoch keine Doppelpunkte, sondern nur Festkommazahlen. Was ist der beste Weg, um den Code in einen Fixpunkt zu konvertieren? Gibt es eine gute C-Bibliothek für Festkommazahlen (implementiert als Ganzzahlen)?Wie konvertiere ich einen Fließkomma-C-Code in einen Fixpunkt?

+3

Dies ist ein ziemlich großes Thema. Es gibt eine große Diskussion in dieser Frage SO: http://stackoverflow.com/questions/79677/whats-the-best-way-to-dofixed-point-math. Fast alle Antworten hatten einige nützliche Nuggets. – mtrw

+1

Aus Neugier, wie stellt der Compiler des DSP Fixpunkte dar? Wie zwei ganze Zahlen? Wie würden Sie beispielsweise zwei Festkommazahlen zusammenfügen? – chrisaycock

+0

Sie werden als 32-Bit-Werte ('long') dargestellt, wobei eine Verschiebung implizit im Typ enthalten ist. Wenn Sie beispielsweise nach dem Punkt 16 Bits haben ('_iq16'), repräsentieren Sie die Festkommazahl 1.0 durch die Ganzzahl 65536 im zugrunde liegenden Typ. Zum Hinzufügen und Subtrahieren von Festpunktzahlen desselben Typs können Sie die normalen Integer-Operationen verwenden. Multiplikation benötigt eine zusätzliche Verschiebung, um die Skalierung zu korrigieren. – starblue

Antwort

8

TI bietet eine Festpunkt Bibliothek mit dem Namen „IQmath“:

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

Konvertieren beinhaltet Ihren aktuellen Code zu analysieren - für jede Variable müssen Sie wissen, was reichen kann es halten, und welche Präzision es braucht . Dann können Sie entscheiden, in welchem ​​Typ sie gespeichert werden soll. IQMath bietet Typen von q30 mit einem Bereich von +/- 2 und einer Genauigkeit von 0,0000000001 bis q1 mit einem Bereich von +/- 1 Million und einer Genauigkeit von 0,5.

Für Operationen, die möglicherweise den Bereich der Variablen überlaufen können, müssen Sie prüfen, ob Überlauf an, und entscheiden, wie es zu handhaben - stecken Sie sie bei max, weiter mit einem anderen Maßstab, einen Fehler erhöhen, usw.

Es gibt wirklich keine Möglichkeit, zum Fixpunkt zu konvertieren, ohne wirklich einen tiefen Einblick in den Datenfluss Ihres Prozesses zu bekommen.

5

Die meisten DSP-Toolchains enthalten Bibliotheken für die Gleitkommaemulation in Software. Dies wird langsam, aber Sie sollten zunächst Ihren Code mit Fließkommaunterstützung erstellen, dann Profil, um zu sehen, ob es nur einige Stellen gibt, die Sie in Festkomma konvertieren müssen, um ausreichende Leistung zu erhalten. Sie müssen auch die Fließkomma-Daten ausführen, um einen Vergleich zu liefern, während Sie an den Festkomma-Port portieren, um sicherzustellen, dass Sie währenddessen nichts verloren haben.

0

Es gibt einige Bibliotheken, die das für Sie tun können. Wahrscheinlicher ist jedoch, dass die PSP für Ihr Gerät eine Art Mathebibliothek enthalten sollte. Es sollte dokumentiert werden. Sie werden wahrscheinlich etwas Code neu schreiben müssen, weil die Steuerkonstrukte, die Sie verwenden, wenn Sie primitive Gleitkommaarithmetik ausführen, keinen Sinn ergeben, wenn Sie die API verwenden, die von Ihrem PSP bereitgestellt wird.

Zum Beispiel - Sie könnten wandeln diese

double arraysum = 0.0; 
for (int i = 0; i < arraylen; i++) 
{ 
    arraysum += array[i]; 
} 

dieser

psp_decimal_t arraysum; 
if (0 != psp_sum_elements(&array, arraylen, &arraysum)) 
{ 
    printf("error!"); 
} 
+0

Der Link ist tot, bitte korrigieren. – Danijel

+0

Leider konnte ich diesen Inhalt nirgendwo anders finden, noch die Person, die ihn gepostet hat. –

2

Wenn der C-Code verdoppelt sehr selten/spärlich verwendet, dann könnten Sie eine Floating-Point-Emulationsbibliothek verwenden können ohne dass der C-Code 10x bis 100x langsamer läuft. Wenn Sie nicht möchten, dass diese Leistung erreicht wird und es viele Gleitkommaoperationen gibt und Sie wissen, welche Skalierung und Genauigkeit bei jeder arithmetischen Operation für jede realistische Eingabe erforderlich ist, können Sie jede arithmetische Operation manuell in konvertieren verwendete skalierte ganzzahlige Datentypen und Operationen. Die Analyse von Genauigkeitsanforderungen ist jedoch im Allgemeinen für DSP-Code nicht trivial. Es gibt viele Lehrbuchkapitel zum Thema DSP und Numerische Methoden.

+0

... überlege den letzten Satz, damit dies als hilfreich gilt. – jpinto3912

12

Der folgende Code definiert einen Typ "Fixed", der Ganzzahlen als interne Repräsentation verwendet. Additionen und Subtraktionen werden einfach mit den Operatoren + und - durchgeführt. Die Multiplikation erfolgt mit dem definierten Makro MULT.

#include <stdio.h> 
typedef int Fixed; 

#define FRACT_BITS 16 
#define FRACT_BITS_D2 8 
#define FIXED_ONE (1 << FRACT_BITS) 
#define INT2FIXED(x) ((x) << FRACT_BITS) 
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS) 
#define FIXED2DOUBLE(x) (((double)(x))/(1 << FRACT_BITS)) 
#define MULT(x, y) (((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2)) 

Ich habe den obigen Code verwendet, um Brüche in meinem Bildverarbeitungsalgorithmus darzustellen. Es war schneller als die Version, die doppelte verwendet und die Ergebnisse waren fast genau gleich.

+0

Überprüfen Sie auch diese Bibliothek: [http://www.sf.net/projects/fixedptc](http://www.sf.net/projects/fixedptc) –