Audio Demo with DISCO Board, takes control samples, waits for user input, samples regularly.
Dependencies: CMSIS_DSP_401 STM32L4xx_HAL_Driver mbed-src_DISO_AUDIO_DEMO
Diff: audio_record.cpp
- Revision:
- 0:3eee9435dd17
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/audio_record.cpp Sun Dec 13 19:12:11 2015 +0000 @@ -0,0 +1,123 @@ + +#include "main.h" +#include "stm32l476g_discovery_audio.h" + +//GLOBAL VARIABLES +float32_t POWER[1024]; +float32_t PHS[1024]; +float32_t PWRMSE; +float32_t PHSMSE; +uint32_t n; //Generic variable for "for" loops +float32_t CONTROLPWR[1024]; //CONTROL 0 PWR +float32_t CONTROLPHS[1024]; //CTONROL 0 PHS +float32_t CONTROLPWRMSE;//CONTROL PWR MSE +float32_t CONTROLPHSMSE;//CONTROL PHS MSE + + +void RECORD(void) +{ + uint32_t counter=0; + int EXIT=0; //WHILE LOOP EXIT FLAG +// uint16_t PDMBUFF[1536]; + uint16_t RECORDBUFF[2048]; + float32_t FLOATBUFF[4096]; + const arm_cfft_instance_f32 *S=&arm_cfft_sR_f32_len2048; + + /* Initialize audio input */ + pc.printf("\r\n"); + pc.printf("Initializing Audio...\r\n"); + if(Audio_Init()!= AUDIO_OK) + { + pc.printf("FAILED to initialize audio...\r\n"); + } + pc.printf("Initialization completed successfully.\r\n"); + + /* Start the audio record */ + + if (Audio_Record(RECORDBUFF) != AUDIO_OK) + { + pc.printf("FAILED to begin recording...\r\n"); + } + +// pc.printf("DMA\tSPI\tRXNE\tBSY\tCRCERR\tOVR\r\n"); + + /* PCM samples recording loop */ +// RecordBufferOffset = BUFFER_OFFSET_NONE; +// while (RecordBufferOffset != BUFFER_OFFSET_FULL); + pc.printf("hi"); + while (EXIT != SET) + { + if (counter==1000000) //Approximately 3 seconds of record time + { + EXIT=1; + } + else + { + counter=counter++; + } + } + pc.printf("hey"); + /* Stop audio input */ + Audio_Stop(); + pc.printf("Audio recording processed successfully!\r\n"); + myled = 0; + + for(n=0;n<2048;n++) + { + FLOATBUFF[n*2] = (float)RECORDBUFF[n]; + FLOATBUFF[(n*2)+1] = 0.0; + } + arm_cfft_f32(S, FLOATBUFF, 0,0); //Output of FFT is half the record buffer size + + for(n=0;n<1024;n++) + {PHS[n]=atan2(FLOATBUFF[(n*2)+1],FLOATBUFF[n*2]);}//Calculates control phase + for(n=0;n<1024;n++) + { + POWER[n]=sqrt((FLOATBUFF[(n*2)+1]*FLOATBUFF[(n*2)+1])+(FLOATBUFF[n*2]*FLOATBUFF[n*2])); + } //calculates control power +} + +void MSE(void) +{ + float32_t compare[1024]; //BUFFER VARIABLE FOR MSE FUNCTIONS + //MEAN SQUARED ERROR FOR SAMPLE MAGNITUDES + PWRMSE=0; + for(n=0;n<1024;n++) + {compare[n]=(CONTROLPWR[n]-POWER[n])*(CONTROLPWR[n]-POWER[n]);} //Error between FFT magnitudes, stored in compare + for(n=0;n<1024;n++) + {PWRMSE=PWRMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE + PWRMSE=PWRMSE/1024.0f; + //MEAN SQUARED ERROR FOR SAMPLE PHASE + PHSMSE=0; + for(n=0;n<1024;n++) + {compare[n]=(CONTROLPHS[n]-PHS[n])*(CONTROLPHS[n]-PHS[n]);} //Error between FFT magnitudes, stored in compare + for(n=0;n<1024;n++) + {PHSMSE=PHSMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE + PHSMSE=PHSMSE/1024.0f; +} + +void COMPARE(void) +{ + float32_t TEST[4]; + TEST[0]=001; //LOW END OF ACCEPTED TOLERANCE RANGE + TEST[1]=20; //HIGH END OF ACCEPTED TOLERANCE RANGE + TEST[2]=(PWRMSE/CONTROLPWRMSE); //The ratio of sample MSE and control MSE + TEST[3]=(PHSMSE/CONTROLPHSMSE); + + //COMPARISON + //if(SAMPLEPHASEMSE>(10*PHSCONTROLMSE)) + //{ + //SEND ERROR MESSAGE + //CREATE EVENT + //} + if(TEST[2]>TEST[0])//MODEM FUNCTIONS + { + //SEND ERROR MESSAGE + //CREATE EVENT + } + if(TEST[2] < TEST[1]) + { + //SEND ERROR MESSAGE + //CREATE EVENT + } +} \ No newline at end of file