audio_FFT
Published 21 Mar 2010, by
James Cobb
adc,
audio,
FFT,
sound
« Back to documentation index
Show/hide line numbers
main.cpp Source File
main.cpp
00001
00002 #define SAMPLE_RATE 48000
00003
00004 #include "mbed.h"
00005 #include "adc.h"
00006
00007
00008
00009 extern "C" void fftR4(short *y, short *x, int N);
00010
00011
00012 DigitalOut l1(LED1);
00013 DigitalOut l2(LED2);
00014 DigitalOut l3(LED3);
00015 DigitalOut l4(LED4);
00016
00017
00018 Timer timer;
00019
00020
00021
00022 LocalFileSystem local("local");
00023 FILE *fp;
00024
00025
00026 int Counter = 0;
00027 int16_t Buffer[5000];
00028
00029
00030 ADC adc(SAMPLE_RATE, 1);
00031
00032
00033 void fwrite16(uint16_t v)
00034 {
00035 uint8_t *b = (uint8_t *)&v;
00036
00037 fprintf(fp,"%c%c", b[1], b[0]);
00038 }
00039 void fwrite32(uint32_t v)
00040 {
00041 uint8_t *b = (uint8_t *)&v;
00042
00043 fprintf(fp,"%c%c%c%c", b[3], b[2], b[1], b[0]);
00044 }
00045
00046
00047 void sample_ADC(int chan, uint32_t value) {
00048
00049 float s;
00050 s = adc.read(p20);
00051 int16_t b = (s -2048)*16;
00052 Buffer[Counter] = b;
00053 Counter += 1;
00054
00055 int g = abs(s-2048);
00056 l1 = g > 0.1f*2048;
00057 l2 = g > 0.3f*2048;
00058 l3 = g > 0.6f*2048;
00059 l4 = g > 0.8f*2048;
00060 }
00061
00062 int main() {
00063
00064
00065 adc.append(sample_ADC);
00066 adc.startmode(0,0);
00067 adc.burst(1);
00068 adc.setup(p20,1);
00069
00070
00071 wait(1);
00072
00073
00074 adc.interrupt_state(p20,1);
00075 wait(0.1);
00076
00077
00078 adc.interrupt_state(p20,0);
00079 adc.setup(p20,0);
00080 int actual_rate = adc.actual_sample_rate();
00081
00082
00083 printf("Requested max sample rate is %u, actual max sample rate is %u.\n",
00084 SAMPLE_RATE, actual_rate);
00085 printf("We did %i samples\n",Counter);
00086
00087
00088 fp = fopen("/local/out.au", "w");
00089 fprintf(fp,".snd");
00090 fwrite32(24);
00091 fwrite32(-1);
00092 fwrite32(3);
00093 fwrite32(48000);
00094 fwrite32(1);
00095 int writeCount = 0;
00096 while(writeCount <=Counter) {
00097 fwrite16(Buffer[writeCount]);
00098 writeCount+=1;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 timer.reset();
00140 timer.start();
00141 #define MN 1024
00142 short mx[MN*2];
00143 short my[MN*2];
00144 for (int i=0;i<MN*2;i++) mx[i]=0;
00145 for (int i=0;i<MN;i=i+1)
00146 { mx[i*2]=Buffer[i];}
00147 printf("Mellen set up took %i\n",timer.read_us());
00148
00149 timer.reset();
00150 timer.start();
00151 fftR4(my, mx, MN);
00152 printf("Mellen fft took %i\n",timer.read_us());
00153 FILE* mlog = fopen("/local/mellen.csv","w");
00154
00155
00156 for (int i=0; i<MN; i=i+2)
00157 {
00158
00159 fprintf(mlog, "%d,%f\n", int(actual_rate/MN/2*i),sqrt(float( (my[i]*my[i]) +(my[i+1]*my[i+1]) ) ) );
00160 }
00161 fclose(mlog);
00162
00163
00164 }
00165
00166
00167
00168
00169