Ale C.-
/
FFT_Example
Example Audio Spectrum Analyzer
main.cpp@0:74f5a741c618, 2011-02-11 (annotated)
- Committer:
- Suky
- Date:
- Fri Feb 11 00:37:57 2011 +0000
- Revision:
- 0:74f5a741c618
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Suky | 0:74f5a741c618 | 1 | // Nothing special, an example for using the library of FFT, Audio Spectrum Analyzer with LCD |
Suky | 0:74f5a741c618 | 2 | #include "mbed.h" |
Suky | 0:74f5a741c618 | 3 | #include "FFT.h" |
Suky | 0:74f5a741c618 | 4 | #include "LCD_Serial.h" |
Suky | 0:74f5a741c618 | 5 | // ********************************************************************************************** |
Suky | 0:74f5a741c618 | 6 | #define N 32 |
Suky | 0:74f5a741c618 | 7 | float Data[N*2]; |
Suky | 0:74f5a741c618 | 8 | unsigned char PowerInt[N/2]; |
Suky | 0:74f5a741c618 | 9 | volatile int kbhit; |
Suky | 0:74f5a741c618 | 10 | float Average; |
Suky | 0:74f5a741c618 | 11 | |
Suky | 0:74f5a741c618 | 12 | AnalogIn ChannelR(p16); |
Suky | 0:74f5a741c618 | 13 | AnalogIn ChannelL(p17); |
Suky | 0:74f5a741c618 | 14 | AnalogIn ChannelC(p18); |
Suky | 0:74f5a741c618 | 15 | LCDSerial myLcd(p21,p22,p23,p24); // Data, Clock, Enable, Back |
Suky | 0:74f5a741c618 | 16 | // ********************************************************************************************** |
Suky | 0:74f5a741c618 | 17 | void vUpdateDataAnalogs(float Analogs[]); |
Suky | 0:74f5a741c618 | 18 | void vGraphicDisplay(unsigned char *Data); |
Suky | 0:74f5a741c618 | 19 | // ********************************************************************************************** |
Suky | 0:74f5a741c618 | 20 | int main() { |
Suky | 0:74f5a741c618 | 21 | myLcd.vSetBacklight(1); |
Suky | 0:74f5a741c618 | 22 | myLcd.printf("\f FFT with mbed!!!"); |
Suky | 0:74f5a741c618 | 23 | wait(2.0); |
Suky | 0:74f5a741c618 | 24 | myLcd.printf("\f"); |
Suky | 0:74f5a741c618 | 25 | |
Suky | 0:74f5a741c618 | 26 | Average=0; |
Suky | 0:74f5a741c618 | 27 | for(int k=0;k<64;k++){ |
Suky | 0:74f5a741c618 | 28 | Average+=ChannelC.read_u16(); |
Suky | 0:74f5a741c618 | 29 | wait_us(100); |
Suky | 0:74f5a741c618 | 30 | } |
Suky | 0:74f5a741c618 | 31 | Average/=64; |
Suky | 0:74f5a741c618 | 32 | |
Suky | 0:74f5a741c618 | 33 | while(1){ |
Suky | 0:74f5a741c618 | 34 | vUpdateDataAnalogs(Data); |
Suky | 0:74f5a741c618 | 35 | vFFT(Data-1,N); |
Suky | 0:74f5a741c618 | 36 | vCalPowerInt(Data,PowerInt,N/2); |
Suky | 0:74f5a741c618 | 37 | vGraphicDisplay(PowerInt); |
Suky | 0:74f5a741c618 | 38 | wait_ms(30); |
Suky | 0:74f5a741c618 | 39 | } |
Suky | 0:74f5a741c618 | 40 | } |
Suky | 0:74f5a741c618 | 41 | // ********************************************************************************************** |
Suky | 0:74f5a741c618 | 42 | void vUpdate(void){ |
Suky | 0:74f5a741c618 | 43 | kbhit=1; |
Suky | 0:74f5a741c618 | 44 | } |
Suky | 0:74f5a741c618 | 45 | void vUpdateDataAnalogs(float Analogs[]){ |
Suky | 0:74f5a741c618 | 46 | unsigned short TempReadR[32],TempReadL[32]; |
Suky | 0:74f5a741c618 | 47 | Ticker Period; |
Suky | 0:74f5a741c618 | 48 | |
Suky | 0:74f5a741c618 | 49 | kbhit=0; |
Suky | 0:74f5a741c618 | 50 | Period.attach_us(&vUpdate,25); // 25 us, 40.000 Hz |
Suky | 0:74f5a741c618 | 51 | for(int k=0;k<32;k++){ |
Suky | 0:74f5a741c618 | 52 | while(kbhit==0); |
Suky | 0:74f5a741c618 | 53 | kbhit=0; |
Suky | 0:74f5a741c618 | 54 | TempReadR[k]=ChannelR.read_u16(); |
Suky | 0:74f5a741c618 | 55 | } |
Suky | 0:74f5a741c618 | 56 | for(int k=0;k<32;k++){ |
Suky | 0:74f5a741c618 | 57 | while(kbhit==0); |
Suky | 0:74f5a741c618 | 58 | kbhit=0; |
Suky | 0:74f5a741c618 | 59 | TempReadL[k]=ChannelL.read_u16(); |
Suky | 0:74f5a741c618 | 60 | } |
Suky | 0:74f5a741c618 | 61 | Period.detach(); |
Suky | 0:74f5a741c618 | 62 | for(int k=0,j=0;k<32;k++,j++){ |
Suky | 0:74f5a741c618 | 63 | Analogs[j]=(TempReadR[k]+TempReadL[k])/2; // Promedio (x1[n]+x2[n]=X1[k]+X2[k]) |
Suky | 0:74f5a741c618 | 64 | Analogs[j]=((float)(Analogs[j]-Average)/10); // Desplazo y aplico escala.- |
Suky | 0:74f5a741c618 | 65 | Analogs[++j]=0; |
Suky | 0:74f5a741c618 | 66 | } |
Suky | 0:74f5a741c618 | 67 | return; |
Suky | 0:74f5a741c618 | 68 | } |
Suky | 0:74f5a741c618 | 69 | // ********************************************************************************************** |
Suky | 0:74f5a741c618 | 70 | void vGraphicDisplay(unsigned char *Data){ |
Suky | 0:74f5a741c618 | 71 | unsigned char k; |
Suky | 0:74f5a741c618 | 72 | |
Suky | 0:74f5a741c618 | 73 | myLcd.vGotoxy(3,1); |
Suky | 0:74f5a741c618 | 74 | for(k=0;k<16;k++,Data++){ |
Suky | 0:74f5a741c618 | 75 | if(*Data>192){myLcd.vPutc((*Data-193)/8);}else{myLcd.vPutc(' ');} |
Suky | 0:74f5a741c618 | 76 | } |
Suky | 0:74f5a741c618 | 77 | myLcd.vGotoxy(3,2); |
Suky | 0:74f5a741c618 | 78 | Data-=16; |
Suky | 0:74f5a741c618 | 79 | for(k=0;k<16;k++,Data++){ |
Suky | 0:74f5a741c618 | 80 | if((*Data>128)&&(*Data<193)){myLcd.vPutc((*Data-129)/8);}else if(*Data>192){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} |
Suky | 0:74f5a741c618 | 81 | } |
Suky | 0:74f5a741c618 | 82 | myLcd.vGotoxy(3,3); |
Suky | 0:74f5a741c618 | 83 | Data-=16; |
Suky | 0:74f5a741c618 | 84 | for(k=0;k<16;k++,Data++){ |
Suky | 0:74f5a741c618 | 85 | if((*Data>64)&&(*Data<129)){myLcd.vPutc((*Data-65)/8);}else if(*Data>128){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} |
Suky | 0:74f5a741c618 | 86 | } |
Suky | 0:74f5a741c618 | 87 | myLcd.vGotoxy(3,4); |
Suky | 0:74f5a741c618 | 88 | Data-=16; |
Suky | 0:74f5a741c618 | 89 | for(k=0;k<16;k++,Data++){ |
Suky | 0:74f5a741c618 | 90 | if((*Data>0)&&(*Data<65)){myLcd.vPutc((*Data-1)/8);}else if(*Data>64){myLcd.vPutc(0x07);}else{myLcd.vPutc(' ');} |
Suky | 0:74f5a741c618 | 91 | } |
Suky | 0:74f5a741c618 | 92 | |
Suky | 0:74f5a741c618 | 93 | } |