Change the Ledstrip with Different input signal frequency

Dependencies:   PololuLedStrip mbed

main.cpp

Committer:
KongXiangyue
Date:
2014-07-28
Revision:
0:dc6175686e56

File content as of revision 0:dc6175686e56:

#define SAMPLE_RATE   48000


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

PololuLedStrip ledStrip(p8);

#define LED_COUNT 60
rgb_color colors[LED_COUNT];

Serial pc(USBTX,USBRX);

//extern "C" void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin);
extern "C" void fftR4(short *y, short *x, int N);

//use the LED as a bargraph
DigitalOut l1(LED1);
DigitalOut l2(LED2);
DigitalOut l3(LED3);
DigitalOut l4(LED4);

//set up a timer for timing FFT's
Timer timer;

//Used to change colour of LED strips
//int testX = 0;

//Set up filesystem so we can write some useful files

LocalFileSystem local("local");              
FILE *fp;

//Set up a global buffer for audio data so interrupt can access it
int Counter = 0;
int16_t Buffer[5000];
int16_t VoltageBuffer[5000];

//Initialise ADC to maximum SAMPLE_RATE and cclk divide set to 1
ADC adc(SAMPLE_RATE, 1);

int colourVoltage=0;



//Our interrupt handler for audio sampling
void sample_ADC(int chan, uint32_t value) {
    
   float s;
   s = adc.read(p20); 
   int16_t b = (s -2048)*16;
   Buffer[Counter] = b;
   
   Counter += 1;
    /* bar graph */
     
    int g = abs(s-2048);
    l1 = g > 0.1f*2048;
    l2 = g > 0.3f*2048;
    l3 = g > 0.6f*2048;
    l4 = g > 0.8f*2048;
}


    
    
    
    
int main() {
    
while (1){
    
    //Prepare for burst mode on all ADC pins and set up interrupt handler (using ADC library from Simon Blandford
    adc.append(sample_ADC);
    adc.startmode(0,0);
    adc.burst(1);
    adc.setup(p20,1);
    //introduce a delay as initial waveform has bias whilst decoupling cap charges
    wait(0.05);
    //start the interrupt and wait for about 4096 samples
    adc.interrupt_state(p20,1);
    wait(0.05);
    
        //Finsh up - Unset pin 20
        adc.interrupt_state(p20,0);
        adc.setup(p20,0);
        int actual_rate = adc.actual_sample_rate();
//now lets try mellen fft-------------------------
        timer.reset();
        timer.start();
        #define MN 1024 /*Number of points*/
        short mx[MN*2]; // input data 16 bit, 4 byte aligned  x0r,x0i,x1r,x1i,....
        short my[MN*2]; // output data 16 bit,4 byte aligned  y0r,y0i,y1r,y1i,....
        float mz[MN*2]; // to store the final result
        for (int i=0;i<MN*2;i++) mx[i]=0;
        for (int i=0;i<MN*2;i++) mz[i]=0;
        for (int i=0;i<MN;i=i+1)
            { mx[i*2]=Buffer[i];}
        //printf("Mellen set up took %i\n",timer.read_us());
        //call functions
        timer.reset();
        timer.start();
        fftR4(my, mx, MN);
        //printf("Mellen fft took %i\n",timer.read_us());
//FILE* mlog = fopen("/local/mellen.csv","w");
        
        //now write a CSV file to filesytem of frequency vs amplitude
        for (int i=0; i<MN; i=i+2)
        {
          //  fprintf(mlog, "%d: %d -> %d\n", i, mx[i], my[i]);
            //fprintf(mlog, "%d,%f\n", int(actual_rate/MN/2*i),sqrt(float(   (my[i]*my[i])  +(my[i+1]*my[i+1])     ) )   );          
        
        mz[i]=sqrt(float(   (my[i]*my[i])  +(my[i+1]*my[i+1])     ) ) ;
         //fprintf(mlog, "%f\n", mz[i]  );
        }
       
        
        // detect the change of input frequency ******************************
    float maxFreq=0;
    float max=0;
    for (int i=2;i<512;i=i+1){
           
        if(mz[i]>max){
            max = mz[i];
            maxFreq=i;
            }//end if
        
        }//end for
    //fprintf(mlog, "%d\n",maxFreq  );
    
    int maxVoltage=0;
    for (int i=0;i<512;i=i+1){
           
        if(mx[i]>maxVoltage){
            maxVoltage = mx[i];
           
            }//end if
        }//end for
    
pc.printf(" the max = %f\n",max );
pc.printf(" the maxFreq = %f\n",maxFreq );
pc.printf(" the colourValtage = %d\n", maxVoltage );


        /*for (int i = 0; i < LED_COUNT; i++){
        colors[i] = (rgb_color){ 0, 0, 0 };  
        } 
        
        if (maxFreq>60) maxFreq=60; // Limiting Length
        
         for (int i = 0; i < maxFreq; i++){
            colors[i] = (rgb_color){ abs(maxVoltage/11),abs(255-(maxVoltage/11)) ,abs(255-(maxVoltage/11)+50)  };
            }   
             ledStrip.write(colors, LED_COUNT);*/
            int actualFreq= (actual_rate/MN/2*maxFreq);
            pc.printf(" actualFreq = %d\n", actualFreq );
            
            
            //wait_ms(10);
            
            /*if (maxFreq>30){
            //testX=200;
            for (int i = 0; i < LED_COUNT; i++){
            colors[i] = (rgb_color){ 0, 20, 200 };
            }
            }

        if ((maxFreq>22)&&(maxFreq<30)){// if frequency bigger than 966Hz
            //testX= 10;
            for (int i = 0; i < LED_COUNT; i++){
            colors[i] = (rgb_color){ 250, 0, 0 };
            
            }
            }
        if (maxFreq<22){
            //testX=200;
            for (int i = 0; i < LED_COUNT; i++){
            colors[i] = (rgb_color){ 0, 250, 0 };
            }
            }*/

    
     
       
        
            
            
            //-----------
        
        
        //fclose(mlog);    
  Counter = 0;
        }// end while (1)
        
    
}