Bonjour,
Je travail sur un FPGA Actel Fusion et je dois filtré un signal. Je dois donc programmer une équation à récurrence :
VFiltre(t+2) = [(a + 2b)*VFiltre(t+1)-b*VFiltre(t)+(VNon-Filtre(t+2)]/(1+a+b)
où ===> b=1/(w0²) ; a=(2*z)/w0) ; w0=0.05*2*Pi ; z=0.1
Je programme ( j'essaye ) avec SoftConsole. La compilation me donne un fichier .hex qui est mon complément de fichier en VHDL pour la suite du projet.
Je débute en langage C ( j'ai quelques notions ). J'ai plusieurs difficultés liées à cette équation. Tout d'abord je dois m'adapter à un programme qui à été conçu par une autre personne. Le signal non filtré est appelé Freq et est généré en lisant des valeurs dans une NVM de 32bits
freq=get_data_nvm(n1-premier_n1) + offsetN2
Ce signal envoie un mot 32bits à un DDS du type1 415 829 758 tous les 1KHz.
Ce signal est déclaré en static int dans le programme.
Pour obtenir dans un sprintf du Freq(t);Freq(t-1);(Freq(t-2) j'ai trouvé cette solution :
Freq(t-1) = tabtm1[0];
for (i=0; i<2 ;i++)
val= freq;
tabtm1[tm1_n1++] = val;
if(tm1_n1 == 1)
tm1_n1 = 0;
Freq(t-2) = tabtm2[0];
for (j=0; j<2 ;j++)
val2= Freq(t-1);
tabtm2[tm2_n1++] = val2;
if(tm2_n1 == 1)
tm2_n1 = 0;
C'est un peu moche mais par RS232 j'arrive à mettre en évidence du t;t-1;t-2 avec un signal lut sur un gpio.
Je post en pièce joint le fichier.c avec mon équation de récurrence et les déclarations de variables.
En réalisant je me suis aperçu que je manipulais des nombres à virgule et je pense que le résultat de l'équation doit être déclaré en unsigned long long car je multiplie une variable int qui est déja codé sur 31 bits.
Merci de votre aide, ça fait près de 2 semaines qui j'essaye un peu tout.
Partager