📄 hvxcvextgendec.c
字号:
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 + -