マイクのアレ

Dependencies:   mbed

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