Bonjour,
Pour un projet j'ai besoin de faire l'interpolation de points pour suivre une trajectoire. J'ai un tableau de 500 points à partir desquels je veux ressortir 2000 points.
J'ai choisi d'utiliser la méthode d'interpolation de Lagrange pour faire cela, et dans un cas particulier ça "tombe en marche".
J'utilise un PIC24EP512GU810 qui mouline à 120MHz (60 MIPS) et l'UART1 pour le debug transmet à 921600 bauds (débit max que mon terminal peut gérer).
Je pense que mon problème se situe dans la fonction getInterpolationDot. Lorsque je dé-commente l'instruction UART1_writeString(buff);(*), les valeurs que cette fonction renvoie sont bonnes, et sont identiques à celles renvoyées dans la boucle for du main.
MAIS lorsque je commente l'instruction UART1_writeString(buff) dans la fonction getInterpolationDot, les valeurs renvoyées par la boucle for du main ne correspondent plus du tout...
Je pensais à un problème de temps d'exécution qui diffère entre l'activation ou non de l'envoi sur l'UART. J'ai essayé d'ajouter une suite de Nop() puis une instruction __delay_ms(N); dans la fonction getInterpolationDot. Mais ça ne change rien... J'ai essayé des délais jusqu'à 50 ms, c'est super long, mais pas de résultats satisfaisants.
Concernant le reste du programme, les différentes variables ne sont appelées que dans les fonctions présentées, et le Timer1 actif, qui entre dans le vecteur d'interruption toutes les 1 ms, mais il ne fait que la remise à 0 du flag (il sera utilisé par la suite).
Voici mes différentes fonctions :
* Calcul de l'interpolation de Lagrange de 16 points à partir de 4 points connus :
* Calcul de 2000 points à partir des 500 points connus en faisant appel à l'interpolation de Lagrange dans une routine :Code:UINT16 LagrangeInterpolation(UINT16 y[4], UINT16 a) { double s = 1, t = 1, k; double x[4] = {0}; UINT8 i, j; UINT16 value=0; for(i = 0; i < 4; i++) { x[i] = i * 4; } for(i = 0; i < 4; i++) { s = 1; t = 1; for(j = 0; j < 4; j++) { if(j != i) { s = s * ((double)a - x[j]); t = t * (x[i] - x[j]); } } k += (double)((s / t) * (double)y[i]); } value = (UINT16)k; return value; }
* Et enfin ma fonction main qui appelle la fonction :Code:INT32 getInterpolationDot(UINT16 *inputBuffer, UINT16 *outputBuffer) { UINT8 j = 0; UINT8 i = 0; UINT16 k = 0; UINT16 inData[4] = {0}; UINT16 outData = 0; char buff[64]; for(j = 0; j < 125; j++) { for(i = 0; i < 4; i++) { k = i + (j * 4); inData[i] = inputBuffer[k]; } for(i = 0; i < 16; i++) { k = i + (j * 16); outputBuffer[k] = LagrangeInterpolation(inData, i); sprintf(buff, "x=%04u;y=%05u\r\n", k, outputBuffer[k]); UART1_writeString(buff); // (*) Instruction qui fait fonctionner le programme // __delay_ms(50); } } return 0; }
Pour ceux qui auraient une petite idée... MerciCode:int main(int argc, char** argv) { UINT16 k = 0; UINT16 memoryBuffer[500] = {500 valeurs prédéfinies}; // 500 valeurs stockées en mémoire UINT16 accelerationProfile[2000] = {0}; // 2000 valeurs à calculer getInterpolationDot(memoryBuffer, accelerationProfile); // convertit les 500 points d'entrée en 2000 points de sortie for(k = 0; k < 2000; k++) { sprintf(buff, "x=%04u;y=%05u\r\n", k, accelerationProfile[k]); // envoie les 2000 valeurs calculées sur le terminal pour vérification UART1_writeString(buff); __delay_ms(10); } }
-----