Ale C.-
/
FFT_Example
Example Audio Spectrum Analyzer
Diff: main.cpp
- Revision:
- 0:74f5a741c618
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 11 00:37:57 2011 +0000 @@ -0,0 +1,93 @@ +// Nothing special, an example for using the library of FFT, Audio Spectrum Analyzer with LCD +#include "mbed.h" +#include "FFT.h" +#include "LCD_Serial.h" +// ********************************************************************************************** +#define N 32 +float Data[N*2]; +unsigned char PowerInt[N/2]; +volatile int kbhit; +float Average; + +AnalogIn ChannelR(p16); +AnalogIn ChannelL(p17); +AnalogIn ChannelC(p18); +LCDSerial myLcd(p21,p22,p23,p24); // Data, Clock, Enable, Back +// ********************************************************************************************** +void vUpdateDataAnalogs(float Analogs[]); +void vGraphicDisplay(unsigned char *Data); +// ********************************************************************************************** +int main() { + myLcd.vSetBacklight(1); + myLcd.printf("\f FFT with mbed!!!"); + wait(2.0); + myLcd.printf("\f"); + + Average=0; + for(int k=0;k<64;k++){ + Average+=ChannelC.read_u16(); + wait_us(100); + } + Average/=64; + + while(1){ + vUpdateDataAnalogs(Data); + vFFT(Data-1,N); + vCalPowerInt(Data,PowerInt,N/2); + vGraphicDisplay(PowerInt); + wait_ms(30); + } +} +// ********************************************************************************************** +void vUpdate(void){ + kbhit=1; +} +void vUpdateDataAnalogs(float Analogs[]){ + unsigned short TempReadR[32],TempReadL[32]; + Ticker Period; + + kbhit=0; + Period.attach_us(&vUpdate,25); // 25 us, 40.000 Hz + for(int k=0;k<32;k++){ + while(kbhit==0); + kbhit=0; + TempReadR[k]=ChannelR.read_u16(); + } + for(int k=0;k<32;k++){ + while(kbhit==0); + kbhit=0; + TempReadL[k]=ChannelL.read_u16(); + } + Period.detach(); + for(int k=0,j=0;k<32;k++,j++){ + Analogs[j]=(TempReadR[k]+TempReadL[k])/2; // Promedio (x1[n]+x2[n]=X1[k]+X2[k]) + Analogs[j]=((float)(Analogs[j]-Average)/10); // Desplazo y aplico escala.- + Analogs[++j]=0; + } + return; +} +// ********************************************************************************************** +void vGraphicDisplay(unsigned char *Data){ + unsigned char k; + + myLcd.vGotoxy(3,1); + for(k=0;k<16;k++,Data++){ + if(*Data>192){myLcd.vPutc((*Data-193)/8);}else{myLcd.vPutc(' ');} + } + myLcd.vGotoxy(3,2); + Data-=16; + for(k=0;k<16;k++,Data++){ + if((*Data>128)&&(*Data<193)){myLcd.vPutc((*Data-129)/8);}else if(*Data>192){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} + } + myLcd.vGotoxy(3,3); + Data-=16; + for(k=0;k<16;k++,Data++){ + if((*Data>64)&&(*Data<129)){myLcd.vPutc((*Data-65)/8);}else if(*Data>128){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} + } + myLcd.vGotoxy(3,4); + Data-=16; + for(k=0;k<16;k++,Data++){ + if((*Data>0)&&(*Data<65)){myLcd.vPutc((*Data-1)/8);}else if(*Data>64){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} + } + + } \ No newline at end of file