towa saionzi
/
Nucleo_MicBiQuadSender
マイクのアレ
main.cpp
- Committer:
- saionziTowa
- Date:
- 2017-08-22
- Revision:
- 0:6417f011fa48
File content as of revision 0:6417f011fa48:
#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; } } }