towa saionzi
/
Nucleo_MicBiQuadSender
マイクのアレ
Diff: main.cpp
- Revision:
- 0:6417f011fa48
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Aug 22 11:16:55 2017 +0000 @@ -0,0 +1,159 @@ +#include "mbed.h" + +Serial pc(SERIAL_TX,SERIAL_RX); +DigitalOut myled(LED1); +AnalogIn mic(A5); +float readed; +Timer T; +unsigned long oldtime; + +//*********************Setting of BandPass Fillter**************************** +/* +float samplerate=93432.89; +const float freq=4261;//3942; //4261:new 3942:old +const float bw=0.3f; +*/ + + + +float samplerate=91634.59; +const float freq=5200;//5200; //5700:new 5200:old +const float bw=0.5f; + + +float omega=2.0f*3.14159265f*freq/samplerate; +float alpha=sin(omega)*sinh(log10(2.0f)/2.0f*bw*omega/sin(omega)); +float a0=1.0f+alpha; +float a1=-2.0f*cos(omega); +float a2=1.0f-alpha; +float b0=alpha; +float b1=0.0f; +float b2=-1.0f*alpha; +//***************************************************************************** +float inbuf[2001]; +float outbuf[2001]; +int dbuf[2001]; + +float amp[40]; +float amplog[100]; + +long counter=0; +int mastercounter=0; +int amplogcounter=0; + + +int main() { + T.start(); + pc.baud(115200); + while(1) { + //float in1,in2,out1,out2,input,output; + static float in1=0; + static float in2=0; + static float out1=0; + static float out2=0; + static float input=0; + static float output=0; + + //while(T.read_us()<(oldtime+100)); + input=mic.read(); + //oldtime=T.read_us(); + output=b0/a0*input+b1/a0*in1+b2/a0*in2-a1/a0*out1-a2/a0*out2; + in2=in1; + in1=input; + out2=out1; + out1=output; + + dbuf[counter]=T.read_us()-oldtime; + inbuf[counter]=input; + outbuf[counter]=output; + oldtime=T.read_us(); + counter++; + + + if(counter>2001){ + for(int i=0;i<40;i++){ + float max=-1; + float min=1; + for(int j=0;j<50;j++){ + if(outbuf[i*50+j+1]>max)max=outbuf[i*50+j+1]; + else if(outbuf[i*50+j+1]<min)min=outbuf[i*50+j+1]; + } + amp[i]=(max-min)/2; + //pc.printf("%f %f\n",max,min); + } + + /* + float max=-1; + float min=1; + bool maxf=false; + bool minf=false; + int ampcount; + for(int i=0;i<2000;i++){ + if(outbuf[i]-outbuf[i+1]<0&&outbuf[i+1]-outbuf[i+2]>0) { + max=outbuf[i+1]; + maxf=true; + } + else if(outbuf[i]-outbuf[i+1]>0&&outbuf[i+1]-outbuf[i+2]<0){ + min=outbuf[i+1]; + minf=true; + } + if(minf&&maxf){ + minf=false; + maxf=false; + amp[ampcount%40]=max-min; + ampcount++; + //pc.printf("%f %f\n",max,min); + } + }*/ + + float buf=0; + for(int i=20;i<40;i++){ + buf+=amp[i]; + } + + + amplog[amplogcounter]=buf; + amplogcounter++; + if(amplogcounter==40){ + amplogcounter=0; + buf=0; + for(int i=0;i<40;i++){ + if(amplog[i]>buf) buf=amplog[i]; + //pc.printf("%f\n",amplog[i]/10); + } + pc.putc('S'); + pc.putc((int)(buf/10*6*20000)%256); + pc.putc((int)(buf/10*6*20000)/256); + //pc.printf("%f\n",buf/10); + } + + //pc.putc('S'); + //pc.printf("%f\n",buf/10); + //pc.putc((int)(buf/10*2*20000)%256); + //pc.putc((int)(buf/10*2*20000)/256); + //pc.printf("%d",(int)(buf/10*2*20000)%256); + //pc.printf("%d\n",(int)(buf/10*2*20000)/256); + //for(int i=0;i<1100;i++) pc.printf("%d %f\n",dbuf[i+1],inbuf[i+1]); + counter=0; + T.reset(); + oldtime=T.read_us(); + + float avd=0; + for(int i=0;i<100;i++){ + avd+=dbuf[i+1]; + } + avd=avd/100; + samplerate=1000/avd*1000; + //pc.printf("%f\n",samplerate); + omega=2.0f*3.14159265f*freq/samplerate; + alpha=sin(omega)*sinh(log10(2.0f)/2.0f*bw*omega/sin(omega)); + a0=1.0f+alpha; + a1=-2.0f*cos(omega); + a2=1.0f-alpha; + b0=alpha; + b1=0.0f; + b2=-1.0f*alpha; + + } + } +}