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