⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autocorrelation.c

📁 基于SPCE061的语音(乐音)辨识研究分析自己声音的频率数
💻 C
字号:
/*--------------- Taizo UMEZAKI ----------------*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NN 256

extern void   gframe();
extern void   gfirst();
extern void   rdseqm();
extern void   i2d();
extern void   sig2cor();
extern void   ana();
extern double dot();

void main()
{
   int   fs,fl;
   double sampf,fshift,flength;
   FILE *fp1,*fp2;

   sampf   = 11.025;              /*  sampling frequency [kHz]  */
   fshift  =  0.090703;           /*  frame shift  [ms]         */
   flength = 23.220;              /*  frame length [ms]         */
   fs = (int)(sampf * fshift);    /*  frame shift  [sample]     */
   fl = (int)(sampf * flength);   /*  frame length [sample]     */

   if((fp1 = fopen("a16_m.wav","rb")) == NULL) exit(1);
   if((fp2 = fopen("result.dat","w")) == NULL) exit(1);
   ana(fs,fl,fp1,fp2);
   fclose(fp1);
   fclose(fp2);
}

/*----- ana -----------------------------*/

void ana(fs,fl,fp1,fp2)
int   fs,fl;
FILE *fp1,*fp2;
{
   int   j,ie,ipoint=0,len;
   short int sp[23000],ix[NN];
   double x[NN],ss[NN],var,cor,sn;
   
   fread(sp,2,20,fp1);
   fread(&len,4,1,fp1);
   len /= 2;
   fread(sp,2,len,fp1);
   for(j=0;j < len/4;j++) {
	   fprintf(fp2,"%d\n",sp[j]);
   }
   for(j = 0;j < 10000;j++) {
      if(j == 0) {
         gfirst(&ipoint,sp,len,ix,fl,&ie);
         i2d(fl,ix,ss);
		 sn = dot(ss,ss,fl);
      }
      else {
         gframe(&ipoint,sp,len,ix,fl,fs,&ie);
      }
      if(ie != 0) break;
      i2d(fl,ix,x);
      sig2cor(fl,ss,x,&var,&cor,sn);
//      fprintf(fp2,"%6.3f\n",cor);
   }
   return;
}

/*--- sig2cor -------------------------------*/

void sig2cor(n,sig1,sig2,vo,cor,sn)
int   n;
double sig1[],sig2[],*cor,*vo,sn;
{
   *vo = 10.0 * log10(dot(sig2,sig2,n) / (double)n);
   *cor = dot(sig1,sig2,n) / sn;
   return;
}

/*--- dot ----------------------------------*/

double dot(x,y,n)
double x[],y[];
int   n;
{
   int   i;
   double sum=0.;

   for(i=0;i < n;i++)
      sum += *(x++) * *(y++);
   return(sum);
}

/*----- i2d ----------------------------------*/

void i2d(n,ix,zz)
int   n;
short int ix[];
double zz[];
{
   int i;
   
   for(i=0;i < n;i++) 
      zz[i] = (double)ix[i];
   return;
}

/*----- rdseqm -------------------------------*/

void rdseqm(ipoint,sp,len,ix,nbyte,ie)
short int sp[],*ix;
int   *ie,len,*ipoint,nbyte;
{
   int nword,i,ii;

   nword = nbyte/2;
   for(i=0;i < nword;i++) {
      ii = i + *ipoint;
      *(ix+i) = sp[ii];
      if(ii > len) {
         *ie = -1;
         return;
      }
   }
   *ipoint += nword;
   *ie = 0;
   return;
}

/*----- gfirst -------------------------------*/

void gfirst(ipoint,sp,len,ix,fl,ie)
short int sp[],ix[];
int *ipoint,*ie,len,fl;
{
   rdseqm(ipoint,sp,len,ix,fl*2,ie);
   return;
}

/*----- gframe ------------------------------*/

void gframe(ipoint,sp,len,ix,fl,fs,ie)
short int sp[],ix[];
int *ipoint,*ie,len,fl,fs;
{
   int i,j;

   j = fl - fs;
   for(i=0;i < j;i++)
      ix[i] = ix[i+fs];
   rdseqm(ipoint,sp,len,(ix+j),fs*2,ie);
   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -