📄 autocorrelation.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 + -