//////////////////////////////////////////////////////////////////////////////////// //Nom du filtre: filtre_RIF //Description du filtre: Un filtre RIF général //////////////////////////////////////////////////////////////////////////////////// //Partie commune aux implémentations en virgule flottante et fixe: //////////////////////////////////////////////////////////////////////////////////// //passe ricrac pour un filtre avec 100 coefficients et à 2khz sur l'arduino en Virgule fixe #define SIZEFILTER_RIF 41 //////////////////////////////////////////////////////////////////////////////////// //Implémentation en virgule flottante double précision: //////////////////////////////////////////////////////////////////////////////////// //mettre ici toutes les constantes et variables définies en double, en indiquant le type dans le nom avec _d_ const double numCoeff_d_FILTRE_RIF[SIZEFILTER_RIF] = { 0.016244657856333, -0.018864421488768, -0.012238782422342, -0.005085409431928, 0.003969691594410, 0.012267146479049, 0.015030618183398, 0.008966346831124, -0.004682203645285, -0.019357735197421, -0.025875762043837, -0.017435787337996, 0.005471034822059, 0.033037851847265, 0.049218355348873, 0.038520192602532, -0.006112347636894, -0.078041093847378, -0.157847718052422, -0.220135476387537, 0.756344281504610, -0.220135476387537, -0.157847718052422, -0.078041093847378, -0.006112347636894, 0.038520192602532, 0.049218355348873, 0.033037851847265, 0.005471034822059, -0.017435787337996, -0.025875762043837, -0.019357735197421, -0.004682203645285, 0.008966346831124, 0.015030618183398, 0.012267146479049, 0.003969691594410, -0.005085409431928, -0.012238782422342, -0.018864421488768, 0.016244657856333}; /*double numCoeff_d_FILTRE_EXEMPLE[SIZEFILTER_RIF]; //Coefficients du numérateur de la fonction de transfert du filtre au format double double ek_d_filtre_exemple[SIZEFILTER_RIF]; //tableau pour stocker les échantillons d'entrée au format double int indice_ecr_d_filtre_rif; void initFiltre_d_filtre_rif() {} double execFiltre_d_filtre_rif(double e) {} */ //////////////////////////////////////////////////////////////////////////////////// //Implémentation en virgule fixe: //////////////////////////////////////////////////////////////////////////////////// //mettre ici toutes les constantes et variables définies en int, en indiquant le type dans le nom avec _i_ short int numCoeff_i_FILTRE_RIF[SIZEFILTER_RIF]; //Coefficients du numérateur de la fonction de transfert du filtre au format virgule fixe short int ek_filtre_i_RIF[SIZEFILTER_RIF]; //tableau pour stocker les échantillons d'entrée au format virgule fixe int indice_ecr_i_filtre_rif; //pour gestion buffer circulaire #define NB_BITS_FRACTIONNAIRE 14 //////////////////////////////////////////////////////////////////////////////////// void initFiltre_i_filtre_rif() { int i; for (i = 0; i < SIZEFILTER_RIF; i++) { numCoeff_i_FILTRE_RIF[i] = floor( (numCoeff_d_FILTRE_RIF[i] * (1<< NB_BITS_FRACTIONNAIRE) )+ 0.5) ; ek_filtre_i_RIF[i]=0; } } //////////////////////////////////////////////////////////////////////////////////// inline short int execFiltre_i_filtre_rif(short int e) { long int temp; // calcul intermediaire sur 32 bits int i; //indice de lecture pour les valeurs des coefficients du filtre int indice_lec_i_filtre_rif = indice_ecr_i_filtre_rif; //indice de lecture pour les échantillons d'entrée short int skout = 0; //valeur pour la sortie calculée ek_filtre_i_RIF[indice_ecr_i_filtre_rif] = e - 512; //rangement de l'echantillon d'entrée dans le buffer circulaire des entrées en référencant par rapport au 0 // indice_ecr_i_filtre_rif = (indice_ecr_i_filtre_rif + 1) % SIZEFILTER_RIF; indice_ecr_i_filtre_rif = (indice_ecr_i_filtre_rif + 1); if (indice_ecr_i_filtre_rif>=SIZEFILTER_RIF) indice_ecr_i_filtre_rif=0; temp = 0; //valeur par défaut pour le résultat for (i = 0; i < SIZEFILTER_RIF; i++) { temp += (long int) numCoeff_i_FILTRE_RIF[i] * (long int)(ek_filtre_i_RIF[indice_lec_i_filtre_rif]); // calcul sur 32 bits indice_lec_i_filtre_rif--; if (indice_lec_i_filtre_rif < 0) indice_lec_i_filtre_rif = SIZEFILTER_RIF - 1; } if (temp & (1<<(NB_BITS_FRACTIONNAIRE-1)) ) // calcul de l'arrondi skout = (temp >> NB_BITS_FRACTIONNAIRE ) + 1; else skout = (temp >> NB_BITS_FRACTIONNAIRE ) ; if (skout > 511 ) // saturation du résultat sur 10 bits skout = 511 ; else if (skout < -512 ) skout = -512 ; return skout + 512; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////