Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:c7bba77179af, 2020-10-22 (annotated)
- Committer:
- pierreprovent
- Date:
- Thu Oct 22 12:20:25 2020 +0000
- Revision:
- 0:c7bba77179af
- Child:
- 1:2011b28f3283
Filtre
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 | //du filtre RIF pour gérer la pile glissante d'echantillons |
pierreprovent | 0:c7bba77179af | 6 | |
pierreprovent | 0:c7bba77179af | 7 | Serial pc(USBTX, USBRX); |
pierreprovent | 0:c7bba77179af | 8 | |
pierreprovent | 0:c7bba77179af | 9 | AnalogIn entree_analogique(PC_3); // A2 connecteur Arduino |
pierreprovent | 0:c7bba77179af | 10 | AnalogOut sortie_analogique(PA_5); // D13 Arduino |
pierreprovent | 0:c7bba77179af | 11 | PwmOut sortie(PE_9); // D6 Arduino |
pierreprovent | 0:c7bba77179af | 12 | DigitalOut visu(PG_9) ; // D0 Arduino |
pierreprovent | 0:c7bba77179af | 13 | Ticker ADC_DAC ; |
pierreprovent | 0:c7bba77179af | 14 | |
pierreprovent | 0:c7bba77179af | 15 | // Filtre RIF passe_bas fc = 2000 Hz généré avec Octave fe réelle = 40 kHz |
pierreprovent | 0:c7bba77179af | 16 | // Fe = 1 dans Octave --> Fc Octavve = 2000/40000 = 0.075 |
pierreprovent | 0:c7bba77179af | 17 | // b = fir1(20,0.075) ; 21 = nb coeffients dans b |
pierreprovent | 0:c7bba77179af | 18 | float coeff_filtre[NB_COEFF] = {0.0026603,0.0045069,0.0091798,0.017556, |
pierreprovent | 0:c7bba77179af | 19 | 0.029809,0.045263,0.062429,0.079237,0.093403, |
pierreprovent | 0:c7bba77179af | 20 | 0.10286,0.10619,0.10286,0.093403,0.079237, |
pierreprovent | 0:c7bba77179af | 21 | 0.062429,0.045263,0.029809,0.017556,0.0091798, |
pierreprovent | 0:c7bba77179af | 22 | 0.0045069,0.0026603 |
pierreprovent | 0:c7bba77179af | 23 | } ; |
pierreprovent | 0:c7bba77179af | 24 | // Passe pas généré avec Matlab outil filterDesign |
pierreprovent | 0:c7bba77179af | 25 | // Lowpass, FIR leas-square, fe = 40 kHz, ordre 20, |
pierreprovent | 0:c7bba77179af | 26 | // fpass = 1000 Hz, fstop = 2000 Hz |
pierreprovent | 0:c7bba77179af | 27 | /*float coeff_filtre[NB_COEFF] = { |
pierreprovent | 0:c7bba77179af | 28 | 0.01815973036, 0.02545970678, 0.03320529684, 0.04110899568, 0.04885519296, |
pierreprovent | 0:c7bba77179af | 29 | 0.05611754954, 0.06257762015, 0.0679435432, 0.07196751237, 0.07446079701, |
pierreprovent | 0:c7bba77179af | 30 | 0.07530529052, 0.07446079701, 0.07196751237, 0.0679435432, 0.06257762015, |
pierreprovent | 0:c7bba77179af | 31 | 0.05611754954, 0.04885519296, 0.04110899568, 0.03320529684, 0.02545970678, |
pierreprovent | 0:c7bba77179af | 32 | 0.01815973036 |
pierreprovent | 0:c7bba77179af | 33 | };*/ |
pierreprovent | 0:c7bba77179af | 34 | |
pierreprovent | 0:c7bba77179af | 35 | // Temps de traitement d'un échantillon 1.3 us |
pierreprovent | 0:c7bba77179af | 36 | float fir(float xn) |
pierreprovent | 0:c7bba77179af | 37 | { |
pierreprovent | 0:c7bba77179af | 38 | static float in[NB_COEFF + 1] ; |
pierreprovent | 0:c7bba77179af | 39 | int k ; |
pierreprovent | 0:c7bba77179af | 40 | float yn = 0 ; |
pierreprovent | 0:c7bba77179af | 41 | in[0] = xn ; // Entrée de l'échantillon courant au début du tableau |
pierreprovent | 0:c7bba77179af | 42 | for (k = NB_COEFF - 1 ; k >=0 ; k--) { |
pierreprovent | 0:c7bba77179af | 43 | yn += in[k]*coeff_filtre[k] ; |
pierreprovent | 0:c7bba77179af | 44 | in[k+1] = in[k] ; // Glissement des échantillons dans la pile après utilisation |
pierreprovent | 0:c7bba77179af | 45 | } |
pierreprovent | 0:c7bba77179af | 46 | return(yn); |
pierreprovent | 0:c7bba77179af | 47 | } |
pierreprovent | 0:c7bba77179af | 48 | |
pierreprovent | 0:c7bba77179af | 49 | // Deux versions avec des pointeurs, moins performantes que la version de base |
pierreprovent | 0:c7bba77179af | 50 | // Temps de traitement d'un échantillon = 1.44 us |
pierreprovent | 0:c7bba77179af | 51 | /* |
pierreprovent | 0:c7bba77179af | 52 | float fir(float xn) |
pierreprovent | 0:c7bba77179af | 53 | { |
pierreprovent | 0:c7bba77179af | 54 | static float in[TAILLE_TAB] ; |
pierreprovent | 0:c7bba77179af | 55 | float *pt_in , *pt_coeff ; |
pierreprovent | 0:c7bba77179af | 56 | int k ; |
pierreprovent | 0:c7bba77179af | 57 | float yn = 0 ; |
pierreprovent | 0:c7bba77179af | 58 | pt_in = in ; |
pierreprovent | 0:c7bba77179af | 59 | *pt_in = xn ; |
pierreprovent | 0:c7bba77179af | 60 | pt_in = in + NB_COEFF - 1 ; |
pierreprovent | 0:c7bba77179af | 61 | pt_coeff = coeff_filtre + NB_COEFF - 1 ; |
pierreprovent | 0:c7bba77179af | 62 | |
pierreprovent | 0:c7bba77179af | 63 | for (k = NB_COEFF - 1 ; k >=0 ; k--) { |
pierreprovent | 0:c7bba77179af | 64 | yn += *pt_in * (*pt_coeff) ; |
pierreprovent | 0:c7bba77179af | 65 | *(pt_in + 1) = *(pt_in) ; |
pierreprovent | 0:c7bba77179af | 66 | pt_in-- ; |
pierreprovent | 0:c7bba77179af | 67 | pt_coeff--; |
pierreprovent | 0:c7bba77179af | 68 | } |
pierreprovent | 0:c7bba77179af | 69 | return(yn); |
pierreprovent | 0:c7bba77179af | 70 | } |
pierreprovent | 0:c7bba77179af | 71 | */ |
pierreprovent | 0:c7bba77179af | 72 | // Temps de traitement d'un échantillon = 1.96 us |
pierreprovent | 0:c7bba77179af | 73 | /*float fir(float xn) |
pierreprovent | 0:c7bba77179af | 74 | { |
pierreprovent | 0:c7bba77179af | 75 | static float in[TAILLE_TAB] ; |
pierreprovent | 0:c7bba77179af | 76 | float *pt_in , *pt_coeff ; |
pierreprovent | 0:c7bba77179af | 77 | int k ; |
pierreprovent | 0:c7bba77179af | 78 | float yn = 0 ; |
pierreprovent | 0:c7bba77179af | 79 | pt_in = in ; |
pierreprovent | 0:c7bba77179af | 80 | *pt_in = xn ; |
pierreprovent | 0:c7bba77179af | 81 | pt_in = in + NB_COEFF - 1 ; |
pierreprovent | 0:c7bba77179af | 82 | pt_coeff = coeff_filtre + NB_COEFF - 1 ; |
pierreprovent | 0:c7bba77179af | 83 | |
pierreprovent | 0:c7bba77179af | 84 | for (k = NB_COEFF - 1 ; k >=0 ; k--) { |
pierreprovent | 0:c7bba77179af | 85 | yn += *pt_in-- * (*pt_coeff--) ; |
pierreprovent | 0:c7bba77179af | 86 | *(pt_in) = *(pt_in - 1) ; |
pierreprovent | 0:c7bba77179af | 87 | } |
pierreprovent | 0:c7bba77179af | 88 | return(yn); |
pierreprovent | 0:c7bba77179af | 89 | }*/ |
pierreprovent | 0:c7bba77179af | 90 | |
pierreprovent | 0:c7bba77179af | 91 | void filtrage() |
pierreprovent | 0:c7bba77179af | 92 | { |
pierreprovent | 0:c7bba77179af | 93 | float x,y ; |
pierreprovent | 0:c7bba77179af | 94 | x = entree_analogique.read(); |
pierreprovent | 0:c7bba77179af | 95 | visu = 1 ; |
pierreprovent | 0:c7bba77179af | 96 | y = fir(x) ; |
pierreprovent | 0:c7bba77179af | 97 | visu = 0 ; |
pierreprovent | 0:c7bba77179af | 98 | sortie_analogique.write(y) ; |
pierreprovent | 0:c7bba77179af | 99 | } |
pierreprovent | 0:c7bba77179af | 100 | |
pierreprovent | 0:c7bba77179af | 101 | int main() |
pierreprovent | 0:c7bba77179af | 102 | { |
pierreprovent | 0:c7bba77179af | 103 | |
pierreprovent | 0:c7bba77179af | 104 | pc.printf("\nEssai filtrage numerique temps reel fech = %d Hz\n",fech); |
pierreprovent | 0:c7bba77179af | 105 | pc.printf("Connectez la sortie D6 (signal a filtrer) sur l'entree A2 \n"); |
pierreprovent | 0:c7bba77179af | 106 | pc.printf("Visualisez signal filtre sur la broche D13 \n"); |
pierreprovent | 0:c7bba77179af | 107 | pc.printf("Mesure du temps de traitement du filtrage sur D0 \n"); |
pierreprovent | 0:c7bba77179af | 108 | pc.printf("Traitement en cours : \n"); |
pierreprovent | 0:c7bba77179af | 109 | ADC_DAC.attach_us(&filtrage,1000000/fech); |
pierreprovent | 0:c7bba77179af | 110 | sortie.period_us(2000); |
pierreprovent | 0:c7bba77179af | 111 | sortie.write(0.5f) ; // rapport cyclique 1/2 |
pierreprovent | 0:c7bba77179af | 112 | while(1) { |
pierreprovent | 0:c7bba77179af | 113 | } |
pierreprovent | 0:c7bba77179af | 114 | } |