Mini projet de FFT

Dependencies:   mbed Grove_LCD_RGB_Backlight UIT_FFT_Real

Committer:
AxelBoujon
Date:
Fri May 31 11:30:06 2019 +0000
Revision:
2:525fb567d140
Parent:
1:a806f3aacf1f
Projet de FFT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SBACCARI 0:c7f159ed0bc3 1 #include "mbed.h"
SBACCARI 0:c7f159ed0bc3 2 #include "Grove_LCD_RGB_Backlight.h"
SBACCARI 0:c7f159ed0bc3 3 #include "fftReal.hpp"
SBACCARI 0:c7f159ed0bc3 4
AxelBoujon 2:525fb567d140 5 #define Nb_echantillons 256
AxelBoujon 2:525fb567d140 6
AxelBoujon 2:525fb567d140 7 //Elements
SBACCARI 0:c7f159ed0bc3 8 Grove_LCD_RGB_Backlight ecran(P0_27, P0_28);
SBACCARI 0:c7f159ed0bc3 9 AnalogIn micro(A1);
SBACCARI 0:c7f159ed0bc3 10
AxelBoujon 2:525fb567d140 11 //Variables
AxelBoujon 2:525fb567d140 12 Ticker echantillonage;
SBACCARI 0:c7f159ed0bc3 13 int sampling_freq = 44000;
AxelBoujon 2:525fb567d140 14 float echantillons[Nb_echantillons*2];
SBACCARI 0:c7f159ed0bc3 15 int i = 0;
AxelBoujon 2:525fb567d140 16 Mikami::Complex fft_bins[Nb_echantillons];
AxelBoujon 2:525fb567d140 17 Mikami::FftReal fft((int16_t)Nb_echantillons);
SBACCARI 0:c7f159ed0bc3 18
SBACCARI 0:c7f159ed0bc3 19 void sampling_interrup()
SBACCARI 0:c7f159ed0bc3 20 {
AxelBoujon 2:525fb567d140 21 echantillons[i] = 1024*micro.read(); // 1024 : ADC of the sound sensor
SBACCARI 0:c7f159ed0bc3 22 i++;
AxelBoujon 2:525fb567d140 23 if (i >= Nb_echantillons*2) {
AxelBoujon 2:525fb567d140 24 echantillonage.detach();
SBACCARI 0:c7f159ed0bc3 25 }
SBACCARI 0:c7f159ed0bc3 26 }
SBACCARI 0:c7f159ed0bc3 27
SBACCARI 0:c7f159ed0bc3 28 void samplingBegin()
SBACCARI 0:c7f159ed0bc3 29 {
SBACCARI 0:c7f159ed0bc3 30 // Reset sample buffer position and start callback at the sampling frequency
SBACCARI 0:c7f159ed0bc3 31 i = 0;
AxelBoujon 2:525fb567d140 32 echantillonage.attach_us(&sampling_interrup, 1000000/sampling_freq);
SBACCARI 0:c7f159ed0bc3 33 }
SBACCARI 0:c7f159ed0bc3 34
SBACCARI 0:c7f159ed0bc3 35 bool samplingDone()
SBACCARI 0:c7f159ed0bc3 36 {
AxelBoujon 2:525fb567d140 37 return i >= Nb_echantillons*2;
SBACCARI 0:c7f159ed0bc3 38 }
SBACCARI 0:c7f159ed0bc3 39
AxelBoujon 2:525fb567d140 40 void FFT(){
AxelBoujon 2:525fb567d140 41 char str[20];
AxelBoujon 2:525fb567d140 42 // max 1 is set to the second FFT bin, because the first bin has the DC componenet of the signal.
AxelBoujon 2:525fb567d140 43 int MAX = 2;
AxelBoujon 2:525fb567d140 44 //int max2 = 3;
AxelBoujon 2:525fb567d140 45 float val = 0;
AxelBoujon 2:525fb567d140 46 /*ecran.locate(0, 0);
AxelBoujon 2:525fb567d140 47 sprintf(str,"Sampling done");
AxelBoujon 2:525fb567d140 48 ecran.print(str);
AxelBoujon 2:525fb567d140 49 wait(1);*/
AxelBoujon 2:525fb567d140 50 fft.Execute(echantillons,fft_bins);
AxelBoujon 2:525fb567d140 51 wait(0.5);
AxelBoujon 2:525fb567d140 52
AxelBoujon 2:525fb567d140 53 /*ecran.clear();
AxelBoujon 2:525fb567d140 54 sprintf(str,"FFT Done");
AxelBoujon 2:525fb567d140 55 ecran.print(str);
AxelBoujon 2:525fb567d140 56 wait(1);*/
AxelBoujon 2:525fb567d140 57
AxelBoujon 2:525fb567d140 58 // PRINT SPECTRUM
AxelBoujon 2:525fb567d140 59 for(int j = 0;j < Nb_echantillons/2 ;++j){
AxelBoujon 2:525fb567d140 60 ecran.clear();
AxelBoujon 2:525fb567d140 61 float mod = std::abs(fft_bins[j]);
AxelBoujon 2:525fb567d140 62 //float freq = j*sampling_freq/(Nb_echantillons*1000);
AxelBoujon 2:525fb567d140 63 /*sprintf(str,"%d.Freq = %.2f kHz", j,freq );
AxelBoujon 2:525fb567d140 64 ecran.locate(0,1);
AxelBoujon 2:525fb567d140 65 ecran.print(str);
AxelBoujon 2:525fb567d140 66 sprintf(str,"%d.Mag = %.2f", j, mod );
AxelBoujon 2:525fb567d140 67 ecran.locate(0,0);
AxelBoujon 2:525fb567d140 68 ecran.print(str);*/
AxelBoujon 2:525fb567d140 69 if( (j>5)and mod >= std::abs(fft_bins[MAX]) ){
AxelBoujon 2:525fb567d140 70 MAX = j;
AxelBoujon 2:525fb567d140 71 }
AxelBoujon 2:525fb567d140 72 /*else if ( (j>3) and (std::abs(fft_bins[j]) >= std::abs(fft_bins[max2])) and (std::abs(fft_bins[j]) < std::abs(fft_bins[MAX]))){
AxelBoujon 2:525fb567d140 73 max2 = j;
AxelBoujon 2:525fb567d140 74 }
AxelBoujon 2:525fb567d140 75 wait(1);*/
AxelBoujon 2:525fb567d140 76 }
AxelBoujon 2:525fb567d140 77
AxelBoujon 2:525fb567d140 78 val = MAX*sampling_freq/(Nb_echantillons*1000);
AxelBoujon 2:525fb567d140 79 float mod = std::abs(fft_bins[MAX]);
AxelBoujon 2:525fb567d140 80 /*sprintf(str,"%MAX= %.2f", mod );
AxelBoujon 2:525fb567d140 81 ecran.locate(0,0);
AxelBoujon 2:525fb567d140 82 ecran.print(str);*/
AxelBoujon 2:525fb567d140 83 ecran.clear();
AxelBoujon 2:525fb567d140 84 sprintf(str,"max= %.2f kHz", val );
AxelBoujon 2:525fb567d140 85 ecran.locate(0,0);
AxelBoujon 2:525fb567d140 86 ecran.print(str);
AxelBoujon 2:525fb567d140 87 wait(2);
AxelBoujon 2:525fb567d140 88 /*val = max2*sampling_freq/(Nb_echantillons*1000);
AxelBoujon 2:525fb567d140 89 sprintf(str,"max 2 = %.2f kHz", val);
AxelBoujon 2:525fb567d140 90 ecran.locate(0,1);
AxelBoujon 2:525fb567d140 91 ecran.print(str);
AxelBoujon 2:525fb567d140 92 wait(2);*/
AxelBoujon 2:525fb567d140 93 samplingBegin();
AxelBoujon 2:525fb567d140 94 }
SBACCARI 0:c7f159ed0bc3 95
SBACCARI 0:c7f159ed0bc3 96 int main() {
SBACCARI 0:c7f159ed0bc3 97 // CONFIG ECRAN
SBACCARI 0:c7f159ed0bc3 98 ecran.setRGB(0, 255, 0);
SBACCARI 0:c7f159ed0bc3 99 ecran.clear();
SBACCARI 0:c7f159ed0bc3 100 ecran.locate(0, 1);
SBACCARI 0:c7f159ed0bc3 101 samplingBegin();
SBACCARI 0:c7f159ed0bc3 102 // The following loop, will do FFT and display highest detected frequency on the screen every 2s
AxelBoujon 2:525fb567d140 103 // Commented sections, are debug mode. If uncommented, it will do FFT, display all the spectrum then restart, it will take about 10s + Nb_echantillons/2 seconds
SBACCARI 0:c7f159ed0bc3 104 while(1) {
SBACCARI 0:c7f159ed0bc3 105 // DO FFT
AxelBoujon 2:525fb567d140 106 if (samplingDone()) FFT();
SBACCARI 0:c7f159ed0bc3 107 /* // DEBUG SCREEN
SBACCARI 0:c7f159ed0bc3 108 ecran.clear();
SBACCARI 0:c7f159ed0bc3 109 myled = !myled;
SBACCARI 0:c7f159ed0bc3 110 sprintf(str,"Waiting ...");
SBACCARI 0:c7f159ed0bc3 111 ecran.print(str);*/
SBACCARI 0:c7f159ed0bc3 112 }
SBACCARI 0:c7f159ed0bc3 113 }