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