Pierre Provent
/
Filtre_RIF_Temps_Reel_Pile_Glissante_Nucleo_F429ZI
Filtre RIF temps réel Pile glissante
main.cpp@1:2011b28f3283, 2020-10-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |