analyse audio input

Dependencies:   PololuLedStrip mbed

main.cpp

Committer:
KongXiangyue
Date:
2014-08-07
Revision:
0:bd2ecb743ed5

File content as of revision 0:bd2ecb743ed5:

#include "mbed.h"
#include "PololuLedStrip.h"

extern "C" void fftR4(short *y, short *x, int N);

//***************Global Varity***************************
#define BUF_LEN 1024
#define SAMP_FREQ 48000
#define LED_COUNT 60
short samples[BUF_LEN];// store values from ADC
short mx[BUF_LEN*2];// input data i6bit 4 byte aligned x0r,xoi,x1r,x1i,....
short my[BUF_LEN*2];// output data 16bit 4byte aligned y0r,y0i, y1r,y1i,....
float spectrum[BUF_LEN/2]; // frequency spectrum 
float max1 = 0.0;
    float max2 = 0.0;
    float max3 = 0.0;
    float max4 = 0.0;
    float max5 = 0.0;
    int j1 = 0;
    int j2 = 0;
    int j3 = 0;
    int j4 = 0;
    int j5 = 0;
    int j11=0;
    int j22=0;
    int j33=0;
    int j44=0;
    int j55=0;
rgb_color colors[LED_COUNT];
//--------------End of Global Varity---------------------



//************** Port Configuration *********************
AnalogIn audio(p20);  // ADC pin must be biased at Vcc/2 using coupling capacitor and potential divider
BusOut leds (LED1,LED2,LED3,LED4);
PololuLedStrip ledStrip(p8);


//*** Debug***
Serial serial(USBTX,USBRX); //Real time debug USB port 
LocalFileSystem local("local");     // Create the local filesystem under the name "local"

//----------------- End of Port Configuration------------


// **************SubFunctions Define *******************
void initLED();
void updateSamples();
float magnitude (short y1, short y2);
void doFFT();
void ledBarGraph();
void calcPeakFrequency ();
void runLED();

//--------------- END of Sub Define---------------------


int main()
{
    leds = 15;
    wait (1.0);
    leds =0;
    initLED();
    
    while(1) {
        ledBarGraph();
        updateSamples();
        doFFT();
        calcPeakFrequency ();
        runLED();
        
        }// End while
    

        
}// End main

//********************SubFunction Implementation****************

void initLED(){
     for (int i = 0; i < 60; i++){
            colors[i] = (rgb_color){ 2,200,2  };
            }   
    
    ledStrip.write(colors, LED_COUNT);
    
    wait(1);
    for (int i = 0; i < 60; i++){
            colors[i] = (rgb_color){ 0,0,0 };
            }   
    
    ledStrip.write(colors, LED_COUNT);
    
    }







//--------------------------------------
void updateSamples (){
    
    for (int i=0; i< BUF_LEN; i++){
        samples[i]= (short) (audio.read_u16() - 0x8000);
        wait_us(1e6/SAMP_FREQ);
        
        }//End for
    
    }// End updateSamples
    
void doFFT(){
    //clear buffers 
    for (int i=0; i<BUF_LEN*2; i++){
        mx[i]=0;
        my[i]=0;
        }// end for
        
    for (int i =0; i<BUF_LEN;i++){
        mx[i*2]=samples[i];
        }// end for
        
        fftR4(my,mx,BUF_LEN); // call FFT routine 
        
        int j=0;// counter number of next for loop
    
    for (int i= 0;i< BUF_LEN; i+=2 ){
        spectrum[j]= magnitude (my[i],my[i+i]); // get magnitude of FFT output to get spectrum data
        j++;
        }
    
    }// End doFFT
    
 //---------------------------   
float magnitude (short y1, short y2){
    
     return sqrt(float (y1*y1+y2*y2));
    }
    
   //------------------------------------------ 
