Team Riedel - display

Dependencies:   LCD_fonts SPI_TFT_ILI9341 CMSIS_DSP_401_without_cm4 mbed-src SDFileSystem wavfile

audio_record.cpp

Committer:
linx0576
Date:
2015-12-14
Revision:
13:ab0285338951
Parent:
10:0986108f8aa3

File content as of revision 13:ab0285338951:


#include "main.h"
#include "stm32l476g_discovery_audio.h"
//
#include "SPI_TFT_ILI9341.h"
#include <math.h>
#include "stdio.h"
#include "mbed.h"
#include "string"
#include "Arial12x12.h"
#include "Arial24x23.h"
#include "arm_math.h" 
#include "SDFileSystem.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
extern SPI_TFT_ILI9341 TFT;

                                                        
void RECORD(void)
{
    int row =0;
    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)
        {
        TFT.locate(10,row); TFT.printf("FAILED to initialize audio...\r\n"); row+=20; 
        //pc.printf("FAILED to initialize audio...\r\n");
        }
    //pc.printf("Initialization completed successfully.\r\n");
    else 
    {TFT.locate(10,row); TFT.printf("Initialization completed successfully.\r\n"); row+=20;}
  /* Start the audio record */

        if (Audio_Record(RECORDBUFF) != AUDIO_OK)
            {
                TFT.locate(10,row); TFT.printf("FAILED to begin recording...\r\n"); row+=20;
//                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();
    TFT.locate(10,row); TFT.printf("Audio recording processed successfully!\r\n"); row+=20;
//    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
                        }
}