Example Audio Spectrum Analyzer

Dependencies:   mbed FFT

Committer:
Suky
Date:
Fri Feb 11 00:37:57 2011 +0000
Revision:
0:74f5a741c618

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }