マイクのアレ

Dependencies:   mbed

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;
+            
+        }
+    }
+}