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;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.