Gast
#1199497
Hallo an alle! Ich versuche gerade im Rahmen meiner Diplomarbeit einen bestimmten Algorithmus auf dem dsPIC33 zu implementieren. Es funktioniert auch soweit ganz gut, bloß hat sich das Problem einer langen Rechenzeit ergeben, was ich auch erwartet hatte. Im Prinzip besteht der Algorithmus aus mehreren Matrixmultiplikationen, das sind natürlich die Dinger die Rechenzeit beanspruchen. Nun bietet der dsPIC die tolle dsp.h Library an, welche saumäßig schnell rechnen kann, aber eben nur im fractional-Format. Um die MatrixMultiply() funktion nutzen zu können, müsste ich theoretisch alle Matrizen skalieren damit die Werte im Bereich von -1...1 liegen. Problem: Meine Matrizen sind dermaßen krumm, dass eine Skalierung auf den größten Wert die anderen Werte ganz stark verkleinern würde und im Q.15 Format nicht mehr darstellbar wären. Ich möchte euch ein Beispiel zeigen: const float A[3][3] = {{1, 1E-3, 0}, {-1194172.438500119, -5.911870074,1194172.438500119}, {0, 0, 1} }; // A float P[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}; Eine Zeile in dem Algorithmus sieht so aus: Px = A*P*A' + Q; Q hat sehr sehr kleine Werte im Bereich 10^-5....10^-15 oder kleiner. Aber auf keine Fall zu Vernachlässigen! Ich würde gerne schnell rechnen, kann es aber nicht weil Genauigkeit verloren geht. Ich habe schon überlegt, ob ich z.B. A*P*A' im fractional Format rechne, das Ergebnis mit Fract2Float() umwandle und +Q im float addiere. Eine Skalierung von A unnd P würde dennoch das Ergebnis stark verändern. Eine weitere Überlegung war den PIC32 zu nehmen, aber der wiederum hat noch keine Matrix Multiplikation in der dsp library. Abgesehen davon liegt das Q.32 format auch nur zwischen -1 und 1, die Genauigkeit ist natürlich viel höher! Ich hoffe ich habe mein Problem einigermaßen gut erklärt, falls nicht, fragt bitte! Kennt sich jemand mit diesem Problem aus? Habt ihr Ideen? Vielen vielen Dank für eure Hilfe! Grüße, teo