DMX512 interface - LEnsE / VILLEMEJANE

Dependencies:   mbed mbed-dsp

Committer:
villemejane
Date:
Tue Dec 08 12:10:01 2020 +0000
Revision:
0:96c89b4dc711
Child:
1:76fbb91a0331
Calcul de FFT sur 256 points

Who changed what in which revision?

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