Næþ'n Lasseter
/
GraphicEqFFT
A Graphic Equaliser using 2 Analog inputs and an Fast Fourier Transform
main.cpp@0:b771a5301e43, 2010-03-18 (annotated)
- Committer:
- User_4574
- Date:
- Thu Mar 18 15:15:33 2010 +0000
- Revision:
- 0:b771a5301e43
Who changed what in which revision?
User | Revision | Line number | New 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 | } |