Kiss FFT sur un dsPIC33

J’ai essayé de faire fonctionner KissFFT sur un DSPIC, mais après différentes tentatives, le résultat n’est pas ce qu’il devrait être. J’espérais obtenir de l’aide pour voir s’il y a des configurations que je pourrais négliger ou si c’est simplement quelque chose auquel je n’ai pas pensé?

J’utilise un dsPIC33EP256MC202 avec le compilateur XC16 dans MPLABX.

Déclarations et assignation de mémoire.

int readings[3] = {0, 0, 0}; kiss_fft_scalar zero; memset(&zero,0,sizeof(zero)); int size = 128 * 2; float fin[256]; kiss_fft_cpx in[size]; kiss_fft_cpx out[size]; for (i = 0; i < size; i++) { in[i].r = zero; in[i].i = zero; out[i].r = zero; out[i].i = zero; } kiss_fft_cfg mycfg = kiss_fft_alloc(size*2 ,0 ,NULL,NULL); 

Obtenez les lectures d’un accéléromètre sur la maquette et remplissez le tableau de flotteurs (en utilisant pythagore pour consolider les 3 axes ‘en un seul signal). Les valeurs XYZ en entrée sont réduites car elles se situent entre -2400 et 2400 en moyenne.

 while(1) { if(iii <= 1){ UART_Write_Text("Collecting..."); } getOutput(readings); X = (double)readings[0]; Y = (double)readings[1]; Z = (double)readings[2]; X = X / 50; Y = Y / 50; Z = Z / 50; if(ii <= 256){ fin[ii] = sqrt(X*X + Y*Y + Z*Z); ii++; } else{ i=0; while(i<255){ fin[i] = fin[i+1]; i++; } fin[255] = sqrt(X*X + Y*Y + Z*Z); } 

Une fois que le tableau float est plein de valeurs, remplissez le composant réel du tableau complexe en entrée avec les valeurs du tableau float. Effectuez ensuite la FFT Kiss et remplissez un tableau flottant (arrayDFTOUT) avec la valeur absolue de chaque valeur réelle et imaginaire du tableau sortant de Kiss FFT. La boucle finale rend toute valeur négative positive.

 if(iii == 255){ iii = 0; UART_Write_Text("Processing..."); for (i = 0; i < size; i++) { // samples are type of short in[i].r = fin[i]; in[i].i = zero; out[i].r = zero; out[i].i = zero; } kiss_fft(mycfg, in, out); for(i=0;i<128;i++){ arrayDFTOUT[i] = sqrt((out[i].r*out[i].r) + (out[i].i*out[i].i)); } arrayDFTOUT[0] = 1; for(i = 0; i<128; i++){ if(arrayDFTOUT[i] < 0){ arrayDFTOUT[i] = arrayDFTOUT[i] - (arrayDFTOUT[i]*2); } } 

Enfin, affichez les valeurs de sortie en série à l’aide de l’UART sur la maquette.

 for(i = 0; i < 128; i++){ sprintf(temp, "%f,", arrayDFTOUT[i]); UART_Write_Text(temp); } 

Et sont les résultats. Tous les zéros sont identiques à la première valeur définie sur 1 après l’exécution de KissFFT. Des idées?

Sortie de la console