Filtre RIF temps réel Buffer circulaire

Dependencies:   mbed

Committer:
pierreprovent
Date:
Mon Oct 26 17:54:10 2020 +0000
Revision:
1:cd4d5bcb6cfe
Parent:
0:fd47c7ee306d
Modif mineure

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pierreprovent 0:fd47c7ee306d 1 #include "mbed.h"
pierreprovent 0:fd47c7ee306d 2
pierreprovent 0:fd47c7ee306d 3 #define fech 40000 // Fréquence d'échantillonnage souhaitée
pierreprovent 0:fd47c7ee306d 4 #define NB_COEFF 21 // Nombre de coefficients du filtre RIF
pierreprovent 0:fd47c7ee306d 5
pierreprovent 0:fd47c7ee306d 6 Serial pc(USBTX, USBRX);
pierreprovent 0:fd47c7ee306d 7
pierreprovent 0:fd47c7ee306d 8 AnalogIn entree_analogique(PC_3); // A2 connecteur Arduino
pierreprovent 0:fd47c7ee306d 9 AnalogOut sortie_analogique(PA_5); // D13 Arduino
pierreprovent 0:fd47c7ee306d 10 PwmOut sortie(PE_9); // D6 Arduino
pierreprovent 0:fd47c7ee306d 11 DigitalOut visu(PG_9) ; // D0 Arduino
pierreprovent 0:fd47c7ee306d 12 Ticker ADC_DAC ;
pierreprovent 0:fd47c7ee306d 13
pierreprovent 0:fd47c7ee306d 14 // Filtre RIF passe_bas fc = 2000 Hz généré avec Octave fe réelle = 40 kHz
pierreprovent 0:fd47c7ee306d 15 // Fe = 2 dans Octave --> Fc Octavve = 2000/40000 = 0.075
pierreprovent 0:fd47c7ee306d 16 // b = fir1(20,0.075) ; 21 = nb coeffients dans b
pierreprovent 0:fd47c7ee306d 17 float coeff_filtre[NB_COEFF] = {0.0026603,0.0045069,0.0091798,0.017556,
pierreprovent 0:fd47c7ee306d 18 0.029809,0.045263,0.062429,0.079237,0.093403,
pierreprovent 0:fd47c7ee306d 19 0.10286,0.10619,0.10286,0.093403,0.079237,
pierreprovent 0:fd47c7ee306d 20 0.062429,0.045263,0.029809,0.017556,0.0091798,
pierreprovent 0:fd47c7ee306d 21 0.0045069,0.0026603
pierreprovent 0:fd47c7ee306d 22 } ;
pierreprovent 0:fd47c7ee306d 23
pierreprovent 0:fd47c7ee306d 24 // Temps de traitement d'un échantillon 2.3 us
pierreprovent 0:fd47c7ee306d 25 float firc(float xn)
pierreprovent 0:fd47c7ee306d 26 {
pierreprovent 0:fd47c7ee306d 27 static float in[NB_COEFF] ;
pierreprovent 0:fd47c7ee306d 28 int j, indice ;
pierreprovent 0:fd47c7ee306d 29 static int i = 0 ;
pierreprovent 0:fd47c7ee306d 30 float yn = 0 ;
pierreprovent 0:fd47c7ee306d 31 in[i] = xn ; // (1)
pierreprovent 0:fd47c7ee306d 32 for (j = 0 ; j < NB_COEFF ; j++) { // (2)
pierreprovent 0:fd47c7ee306d 33 indice = (i - j + NB_COEFF) % NB_COEFF ;
pierreprovent 0:fd47c7ee306d 34 yn += coeff_filtre[j]* in[indice] ;
pierreprovent 0:fd47c7ee306d 35 }
pierreprovent 0:fd47c7ee306d 36 i++;
pierreprovent 0:fd47c7ee306d 37 if (i == NB_COEFF) i = 0; // (3)
pierreprovent 0:fd47c7ee306d 38 return(yn);
pierreprovent 0:fd47c7ee306d 39 }
pierreprovent 0:fd47c7ee306d 40
pierreprovent 0:fd47c7ee306d 41 void filtrage()
pierreprovent 0:fd47c7ee306d 42 {
pierreprovent 0:fd47c7ee306d 43 float x,y ;
pierreprovent 0:fd47c7ee306d 44 x = entree_analogique.read();
pierreprovent 0:fd47c7ee306d 45 visu = 1 ;
pierreprovent 0:fd47c7ee306d 46 y = firc(x) ;
pierreprovent 0:fd47c7ee306d 47 visu = 0 ;
pierreprovent 0:fd47c7ee306d 48 sortie_analogique.write(y) ;
pierreprovent 0:fd47c7ee306d 49 }
pierreprovent 0:fd47c7ee306d 50
pierreprovent 0:fd47c7ee306d 51 int main()
pierreprovent 0:fd47c7ee306d 52 {
pierreprovent 0:fd47c7ee306d 53 ADC_DAC.attach_us(&filtrage,1000000/fech);
pierreprovent 0:fd47c7ee306d 54 sortie.period_us(500);
pierreprovent 0:fd47c7ee306d 55 sortie.write(0.5f) ; // rapport cyclique 1/2
pierreprovent 0:fd47c7ee306d 56 pc.printf("\nEssai filtrage numerique temps reel fech = %d Hz\n",fech);
pierreprovent 0:fd47c7ee306d 57 pc.printf("Connectez la sortie D6 (signal a filtrer) sur l'entree A2 \n");
pierreprovent 0:fd47c7ee306d 58 pc.printf("Visualisez signal filtre sur la broche D13 \n");
pierreprovent 0:fd47c7ee306d 59 pc.printf("Traitement en cours : ");
pierreprovent 0:fd47c7ee306d 60 while(1) {
pierreprovent 0:fd47c7ee306d 61 }
pierreprovent 0:fd47c7ee306d 62 }