Frage

ich einen C-Code haben, die Doppel verwendet. Ich möchte in der Lage, den Code auf einem DSP ( TMS320 ) zu laufen. Aber die DSP unterstützt nicht verdoppelt, nur Festkommazahl. Was ist der beste Weg, um den Code in festen Punkt zu konvertieren? Gibt es eine gute C-Bibliothek für Festkommazahl (implementiert als ganze Zahlen)?

War es hilfreich?

Lösung

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 die es braucht. Dann können Sie entscheiden, welche Art es zu speichern in. IQMath bieten Typen von Q30 mit einem Bereich von +/- 2 und eine Genauigkeit von 0,0000000001 zu q1 mit einem Bereich von ~ +/- 1 Million und eine Genauigkeit von 0,5.

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

Es gibt wirklich keine Möglichkeit zu festen Punkt zu konvertieren, ohne wirklich ein tiefes Verständnis für den Datenfluß des Prozesses zu gewinnen.

Andere Tipps

Der folgende Code definiert eine Art Fest, ganze Zahlen als seine interne Darstellung verwendet wird. Additionen und Subtraktionen werden einfach mit den + und - Betreibern durchgeführt. Eine Multiplikation wird ausgeführt, um den definierten MULT Makro.

#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 war mit dem obigen Code Fraktionen in meinem Bildverarbeitungsalgorithmus darzustellen. Es war schneller als die Version, die verdoppelt und die Ergebnisse wurde unter Verwendung waren fast genau das gleiche.

Die meisten DSP Werkzeugketten umfassen Bibliotheken für Floating-Point-Emulation in Software. Dies wird langsam, aber Sie sollten zunächst Ihren Code mit Floating-Point-Unterstützung bauen, dann um zu sehen, das Profil, wenn es nur wenige Orte, die Sie zu Festkomma konvertieren müssen eine ausreichende Leistung zu erhalten. Sie werden auch einen Vergleich, wie Sie Port Festpunkt zu schaffen laufen die Floating-Point-Sachen haben müssen, um sicherzustellen, haben Sie nicht in den Prozess verloren alles.

Wenn die C-Code-Anwendungen verdoppeln sehr selten / dünn, dann könnten Sie in der Lage sein, eine Floating-Point-Emulationsbibliothek zu verwenden, ohne Ihren C-Code verursacht langsamer 10X bis 100X laufen. Wenn Sie nicht, dass Leistungseinbußen wollen und es gibt Punktoperationen viel schwimmen, und Sie wissen, das Ausmaß und die Präzision bei jeder Rechen- und Speicheroperation erforderlich für jede realistische Eingabe, dann könnten Sie in der Lage zu konvertieren sein jede Rechenoperation, manuell zu skalierte Ganzzahl-Datentypen und Operationen verwendet. Aber Genauigkeitsanforderungen Analyse ist in der Regel nicht-trivial für DSP-Typ-Code. Es gibt viele DSP und numerische Methoden Kapitel zum Thema Lehrbuch.

Es gibt ein paar Bibliotheken gibt, die dies für Sie tun kann. Wahrscheinlicher ist aber, sollte die PSP für Ihr Gerät eine Art Mathematik-Bibliothek enthalten. Es soll dokumentiert werden. Sie werden wahrscheinlich einige Code neu schreiben müssen, weil die Steuerkonstrukte Sie verwenden, wenn primitive basierte tun Gleitkomma-Arithmetik kann nicht sinnvoll, wenn Sie die von Ihrem PSP zur Verfügung gestellt API verwenden.

Zum Beispiel - Sie könnten diese

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

zu diesem

psp_decimal_t arraysum;
if (0 != psp_sum_elements(&array, arraylen, &arraysum))
{
    printf("error!");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top