Filtre RIF temps réel Pile glissante

Dependencies:   mbed

Committer:
pierreprovent
Date:
Mon Oct 26 18:18:54 2020 +0000
Revision:
1:2011b28f3283
Parent:
0:c7bba77179af
Filtre RIF temps reel technique par pile glissante cours ELE118

Who changed what in which revision?

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