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

📄 hvxcvextgendec.c

📁 语音压缩算法
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(HDS->decDelayMode == DM_SHORT)	{	  /* fixing bug of upperbound of cyclic extention(99/02/15) */#ifdef UPB	    for(i=0; i<Lp12+iflat2; i++)#else	    for(i=0; i<lp12+iflat2+10; i++)#endif		out2[i]=HDS->wave2[(st+i)%(SAMPLE/2)];	}	else	{	  /* fixing bug of upperbound of cyclic extention(99/02/15) */#ifdef UPB	    for(i=0; i<Lp12; i++)#else	    for(i=0; i<lp12; i++)#endif		out2[i]=HDS->wave2[(st+i)%(SAMPLE/2)];	}	if(HDS->decDelayMode == DM_SHORT)	{	    for(i=0;i<iflat;i++)		c_dis_lp12[i]=1.0;	    	    ilp12=1./(lp12-(float)iflat);	    for(i=iflat;i<(int)lp12;i++)                c_dis_lp12[i]=((float)lp12 - (float)i)*ilp12;	    	    for(i=(int)lp12;i<(int)lp12+iflat2;i++)		c_dis_lp12[i]=0.;	    	    for(i=0;i<(int)lp12+iflat2;i++)		out3[i]=out[i]*c_dis_lp12[i] + out2[i]*(1.0-c_dis_lp12[i]);#ifdef UPB	    for(;i<Lp12+iflat2;i++)	      out3[i]=out2[i];#endif	}	else	{	    ilp12=1./lp12;	    for(i=0;i<(int)lp12;i++)		out3[i]=out[i]*(lp12-(float)i)*ilp12 + out2[i]*(float)i*ilp12;#ifdef UPB	    for(;i<Lp12;i++)	      out3[i]=out2[i];#endif	}	if(HDS->decDelayMode == DM_SHORT)	{	    sv[0]=out3[iflat];	    ffi=0;	    for(i=1;i<FRM;i++){		if(i<FRM-LD_LEN)		    ovsrc=ovsr1*((float)(FRM-LD_LEN-i)/(float)(FRM-LD_LEN)) + ovsr2*(float)i/(float)(FRM-LD_LEN);		else		    ovsrc=ovsr2;		ffi=ffi+ovsrc;		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip) 		  sv[i]=out3[(int)ffip + iflat];		else 		  sv[i]=(ffi-ffim)*out3[(int)ffip+iflat]+(ffip-ffi)*out3[(int)ffim+iflat];		#ifdef UPB		if ((int)ffip+iflat >= Lp12+iflat2) {		  printf("IPC_vExt_fft: undetermined value is used(frame #%d,ffip+iflat=%d,Lp12+iflat2=%d)\n",			 (int)ffip+iflat, (int)Lp12+iflat2, HDS->fr0);		  printf("(short delay mode, pitch continuous)\n");#endif		}	    }	}	else	{	    sv[0]=out3[0];	    ffi=0.;	    for(i=1;i<FRM;i++){		fi=(float)i;		ovsrc=ovsr1*c_con[i] + ovsr2*(1.0-c_con[i]); 		ffi=ffi+ovsrc;	    		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip)		    sv[i]=out3[(int)ffip];		else		    sv[i]=(ffi-ffim)*out3[(int)ffip]+(ffip-ffi)*out3[(int)ffim];#ifdef UPB		if ((int)ffip >= Lp12) {		  printf("IPC_vExt_fft: undetermined value is used(frame #%d,ffip=%d,Lp12=%d)\n",			 (int)ffip, Lp12, HDS->fr0);		  printf("(normal delay mode, pitch continuous)\n");#endif		}	    }	}    }    else    {	for(i=0;i<SAMPLE/2;i++)	    wave1[i]=HDS->wave2[i];		ovsr1=(float)(SAMPLE/2.0)/pch[0];	ovsr2=(float)(SAMPLE/2.0)/pch[1];		lp1=ceil((float)FRM*ovsr1);	lp2=ceil((float)FRM*ovsr2);	lp2r=floor((float)FRM*ovsr2 + 0.5);	if(HDS->decDelayMode == DM_SHORT)	{	    iflat=(int)floor(ovsr1*(float)LD_LEN + 0.5);	    iflat2=(int)floor(ovsr2*(float)LD_LEN + 0.5);	    #ifdef UPB	    for(i=0;i<=(int)lp1+iflat;i++)#else	    for(i=0;i<=lp1+iflat+10;i++)#endif		out[i]=wave1[(i)%(SAMPLE/2)];	}	else	{#ifdef UPB	    for(i=0;i<=(int)lp1;i++)#else	    for(i=0;i<lp1;i++)#endif		out[i]=wave1[(i)%(SAMPLE/2)];	}		for(i=0;i<SAMPLE/2;i++)	    phai2[i]= modu2pai(HDS->pha2[i]); 		ifft_am(am2,phai2,HDS->wave2);		st=SAMPLE/2-(((int)lp2r)%(SAMPLE/2));	if(HDS->decDelayMode == DM_SHORT)	{#ifdef UPB	    for(i=0; i<=(int)lp2+iflat2; i++)#else	    for(i=0; i<=lp2+iflat2+10; i++)#endif		out2[i]=HDS->wave2[(st+i)%(SAMPLE/2)];	}	else	{#ifdef UPB	    for(i=0;i<=(int)lp2;i++)#else	    for(i=0;i<lp2;i++)#endif		out2[i]=HDS->wave2[(st+i)%(SAMPLE/2)];	}	if(HDS->decDelayMode == DM_SHORT)	{	    sv1[0]=out[iflat];	    ffi=0.;	    for(i=1;i<FRM;i++){		fi=(float)i;		ffi=ffi+ovsr1;		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip)		    sv1[i]=out[(int)ffip+iflat];		else		    sv1[i]=(ffi-ffim)*out[(int)ffip+iflat]+(ffip-ffi)*out[(int)ffim+iflat];	    }	    sv2[0]=out2[iflat2];	    ffi=0.;	    for(i=1;i<FRM;i++){		fi=(float)i;		ffi=ffi+ovsr2;		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip)		    sv2[i]=out2[(int)ffip+iflat2];		else		    sv2[i]=(ffi-ffim)*out2[(int)ffip+iflat2]+(ffip-ffi)*out2[(int)ffim+iflat2];	    }	    for(i=0;i<FRM;i++)		sv[i]=sv1[i]*c_dis[i+LD_LEN]+sv2[i]*(1.0-c_dis[i+LD_LEN]);	}	else	{	    sv1[0]=out[0];	    ffi=0.;	    for(i=1;i<FRM;i++){		fi=(float)i;		ffi=ffi+ovsr1;		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip)		    sv1[i]=out[(int)ffip];		else		    sv1[i]=(ffi-ffim)*out[(int)ffip]+(ffip-ffi)*out[(int)ffim];	    }	    sv2[0]=out2[0];	    ffi=0.;	    for(i=1;i<FRM;i++){		fi=(float)i;		ffi=ffi+ovsr2;		ffim=floor(ffi);		ffip=ceil(ffi);		if(ffim == ffip)		    sv2[i]=out2[(int)ffip];		else		    sv2[i]=(ffi-ffim)*out2[(int)ffip]+(ffip-ffi)*out2[(int)ffim];	    }	    if(vuv[0] != 0 && vuv[1] != 0)	    {		for(i = 0; i < FRM; i++)		    sv[i] = sv1[i] * c_dis_v_v[i]			+ sv2[i] * (1.0 - c_dis_v_v[i]);	    }	    if(vuv[0] != 0 && vuv[1] == 0)	    {		for(i = 0; i < FRM; i++)		    sv[i] = sv1[i] * c_dis_v_uv[i]			+ sv2[i] * (1.0 - c_dis_v_uv[i]);	    }	    if(vuv[0] == 0 && vuv[1] != 0)	    {		for(i = 0; i < FRM; i++)		    sv[i] = sv1[i] * c_dis_uv_v[i]			+ sv2[i] * (1.0 - c_dis_uv_v[i]);	    }	}    }    HDS->old_old_vuv=vuv[0];    }void IPC_UvAdd(float *pch, float (*am)[3], int *vuv, float *add_uv,HvxcDecStatus *HDS)	/* in: pointer to decoder status(AI 990129) */{    int i,j;    float w01;    int send1;    float s,bunbo;        float ns[SAMPLE];    float wns[SAMPLE];    float wnsoz[2*FRM];    float coefz[2*FRM+LD_LEN];    float rms[SAMPLE];    float ang[SAMPLE];    float re[SAMPLE];    float im[SAMPLE];    float s_uv[FRM];    float zenhan_uv[FRM];    float kouhan_uv[FRM];        int ub = 0,lb,bw;        float am1[SAMPLE/2];    int v_uv = 0;    float	b_th1;    float	b_th2;    float	b_th3;    float	guv_th1;    float	guv_th2;    float	guv_th3;    float	b_th2_2;    float	guv_th2_2;    if(HDS->decMode == DEC2K)    {	b_th1 = B_TH1_2K;	b_th2 = B_TH2_2K;	b_th3 = B_TH3_2K;		guv_th1 = GUV_TH1_2K;	guv_th2 = GUV_TH2_2K;	guv_th3 = GUV_TH3_2K;	b_th2_2 = B_TH2_2;	guv_th2_2 = GUV_TH2_2;    }    else    {	b_th1 = B_TH1_4K;	b_th2 = B_TH2_4K;	b_th3 = B_TH3_4K;	guv_th1 = GUV_TH1_4K;	guv_th2 = GUV_TH2_4K;	guv_th3 = GUV_TH3_4K;	b_th2_2 = B_TH2_2;	guv_th2_2 = GUV_TH2_2;    }    if(vuv[0] == 0 && vuv[1] == 0)        v_uv=0;    if(vuv[0] == 0 && vuv[1] != 0)        v_uv=1;    if(vuv[0] != 0 && vuv[1] == 0)        v_uv=2;    if(vuv[0] != 0 && vuv[1] != 0)        v_uv=3;    w01 = (float)SAMPLE/pch[1];    send1= (int)(pch[1]/2.);        for(i=0; i<= send1; i++)	am1[i]=am[i][2]*(float)SCALEFAC;        for(i=send1+1; i<SAMPLE/2; i++)	am1[i]=0.;    /* for fixing floating point bugs on win32/linux(AI 99/02/25) */    if (vuv[1] == 1) {      for (i = 0; i < (float)send1*b_th1 - DELTA; i++) {	am1[i] = 0.0f;      }      for (; i <= send1; i++) {	am1[i] = am1[i] * guv_th1;      }    }    else if (vuv[1] == 2) {      for (i = 0; i < (float)send1*b_th2 - DELTA; i++) {	am1[i] = 0.0f;      }      for (i = 0; i < (float)send1*b_th2_2 - DELTA; i++) {	am1[i] = am1[i] * guv_th2;       }      for (; i <= send1; i++) {	am1[i] = am1[i] * guv_th2_2;       }    }    else if (vuv[1] == 3) {      for (i = 0; i < (float)send1*b_th3 - DELTA; i++) {	am1[i] = 0.0f;      }      for (; i <= send1; i++) {	am1[i] = am1[i] * guv_th3;       }    }    for (; i < SAMPLE/2; i++) {      am1[i] = 0.0f;    }    genwg2(ns);    if(HDS->decDelayMode == DM_SHORT)    {	IPC_window(HDS->ipc_coefLD, ns, wns, SAMPLE);    }    else    {	IPC_window(HDS->ipc_coef, ns, wns, SAMPLE);    }    IPC_fcall_fft(wns,rms,ang,re,im);        for(i=0;i<=send1;i++){	if (i==0)	    lb=0;	else	    lb=ub+1;	if(i==send1)	    ub=SAMPLE-1;	else	    ub=IPC_inint((float)i * w01 + w01/2.);	if(ub >= SAMPLE/2)	    ub=SAMPLE/2 ;	bw=ub-lb+1;	s=0.;	for(j=lb;j<=ub; j++)	    s=s+rms[j]*rms[j];	s=sqrt(s/(float)bw);	for(j=lb;j<=ub;j++){	    rms[j]=am1[i]*rms[j]/s;    	}    }        fcall_ifft(rms,ang,wns);        zeropad(wns,wnsoz);         if(HDS->decDelayMode == DM_SHORT)    {	zeropad(HDS->ipc_coefLD,coefz);	for(i=320;i<320+LD_LEN;i++)	    coefz[i]=0.;    }    else    {	zeropad(HDS->ipc_coef,coefz);    }    if(HDS->decDelayMode == DM_SHORT)    {	for(i=0;i<FRM;i++){	    bunbo=coefz[FRM+i+LD_LEN]*coefz[FRM+i+LD_LEN]+coefz[i+LD_LEN]*coefz[i+LD_LEN];	    s_uv[i]=(HDS->wnsozp[i+LD_LEN]*coefz[FRM+i+LD_LEN]+wnsoz[i+LD_LEN]*coefz[i+LD_LEN])/bunbo;	}		for(i=0;i<80;i++){	    bunbo=coefz[FRM+i+LD_LEN]*coefz[FRM+i+LD_LEN]+coefz[i+LD_LEN]*coefz[i+LD_LEN];	    zenhan_uv[i]=HDS->wnsozp[i+LD_LEN]*coefz[FRM+i+LD_LEN]/bunbo;	}	for(i=80;i<FRM;i++)	    zenhan_uv[i]=0.;		for(i=0;i<FRM;i++){	    bunbo=coefz[FRM+i+LD_LEN]*coefz[FRM+i+LD_LEN]+coefz[i+LD_LEN]*coefz[i+LD_LEN];	    kouhan_uv[i]=wnsoz[i+LD_LEN]*coefz[i+LD_LEN]/bunbo;	}    }    else    {	for(i=0;i<FRM;i++){	    bunbo=coefz[FRM+i]*coefz[FRM+i]+coefz[i]*coefz[i];	    s_uv[i]=(HDS->wnsozp[FRM+i]*coefz[FRM+i]+wnsoz[i]*coefz[i])/bunbo;	}		for(i=0;i<SAMPLE/2;i++){	    bunbo=coefz[FRM+i]*coefz[FRM+i]+coefz[i]*coefz[i];	    zenhan_uv[i]=HDS->wnsozp[FRM+i]*coefz[FRM+i]/bunbo;	}	for(i=SAMPLE/2;i<FRM;i++)	    zenhan_uv[i]=0.;	for(i=0;i<(SAMPLE/2-OVERLAP);i++)	    kouhan_uv[i]=0.;	for(i=(SAMPLE/2-OVERLAP);i<FRM;i++){	    bunbo=coefz[FRM+i]*coefz[FRM+i]+coefz[i]*coefz[i];	    kouhan_uv[i]=wnsoz[i]*coefz[i]/bunbo;	}    }    if(v_uv == 0){	for(i=0;i<FRM;i++)		add_uv[i]=0.;    }    else if(v_uv == 1){	for(i=0;i<FRM;i++)		add_uv[i]=kouhan_uv[i];    }    else if(v_uv == 2){	for(i=0;i<FRM;i++)		add_uv[i]=zenhan_uv[i];    }    else if(v_uv == 3){	for(i=0;i<FRM;i++)		add_uv[i]=s_uv[i];    }    else{	fprintf(stderr, "v_uv flag ERROR \n");        exit(10);    }    if(HDS->decDelayMode == DM_SHORT)    {	for(i=0;i<FRM;i++)	    HDS->wnsozp[i]=wnsoz[i+FRM];	for(i=FRM;i<FRM*2;i++)	    HDS->wnsozp[i]=0.;    }    else    {	for(i=0;i<2*FRM;i++)	    HDS->wnsozp[i]=wnsoz[i];    }}

⌨️ 快捷键说明

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