Franck DURAND / Mbed 2 deprecated SID_V3_Nucleo_F429ZI

Dependencies:   mbed USBHost

Committer:
pierreprovent
Date:
Thu Oct 22 12:20:25 2020 +0000
Revision:
0:c7bba77179af
Child:
1:2011b28f3283
Filtre

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 //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 }