void calcPeakFrequency (){
    float max = 0.0;
    
    int frequency = 0;
    int j = 0;
     max1 = 0.0;
     max2 = 0.0;
     max3 = 0.0;
     max4 = 0.0;
     max5 = 0.0;
     j1 = 0;
     j2 = 0;
     j3 = 0;
     j4 = 0;
     j5 = 0;
    
    
    for (int i=0; i<BUF_LEN; i+=2) {  // loop through spectrum and look for maximum value
        if (spectrum[j] > max) {
            max = spectrum[j];
            frequency = int(SAMP_FREQ/BUF_LEN/2*i);
        }
        j++;
    }
    
    for (int i=0; i<101; i+=2) {  
        if (spectrum[j1] > max1) {
            max1 = spectrum[j1];
            j11=j1;
        }
        j1++;
    }
   
   for (int i=102; i<204; i+=2) {  
        if (spectrum[j2] > max2) {
            max2 = spectrum[j2];
            j22=j2;
        }
        j2++;
    }
    
    for (int i=205; i<306; i+=2) {  
        if (spectrum[j3] > max3) {
            max3 = spectrum[j3];
            j33=j3;
        }
        j3++;
    }
    
    for (int i=307; i<408; i+=2) {  
        if (spectrum[j4] > max4) {
            max4 = spectrum[j4];
            j44=j4;
        }
        j4++;
    }
    
    for (int i=408; i<511; i+=2) {  
        if (spectrum[j5] > max5) {
            max5 = spectrum[j5];
            j55=j5;
        }
        j5++;
    }
    serial.printf("frq=%d\n",frequency);
    //serial.printf("j11-j55 = %d,%d,%d,%d,%d\n",j11,j22,j33,j44,j55);
    
    }//End calcPeakFrequency 
 //-------------------------------------------------   
    void ledBarGraph()
{
    float rms = 0.0;  // initialse array
    for (int i = 0; i < BUF_LEN; i++) {
        rms+= samples[i]*samples[i];
    }
    // calc the sum of the squares
 
    rms/=BUF_LEN;     // get the mean
    rms = sqrt(rms);  // and root to get the RMS
    rms/= 16384.0;  // scale according to 16-bit signed maximum value
 
    // check value and update LEDs to show amplitude
    if (rms > 0.8) {
        leds = 15;
    } else if (rms > 0.6) {
        leds = 7;
    } else if (rms > 0.4) {
        leds = 3;
    } else if (rms > 0.2) {
        leds = 1;
    } else {
        leds = 0;
    }
 
    //serial.printf("RMS = %f\n",rms);
}//End void ledBarGraph

//-------------------------------------------



void runLED(){
    // clear the ledStrip
    for (int i = 0; i < LED_COUNT; i++){
        colors[i] = (rgb_color){ 0, 0, 0 };  
        } 
        
        //if ((maxFreq)>60) maxFreq=60; // Limiting Length
        
        // max1
         for (int i = 0; i < (j11/10); i++){
            colors[i] = (rgb_color){ 200,2,2  };
            }  
        
        //max2
        for (int i = 21; i > (j22/10); i--){
            colors[i] = (rgb_color){ 2,200,2  };
            }   
        
        //max3
        for (int i = 24; i < (j33/10); i++){
            colors[i] = (rgb_color){ 2,200,200  };
        }
        //max4
        for (int i = 45; i > (j44/10); i--){
            colors[i] = (rgb_color){ 100,2,200  };
        }
        //max5
        for (int i = 48; i < (j55/10); i++){
            colors[i] = (rgb_color){ 200,2,200  };
          }  
             
             ledStrip.write(colors, LED_COUNT);
    }






/*void runLED(){
    // clear the ledStrip
    for (int i = 0; i < LED_COUNT; i++){
        colors[i] = (rgb_color){ 0, 0, 0 };  
        } 
        
        //if ((maxFreq)>60) maxFreq=60; // Limiting Length
        
        // max1
         for (int i = 0; i < 9; i++){
            colors[i] = (rgb_color){ 200,2,2  };
            }  
        
        //max2
        for (int i = 21; i > 12; i--){
            colors[i] = (rgb_color){ 2,200,2  };
            }   
        
        //max3
        for (int i = 24; i < 33; i++){
            colors[i] = (rgb_color){ 2,200,200  };
        }
        //max4
        for (int i = 45; i > 36; i--){
            colors[i] = (rgb_color){ 100,2,200  };
        }
        //max5
        for (int i = 48; i < 57; i++){
            colors[i] = (rgb_color){ 200,2,200  };
          }  
             
             ledStrip.write(colors, LED_COUNT);
    }*/

/*void runLED(){
    // clear the ledStrip
    for (int i = 0; i < LED_COUNT; i++){
        colors[i] = (rgb_color){ 0, 0, 0 };  
        } 
        
        //if ((maxFreq)>60) maxFreq=60; // Limiting Length
        
        // max1
         for (int i = 0; i < (j11/10); i++){
            colors[i] = (rgb_color){ 200,2,2  };
            }  
        
        //max2
        for (int i = 21; i < (21-((j22-101)/10)); i--){
            colors[i] = (rgb_color){ 2,200,2  };
            }   
        
        //max3
        for (int i = 24; i < (24+((j33-204)/10)); i++){
            colors[i] = (rgb_color){ 2,200,200  };
        }
        //max4
        for (int i = 45; i < (45-((j44-306)/10)); i--){
            colors[i] = (rgb_color){ 100,2,200  };
        }
        //max5
        for (int i = 48; i < (48+((j55-408)/10)); i++){
            colors[i] = (rgb_color){ 200,2,200  };
          }  
             
             ledStrip.write(colors, LED_COUNT);
    }*/