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)
}