A Graphic Equaliser using 2 Analog inputs and an Fast Fourier Transform

Dependencies:   mbed

Committer:
User_4574
Date:
Thu Mar 18 15:15:33 2010 +0000
Revision:
0:b771a5301e43

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
User_4574 0:b771a5301e43 1 /*
User_4574 0:b771a5301e43 2 * This is my code. It takes 16 samples of the analog in pins and writes the values back to the serial port.
User_4574 0:b771a5301e43 3 * Nathan Lasseter 2010
User_4574 0:b771a5301e43 4 */
User_4574 0:b771a5301e43 5
User_4574 0:b771a5301e43 6 #include "mbed.h"
User_4574 0:b771a5301e43 7 #include "TextLCD.h"
User_4574 0:b771a5301e43 8
User_4574 0:b771a5301e43 9 extern void fft(float inarr[16], float outarr[16]); //look for fft at link not compile time
User_4574 0:b771a5301e43 10
User_4574 0:b771a5301e43 11 //Serial pc(USBTX,USBRX); ///dev/ttyACM0 is locked on university pc's
User_4574 0:b771a5301e43 12 Serial pc(p9,p10); //So I use /dev/ttyS0 instead
User_4574 0:b771a5301e43 13 BusOut bargraph(p21,p22,p23,p24,p25,p26,p27,p28,p29,p30); //Dot matrix bargraphs horizontal bus
User_4574 0:b771a5301e43 14 BusOut graphs(p11,p12,p13,p14,p15,p16,p17,p18); //Dot matrix bargraphs vertical bus
User_4574 0:b771a5301e43 15 AnalogIn left(p19); //Left channel input
User_4574 0:b771a5301e43 16 AnalogIn right(p20); //Right channel input
User_4574 0:b771a5301e43 17
User_4574 0:b771a5301e43 18 void outputmatrix(float avg, int which) { //This is the simple dot matrix driver.
User_4574 0:b771a5301e43 19 switch (which) { //Select a bargraph
User_4574 0:b771a5301e43 20 case 8: graphs = 0xFF; //8: off
User_4574 0:b771a5301e43 21 case 0: graphs = 0xFE; //0-7 are right to left. They turn on a bargraph by going low.
User_4574 0:b771a5301e43 22 case 1: graphs = 0xFC;
User_4574 0:b771a5301e43 23 case 2: graphs = 0xF8;
User_4574 0:b771a5301e43 24 case 3: graphs = 0xF0;
User_4574 0:b771a5301e43 25 case 4: graphs = 0xE0;
User_4574 0:b771a5301e43 26 case 5: graphs = 0xC0;
User_4574 0:b771a5301e43 27 case 6: graphs = 0x80;
User_4574 0:b771a5301e43 28 case 7: graphs = 0x00;
User_4574 0:b771a5301e43 29 }
User_4574 0:b771a5301e43 30 if (avg > 0.9) { bargraph=0x3FF; return; } //Same principle, but set a value on the graph.
User_4574 0:b771a5301e43 31 if (avg > 0.8) { bargraph=0x1FF; return; }
User_4574 0:b771a5301e43 32 if (avg > 0.7) { bargraph=0x0FF; return; }
User_4574 0:b771a5301e43 33 if (avg > 0.6) { bargraph=0x07F; return; }
User_4574 0:b771a5301e43 34 if (avg > 0.5) { bargraph=0x03F; return; }
User_4574 0:b771a5301e43 35 if (avg > 0.4) { bargraph=0x01F; return; }
User_4574 0:b771a5301e43 36 if (avg > 0.3) { bargraph=0x00F; return; }
User_4574 0:b771a5301e43 37 if (avg > 0.2) { bargraph=0x007; return; }
User_4574 0:b771a5301e43 38 if (avg > 0.1) { bargraph=0x003; return; }
User_4574 0:b771a5301e43 39 if (avg > 0.0) { bargraph=0x001; return; }
User_4574 0:b771a5301e43 40 bargraph=0x000; //Default to all off
User_4574 0:b771a5301e43 41 }
User_4574 0:b771a5301e43 42
User_4574 0:b771a5301e43 43 int main() { //Main code
User_4574 0:b771a5301e43 44 while(1) {
User_4574 0:b771a5301e43 45 int i;
User_4574 0:b771a5301e43 46 /* float leftin[16], leftout[16]; //While technically it can support 16 bands over each of 2 channels...
User_4574 0:b771a5301e43 47 float rightin[16], rightout[16];
User_4574 0:b771a5301e43 48 for(i=0;i<16;i++) leftin[i] = left;
User_4574 0:b771a5301e43 49 for(i=0;i<16;i++) rightin[i] = right;
User_4574 0:b771a5301e43 50 fft(leftin, leftout);
User_4574 0:b771a5301e43 51 fft(rightin, rightout); */
User_4574 0:b771a5301e43 52 float in[16], out[16], avg[8]; //I only use 8 on one channel
User_4574 0:b771a5301e43 53 for(i=0;i<16;i++) in[i] = (left + right) / 2; //So I average the two
User_4574 0:b771a5301e43 54 fft(in, out);
User_4574 0:b771a5301e43 55 for(i=0;i<8;i++) avg[i] = (out[2*i] + out[(2*i)+1]) / 2; //And then average pairs of bands
User_4574 0:b771a5301e43 56 /* pc.printf("%f %f %f %f %f %f %f %f\t%f %f %f %f %f %f %f %f\n",
User_4574 0:b771a5301e43 57 leftout[0], leftout[1], leftout[2], leftout[3],
User_4574 0:b771a5301e43 58 leftout[4], leftout[5], leftout[6], leftout[7],
User_4574 0:b771a5301e43 59 leftout[8], leftout[9], leftout[10], leftout[11],
User_4574 0:b771a5301e43 60 leftout[12], leftout[13], leftout[14], leftout[15]);
User_4574 0:b771a5301e43 61 pc.printf("%f %f %f %f %f %f %f %f\t%f %f %f %f %f %f %f %f\n\n",
User_4574 0:b771a5301e43 62 rightout[0], rightout[1], rightout[2], rightout[3],
User_4574 0:b771a5301e43 63 rightout[4], rightout[5], rightout[6], rightout[7],
User_4574 0:b771a5301e43 64 rightout[8], rightout[9], rightout[10], rightout[11],
User_4574 0:b771a5301e43 65 rightout[12], rightout[13], rightout[14], rightout[15]); */
User_4574 0:b771a5301e43 66 pc.printf("%f %f %f %f\t%f %f %f %f\r\n", //Then print the values to the uart
User_4574 0:b771a5301e43 67 avg[0], avg[1], avg[2], avg[3],
User_4574 0:b771a5301e43 68 avg[4], avg[5], avg[6], avg[7]);
User_4574 0:b771a5301e43 69 for(i=0;i<8;i++) outputmatrix(avg[i], i); //And display on the bargrpahs
User_4574 0:b771a5301e43 70 }
User_4574 0:b771a5301e43 71 }