Forum: Mikrocontroller und Digitale Elektronik code in integer arithmetik übersetzen


von Samuel (Gast)


Lesenswert?

Hallo,
folgenden Codeteil soll ich in integer arithmetik übersetzen, da der 
Controller keine floating point unit besitzt, und somit nur über eine 
library float zahlen rechnen könnte, was zu einr zu langen rechenzeit 
führen würde. Was muss ich beim überetzen in integer arithetik beachten?

Gruß
Samuel


double xv0, xv1 = 0.0, uf, phi = 1.2566370614e+05;




"voltage"-controlled oscillator */
        phi += (uf *  2.2222222222e-05);  /* T */
        while (phi < -PI) phi += TWOPI;
        while (phi >= +PI) phi -= TWOPI;
        /* phase detector */
        double ud = in.im * cos(phi) - in.re * sin(phi);
        /* loop filter (hf gain = tau2/tau1) */
        xv0 = xv1;
        xv1 =  1.7944313386e+03 * ud;    /* (tau2/tau1) / G */
        uf += (xv1 -  9.8044334903e-01 * xv0);  /* C */
        return phi;

von I_ H. (i_h)


Lesenswert?

Du solltest beachten, dass du mit normalen (32bit) Integern nie und 
nimmer auch nur annährend die Genauigkeit von Double erreichen wirst, 
zumindest nicht ohne ähnlich viel Speicher wie die Libs zu verbrauchen.

Nimmst du dann 64bit Ints hast du riesige und langsame modulo-, div und 
mul Operationen.

Probier doch erstmal float.

von lkmiller (Gast)


Lesenswert?

Nötige Genauigkeit kontrollieren und verringern.
Mit den vielen Nachkommastellen in den Konstanten sieht das schlecht 
aus.
In eine Festpunktzahl mit 32 Bit passen eben maximal knapp 9 Stellen.
Und du bist in den Konstanten von 2.22e-05 bis 1.25e+05 unterwegs, das 
sind schon ganz ohne weitere Berechnungen 10 Kommastellen.

Wenn die genauigkeit von 32 Bit ausreicht:
Sieh dir mal die Festpunktarithmetik von DSPs an, hier war der 
Wertebereich von -1..+1, und die Berechnungen sind recht einfach. Aber 
da musst du dein ganzes Modell etwas umskalieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.