analyse audio input
Dependencies: PololuLedStrip mbed
Diff: main.cpp
- Revision:
- 0:bd2ecb743ed5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Aug 07 14:24:47 2014 +0000 @@ -0,0 +1,349 @@ +#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); + }*/