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

📄 zhujf.cpp

📁 这个程序是我写的语音编码G.729 以编译通过
💻 CPP
字号:
#include <stdio.h>
#include "zjf.h"
#include "math.h"
#define BUFFERSIZE 240
#define SUBFRAMESIZE 40
#define  FRAMESIZE 80
#define fs 22050
void main()
{ FILE *Infile=NULL, *outfile=NULL;
  short x_in[BUFFERSIZE]; // short *x_in, *y_out
  int read,pos;
  double xin[BUFFERSIZE];
  double y_out[BUFFERSIZE],s[BUFFERSIZE];
  double win[BUFFERSIZE], wlag[10];
  double r[11],rp[11],ew[10];
  double aa[11],ag[10],aa1[10],aa2[10],ag0[10];
  double E,k,h[40],x[40],xb[40],y[40];
  double gamma = 1.0,ap1[11],ap2[11],gainp1=0.8,gainp2=0.8,gainc1,gainc2;
  double sum,rr[80],sw[320],R,Rt[3],maxr,u[240],v[80],c[80],z[40],beta;
  double test[90];
  short test2[80];
  int i,j,n,start,head=0,k0,posk,t[3],T0,tmin,tmax,flag,T1,frac1;
  if ((Infile=fopen("连续有感情.pcm","rb"))==NULL)
	 {printf("can't open file\n");
	  goto endd;}
  outfile=fopen("41.pcm","wb");
  for (i=0;i<90;i++)
	  test[i]=0;
  for (i=0;i<10;i++)
  {ag0[i]=0;
   ew[i]=0;}
  for (i=0;i<320;i++)
	  sw[i]=0;
  for(i=0;i<240;i++)
  {xin[i]=0.0;
   x_in[i]=0;
   y_out[i]=0;
   s[i]=0.0;
   u[i]=0;}
  start = 3*SUBFRAMESIZE;
  fread(&x_in[start], sizeof(short), SUBFRAMESIZE, Infile);
  for(i=0;i<SUBFRAMESIZE;i++)
  xin[start+i]=(double)x_in[start+i]/32768.0;///////////(avoid overflow)
  preprocessing(y_out, xin, start,SUBFRAMESIZE);
  start = 4*SUBFRAMESIZE;
  for(i=0;i<240;i++)
  { if(i<200)
      win[i]=0.54-0.46*cos(2*pi*(double)i/399.0);
   else
      win[i]=cos(2*pi*(double)(i-200)/159.0);
  
  }
  for(i=0;i<10;i++)
  {wlag[i]=exp(-0.5*(2*pi*60.0*(double)(i+1)/fs)*(2*pi*60.0*(double)(i+1)/fs));
  
  }
  while((read=fread(&x_in[start], sizeof(short),FRAMESIZE, Infile))==FRAMESIZE)
  {for(i=0;i<FRAMESIZE;i++)
   xin[start+i]=(double)x_in[start+i]/32768.0;////////////(avoid overflow)
   preprocessing(y_out, xin, start,FRAMESIZE);
   for(i=0;i<240;i++)
    s[i]=y_out[i]*win[i];
   //autocorrelation coefficients
   for (i=0;i<11;i++)
	{r[i]=0;
	 for(n=i;n<240;n++)
	  r[i]=r[i]+s[n]*s[n-i];
	 
	 }
   if (r[0]<1)
	   r[0]=1;
   rp[0]=1.0001*r[0];
   for(i=1;i<11;i++)
    rp[i]=r[i]*wlag[i-1];
   //Levinson-Durbin coefficients
   E=rp[0];
   for (i=1;i<11;i++)
   {aa[0]=1;
    k=0;
    for(j=0;j<i;j++)
    k=k+aa[j]*rp[i-j];
    k=-k/E;
    aa[i]=k;
    if ((i-1)<1)
       continue;
	else 
	{for (j=1;j<i;j++)
	    aa[j]=aa[j]+k*aa[i-j];
	}
   E=(1-k*k)*E;
   }
  for (i=0;i<10;i++)
  {ag[i]=aa[i+1];
   aa1[i]=0.5*(ag[i]+ag0[i]);
   aa2[i]=ag[i];
   ag0[i]=ag[i];
   }
  //Residual signal
   for (n=0;n<40;n++)
   {sum=0;           //sum
	for (i=1;i<11;i++)
	{pos=(start+200+n-i)%240;//pos
     sum=sum+aa1[i-1]*y_out[pos]; 
	}
	pos=(start+200+n)%240;
    rr[n]=y_out[pos]+sum;//rr
   }
  for (n=40;n<80;n++)
  {sum=0;
   for (i=1;i<11;i++)
   {pos=(start+200+n-i)%240;
    sum=sum+aa2[i-1]*y_out[pos]; 
   }
   pos=(start+200+n)%240;
   rr[n]=y_out[pos]+sum;
   
  }
  //weigthted speech signal
  	ap1[0] = 1; //ap1
	for (n=1; n<11; n++)
	{
		if (n==1)
			ap1[n] = -0.7;
		else
			ap1[n] = -0.7*gamma*aa1[n-2];
		gamma *= .75;
		ap1[n] += gamma*aa1[n-1];
       
	}
   gamma=1.0;
   ap2[0] = 1; //ap1
	for (n=1; n<11; n++)
	{
		if (n==1)
			ap2[n] = -0.7;
		else
			ap2[n] = -0.7*gamma*aa2[n-2];
		gamma *= .75;
		ap2[n] += gamma*aa2[n-1];
      
	}
   for (n=0; n<40; n++)
   {sum = 0;
	for (i=1; i<=10; i++)
	{pos = (head+320+n-i)%320;
	 sum += ap1[i]*sw[pos];//sw[320]
	}
	pos = (head+320+n)%320;
	sw[pos] = rr[n] - sum;
	
   }
  for (n=0; n<40; n++)
   {sum = 0;
	for (i=1; i<=10; i++)
	{pos = (head+40+320+n-i)%320;
	 sum += ap2[i]*sw[pos];//sw[320]
	}
	pos = (head+40+320+n)%320;
	sw[pos] = rr[n+40] - sum;
    
	}
    //open-loop T0
    for (k0=20;k0<40;k0++)//k0
	{R=0;//R
     for (n=0;n<40;n++)
	 {pos=(head+320+2*n)%320;
      posk=(head+320+2*n-k0)%320;//posk
      R=R+sw[pos]*sw[posk];
	 }
      if (k0==20)
	  {Rt[0]=R;//Rt[3]
       t[0]=k0;//t[3]
	  }
	 else
	 {if (Rt[0]<R)
	   {Rt[0]=R;
	    t[0]=k0; 
	    }
	 }
	}
   for (k0=40;k0<80;k0++)//k0
	{R=0;//R
     for (n=0;n<40;n++)
	 {pos=(head+320+2*n)%320;
      posk=(head+320+2*n-k0)%320;//posk
      R=R+sw[pos]*sw[posk];
	 }
      if (k0==40)
	  {Rt[1]=R;//Rt[3]
       t[1]=k0;//t[3]
	  }
	 else
	 {if (Rt[1]<R)
	   {Rt[1]=R;
	    t[1]=k0; 
	    }
	 }
	}
   for (k0=80;k0<144;k0++)//k0
	{R=0;//R
     for (n=0;n<40;n++)
	 {pos=(head+320+2*n)%320;
      posk=(head+320+2*n-k0)%320;//posk
      R=R+sw[pos]*sw[posk];
	 }
      if (k0==80)
	  {Rt[2]=R;//Rt[3]
       t[2]=k0;//t[3]
	  }
	 else
	 {if (Rt[2]<R)
	   {Rt[2]=R;
	    t[2]=k0; 
	    }
	 }
	}
    for (i=0;i<3;i++)
	{ sum=0;
	  for(n=0;n<40;n++)
	  {posk=(head+320+2*n-t[i])%320;
	   sum=sum+sw[posk]*sw[posk];
	  }
      Rt[i]=Rt[i]/(sqrt(sum)+0.00001);
    
	}
    maxr=Rt[0];//maxr
    T0=t[0]; //T0
	if(Rt[1]>=0.85*maxr)
	  {maxr=Rt[1];
       T0=t[1];
	   }
    if(Rt[2]>=0.85*maxr)
	  T0=t[2];
	//code with subframe1
   //response and target signal
   response(aa1,&rr[0],h,x, ew);//h[40] x[40]
   //signal xb
   correlation(x, h, xb);
   //open-delay boundary
   tmin=T0-3;
   if (tmin<20)
      tmin=20;
   tmax=tmin+6;
   if (tmax>143)
   {tmax=143;
    tmin=tmax-6;
   }

   flag=0;//first flag=0 second flag=1
   //subframe1 integer delay and fraction delay T1 frac1 
   pitchdelay(tmin,tmax,xb,&u[0], &T1, &frac1,flag, &rr[0]);
   //adaptive codebook
   adaptivecodebookvector(&u[0],T1,frac1,&v[0]);
   //adaptive gain
   filteredadaptivecodebookvector(&v[0],h,y);
   gainp1=adaptive0gain(y,x);
   //fixed codebook
   beta=gainp2;
   fixedcodebooksearchsubframe(x,h, y,gainp1, beta, T1, &c[0]);
   // for (i=0;i<40;i++)
  //	 printf("%f\n",c[i]);
  //fixed gain
  fixedcodebookgain(x, y, z, &c[0], h, gainp1,&gainc1);
  //memoryupdate
  memoryupdate(&u[0], gainp1, &v[0], gainc1, &c[0], x, y, z,ew);
  //code with subframe2
  response(aa2,&rr[40],h,x, ew);
  correlation(x, h, xb);
  tmin=T1-5;
   if (tmin<20)
      tmin=20;
   tmax=tmin+9;
   if (tmax>143)
   {tmax=143;
    tmin=tmax-9;
   }
  flag=1;
  pitchdelay(tmin,tmax,xb,&u[40], &T1, &frac1,flag, &rr[40]);
  adaptivecodebookvector(&u[40],T1,frac1,&v[40]);
  filteredadaptivecodebookvector(&v[40],h,y);
  gainp2=adaptive0gain(y,x);
  beta=gainp1;
  fixedcodebooksearchsubframe(x,h, y,gainp2, beta, T1, &c[40]);
  fixedcodebookgain(x, y, z, &c[40], h, gainp2,&gainc2);
  memoryupdate(&u[40], gainp1, &v[40], gainc1, &c[40], x, y, z,ew);
  for (n=0; n<160; n++)
		u[n] = u[n+80];
  for (n=0; n<40; n++)
	  for (i=1, test[n+10]=u[n+80]/*+(temp1/temp2-g_c1)*c[n]*/; i<=10; i++)
			test[n+10] -= aa1[i-1]*test[n-i+10];
  for (n=40; n<80; n++)
		for (i=1, test[n+10]=u[n+80]/*+(temp1/temp2-g_c2)*c[n]*/; i<=10; i++)
			test[n+10] -= aa2[i-1]*test[n-i+10];
  for (n=0;n<80;n++)
     test2[n]=(short)(test[n+10]*32768.0);//////////
  for (n=0;n<10;n++)
	  test[n]=test[n+80];
  fwrite(test2,sizeof(short),FRAMESIZE,outfile);
  start = (start+FRAMESIZE)%240;
  head = (head+FRAMESIZE)%320;
   
  }
endd:;
}



⌨️ 快捷键说明

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