#include "stdafx.h" #include "mmsystem.h" #include "math.h" #include "makewave.h" #include "findperi.h" #include "realfft.h" static double freqvalue(double * fbuffer, double f) { double s; s=0; for(int i=1; i<3; i++) s+=peakvalue(fbuffer, (int)(i*f)); return s; } double searchfreq(double * fbuffer, double& f){ f=pow(2,f/12); double smax,s; smax = 0; double f1,fmax; for(f1=f*0.8; f1smax){ smax = s; fmax = f1; } } f=12*log(fmax)/log(2); return f; } static double freqerr(double f, double testf) { double rmd; rmd = fmod(f,testf); if(rmd>testf/2) rmd = testf-rmd; rmd/=f; return rmd; } static int testfreq(int peaknumber, double * peaks, double testf) { double err; err=0; for(int i=0; is) s=s1; } return s; } static double totalpeakvalue(double * pr, int fb, int f) { double s=0; for(int i=0; i<5; i++){ s+=nearpeakvalue(pr, fb+f*i); } return s; } static int istherepeak(double * pr, int n) { if(n<20 || n>1000) return 0; double s=pr[n]; for(int i=n-10; i<=n+10; i++){ if(pr[i]>s) return 0; } if(peakvalue(pr,n)>=3) return 1; return 0; } int findpeaks(double * pr, double * peaks){ double smax=0; int i; // for(i=0; i<1000; i++) // if(pr[i]>smax) // smax=pr[i]; int pnumber=0; for(i=30; i<1000; i++){ if(istherepeak(pr, i)){ // if(pr[i]=80) break; } } if(pnumber>1) for(i=0; idwBytesRecorded)>tbsize) { stop(); return 1; } int j; j = isnoise((unsigned char*)pwh->lpData,pwh->dwBytesRecorded); if(j && (state==1)) { i=waveInPrepareHeader(hwavein,pwh,sizeof(WAVEHDR)); i=waveInAddBuffer(hwavein,pwh, sizeof(WAVEHDR)); return 0; } if(state==1)state=2; memcpy(tbuffer+rsize,pwh->lpData,pwh->dwBytesRecorded); rsize += pwh->dwBytesRecorded; if(j) state++; else state=2; i=waveInPrepareHeader(hwavein,pwh,sizeof(WAVEHDR)); i=waveInAddBuffer(hwavein,pwh, sizeof(WAVEHDR)); if((rsize >= tbsize) || (state>7)){ if(state>7) { state -=4; if((double)rsize-state*bsize>0) rsize-=state*bsize; } stop(); return 1; } return 0; } int cbhanalysis::isnoise(unsigned char * buffer, int size, double& freq) { int n,i; if(size>16384)return 1; for(i=0; i<16384; i++) pr[i]=0; for(i=0; i0.00000001) if(smax/s<50) return 1; /* s=0; for(i=1;i<30;i++){ if(pr[i]>s) s=pr[i]; } if(s>0.3*smax) return 1;*/ freq = findfreq(pr); if(freq<30) return 1; return 0; } void cbhanalysis::calculate(unsigned char * buffer, int size) { if(size <= 0) return; effect = 1; int j,m; double k; m=0; tmsize = 0; for(int i=0; i<508; i++) { j=4096; if(i*1024+4096 > size) break; noise[i]=isnoise(buffer+(i*1024), j, k); // if(k<40) // noise[i]=1; if(!noise[i]) { fbuffer[tmsize]=12*log(k)/log(2); } tmsize++; if(!noise[i] && i>6 && k>37) { if(m==0) { samplesize=2*int(double(16384)/k); if(samplesize > 1000) samplesize = 1000; for(int n=0;n=size) break; } for(i=0;ifbuffer[i-1]+3 && fbuffer[i]>fbuffer[i+1]+3) || (fbuffer[i]cmax) cmax = buffer[i]; if(buffer[i]