Affichage de la FFT d'un signal analogique sur 256 points

Dependencies:   mbed mbed-dsp

Committer:
villemejane
Date:
Tue Feb 09 14:34:53 2021 +0000
Revision:
2:47d90ce030a3
Parent:
0:96c89b4dc711
FFT Calculation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
villemejane 2:47d90ce030a3 1 /****************************************************************************/
villemejane 2:47d90ce030a3 2 /* FFT d'un signal - Nucleo */
villemejane 2:47d90ce030a3 3 /****************************************************************************/
villemejane 2:47d90ce030a3 4 /* LEnsE / Julien VILLEMEJANE / Institut d'Optique Graduate School */
villemejane 2:47d90ce030a3 5 /****************************************************************************/
villemejane 2:47d90ce030a3 6 /* Brochage */
villemejane 2:47d90ce030a3 7 /* TO COMPLETE */
villemejane 2:47d90ce030a3 8 /****************************************************************************/
villemejane 2:47d90ce030a3 9 /* Test réalisé sur Nucléo-L476RG */
villemejane 2:47d90ce030a3 10 /****************************************************************************/
villemejane 2:47d90ce030a3 11
villemejane 0:96c89b4dc711 12 #include "mbed.h"
villemejane 0:96c89b4dc711 13 #include "arm_math.h"
villemejane 0:96c89b4dc711 14 /* Include mbed-dsp libraries */
villemejane 0:96c89b4dc711 15 #include "dsp.h"
villemejane 0:96c89b4dc711 16 #include "arm_common_tables.h"
villemejane 0:96c89b4dc711 17 #include "arm_const_structs.h"
villemejane 0:96c89b4dc711 18
villemejane 0:96c89b4dc711 19 #define SAMPLES 512 /* 256 real party and 256 imaginary parts */
villemejane 0:96c89b4dc711 20 #define FFT_SIZE SAMPLES / 2 /* FFT size is always the same size as we have samples, so 256 in our case */
villemejane 0:96c89b4dc711 21
villemejane 0:96c89b4dc711 22 float32_t Input[SAMPLES];
villemejane 0:96c89b4dc711 23 float32_t Output[FFT_SIZE];
villemejane 0:96c89b4dc711 24 bool trig=0;
villemejane 0:96c89b4dc711 25 int indice = 0;
villemejane 0:96c89b4dc711 26
villemejane 0:96c89b4dc711 27 DigitalOut myled(LED1);
villemejane 0:96c89b4dc711 28 AnalogIn myADC(A0);
villemejane 0:96c89b4dc711 29 AnalogOut myDAC(A2);
villemejane 0:96c89b4dc711 30 Serial pc(USBTX, USBRX);
villemejane 0:96c89b4dc711 31 Ticker timer;
villemejane 0:96c89b4dc711 32
villemejane 0:96c89b4dc711 33 void sample(){
villemejane 0:96c89b4dc711 34 myled = 1;
villemejane 0:96c89b4dc711 35 if(indice < SAMPLES){
villemejane 0:96c89b4dc711 36 Input[indice] = myADC.read() - 0.5f; //Real part NB removing DC offset
villemejane 0:96c89b4dc711 37 Input[indice + 1] = 0; //Imaginary Part set to zero
villemejane 0:96c89b4dc711 38 indice += 2;
villemejane 0:96c89b4dc711 39 }
villemejane 0:96c89b4dc711 40 else{ trig = 0; }
villemejane 0:96c89b4dc711 41 myled = 0;
villemejane 0:96c89b4dc711 42 }
villemejane 0:96c89b4dc711 43
villemejane 0:96c89b4dc711 44 int main() {
villemejane 0:96c89b4dc711 45 float maxValue; // Max FFT value is stored here
villemejane 0:96c89b4dc711 46 uint32_t maxIndex; // Index in Output array where max value is
villemejane 0:96c89b4dc711 47
villemejane 0:96c89b4dc711 48 while(1) {
villemejane 0:96c89b4dc711 49 if(trig == 0){
villemejane 0:96c89b4dc711 50 timer.detach();
villemejane 0:96c89b4dc711 51 // Init the Complex FFT module, intFlag = 0, doBitReverse = 1
villemejane 0:96c89b4dc711 52 //NB using predefined arm_cfft_sR_f32_lenXXX, in this case XXX is 256
villemejane 0:96c89b4dc711 53 arm_cfft_f32(&arm_cfft_sR_f32_len256, Input, 0, 1);
villemejane 0:96c89b4dc711 54
villemejane 0:96c89b4dc711 55 // Complex Magniture Module put results into Output(Half size of the Input)
villemejane 0:96c89b4dc711 56 arm_cmplx_mag_f32(Input, Output, FFT_SIZE);
villemejane 0:96c89b4dc711 57 Output[0] = 0;
villemejane 0:96c89b4dc711 58 //Calculates maxValue and returns corresponding value
villemejane 0:96c89b4dc711 59 arm_max_f32(Output, FFT_SIZE/2, &maxValue, &maxIndex);
villemejane 0:96c89b4dc711 60
villemejane 0:96c89b4dc711 61 myDAC=1.0; //SYNC Pulse to DAC Output
villemejane 0:96c89b4dc711 62 wait_us(20); //Used on Oscilliscope set trigger level to the highest
villemejane 0:96c89b4dc711 63 myDAC=0.0; //point on this pulse
villemejane 0:96c89b4dc711 64
villemejane 0:96c89b4dc711 65 for(int i=0; i < FFT_SIZE / 2; i++){
villemejane 0:96c89b4dc711 66 myDAC=(Output[i]) * 0.9; // Scale to Max Value and scale to 90 / 100
villemejane 0:96c89b4dc711 67 wait_us(10); //Each pulse of 10us is 50KHz/256 = 195Hz resolution
villemejane 0:96c89b4dc711 68 }
villemejane 0:96c89b4dc711 69 myDAC=0.0;
villemejane 0:96c89b4dc711 70 pc.printf("MAX = %lf, %d \r\n", maxValue, maxIndex);
villemejane 0:96c89b4dc711 71 wait(0.2);
villemejane 0:96c89b4dc711 72 trig = 1;
villemejane 0:96c89b4dc711 73 indice = 0;
villemejane 0:96c89b4dc711 74 timer.attach_us(&sample,40); //20us 50KHz sampling rate
villemejane 0:96c89b4dc711 75 }
villemejane 0:96c89b4dc711 76 }
villemejane 0:96c89b4dc711 77 }