Team Riedel - display
Dependencies: LCD_fonts SPI_TFT_ILI9341 CMSIS_DSP_401_without_cm4 mbed-src SDFileSystem wavfile
Diff: audio_record.cpp
- Revision:
- 9:5a860b9c8a6a
- Child:
- 10:0986108f8aa3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/audio_record.cpp Sun Dec 13 16:46:14 2015 +0000 @@ -0,0 +1,124 @@ + +#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); + +// while (EXIT != SET) +// { +// if (!(counter%1000000)) pc.printf("%d\t%d\t%d\t%d\t%d\t%d\r\n", getDMAState(), getSPIState(), getSPIFlagStatus(SPI_SR_RXNE), getSPIFlagStatus(SPI_SR_BSY), getSPIFlagStatus(SPI_SR_CRCERR), getSPIFlagStatus(SPI_SR_OVR)); +// if (counter==10000000) //Approximately 3 seconds of record time +// { +// EXIT=1; +// } +// else +// { +// counter=counter++; +// } +// } + /* Stop audio input */ + Audio_Stop(); + pc.printf("Audio recording processed successfully!\r\n"); + //myled = 0; + WriteData(RECORDBUFF); + + 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