ilbc_decode.cxx
来自「MiniSip Client with DomainKeys Authentic」· CXX 代码 · 共 547 行 · 第 1/2 页
CXX
547 行
1: normal */ ){ float data[BLOCKL_MAX]; float lsfdeq[LPC_FILTERORDER*LPC_N_MAX]; float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1]; float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1]; int k, i, start, idxForMax, pos, lastpart, ulp; int lag, ilag; float cc, maxcc; int idxVec[STATE_LEN]; int check; int gain_index[NASUB_MAX*CB_NSTAGES], extra_gain_index[CB_NSTAGES]; int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES]; int lsf_i[LSF_NSPLIT*LPC_N_MAX]; int state_first; unsigned char *pbytes; float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX]; int order_plus_one; float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; float decresidual[BLOCKL_MAX]; if (mode>0) { /* the data are good */ /* decode data */ pbytes=bytes; pos=0; /* Set everything to zero before decoding */ for (k=0;k<LSF_NSPLIT*LPC_N_MAX;k++) { lsf_i[k]=0; } start=0; state_first=0; idxForMax=0; for (k=0; k<STATE_SHORT_LEN; k++) { idxVec[k]=0; } for (k=0;k<CB_NSTAGES;k++) { extra_cb_index[k]=0; } for (k=0;k<CB_NSTAGES;k++) { extra_gain_index[k]=0; } for (i=0; i<NASUB; i++) { for (k=0; k<CB_NSTAGES; k++) { cb_index[i*CB_NSTAGES+k]=0; } } for (i=0; i<NASUB; i++) { for (k=0; k<CB_NSTAGES; k++) { gain_index[i*CB_NSTAGES+k]=0; } } /* loop over ULP classes */ for (ulp=0; ulp<3; ulp++) { /* LSF */ for (k=0;k<6;k++) { unpack( &pbytes, &lastpart, ulp_lsf_bitsTbl[k][ulp], &pos); packcombine(&lsf_i[k], lastpart, ulp_lsf_bitsTbl[k][ulp]); } /* Start block info */ unpack( &pbytes, &lastpart, ulp_start_bitsTbl[ulp], &pos); packcombine(&start, lastpart, ulp_start_bitsTbl[ulp]); unpack( &pbytes, &lastpart, ulp_startfirst_bitsTbl[ulp], &pos); packcombine(&state_first, lastpart, ulp_startfirst_bitsTbl[ulp]); unpack( &pbytes, &lastpart, ulp_scale_bitsTbl[ulp], &pos); packcombine(&idxForMax, lastpart, ulp_scale_bitsTbl[ulp]); for (k=0; k<STATE_SHORT_LEN; k++) { unpack( &pbytes, &lastpart, ulp_state_bitsTbl[ulp], &pos); packcombine(idxVec+k, lastpart, ulp_state_bitsTbl[ulp]); } /* 22 sample block */ for (k=0;k<CB_NSTAGES;k++) { unpack( &pbytes, &lastpart, ulp_extra_cb_indexTbl[k][ulp], &pos); packcombine(extra_cb_index+k, lastpart, ulp_extra_cb_indexTbl[k][ulp]); } for (k=0;k<CB_NSTAGES;k++) { unpack( &pbytes, &lastpart, ulp_extra_cb_gainTbl[k][ulp], &pos); packcombine(extra_gain_index+k, lastpart, ulp_extra_cb_gainTbl[k][ulp]); } /* The four 40 sample sub blocks */ for (i=0; i<NASUB; i++) { for (k=0; k<CB_NSTAGES; k++) { unpack( &pbytes, &lastpart, ulp_cb_indexTbl[i][k][ulp], &pos); packcombine(cb_index+i*CB_NSTAGES+k, lastpart, ulp_cb_indexTbl[i][k][ulp]); } } for (i=0; i<NASUB; i++) { for (k=0; k<CB_NSTAGES; k++) { unpack( &pbytes, &lastpart, ulp_cb_gainTbl[i][k][ulp], &pos); packcombine(gain_index+i*CB_NSTAGES+k, lastpart, ulp_cb_gainTbl[i][k][ulp]); } } } /* Check for bit errors */ if( (start<1) || (start>5) ) mode = 0; if (mode==1) { /* No bit errors was detected, continue decoding */ /* adjust index */ index_conv_dec(cb_index); /* decode the lsf */ SimplelsfDEQ(lsfdeq, lsf_i); check=LSF_check(lsfdeq, LPC_FILTERORDER, LPC_N); DecoderInterpolateLSF(syntdenum, weightdenum, lsfdeq, LPC_FILTERORDER, iLBCdec_inst); Decode(decresidual, start, idxForMax, idxVec, syntdenum, cb_index, gain_index, extra_cb_index, extra_gain_index, state_first); /* preparing the plc for a future loss! */ doThePLC(PLCresidual, PLClpc, 0, decresidual, syntdenum + (LPC_FILTERORDER + 1)*(NSUB - 1), (*iLBCdec_inst).last_lag, iLBCdec_inst); memcpy(decresidual, PLCresidual, BLOCKL*sizeof(float)); } } if (mode == 0) { /* the data is bad (either a PLC call * was made or a bit error was detected) */ /* packet loss conceal */ memset(zeros, 0, BLOCKL_MAX*sizeof(float)); one[0] = 1; memset(one+1, 0, LPC_FILTERORDER*sizeof(float)); start=0; doThePLC(PLCresidual, PLClpc, 1, zeros, one, (*iLBCdec_inst).last_lag, iLBCdec_inst); memcpy(decresidual, PLCresidual, BLOCKL*sizeof(float)); order_plus_one = LPC_FILTERORDER + 1; for (i = 0; i < NSUB; i++) { memcpy(syntdenum+(i*order_plus_one), PLClpc, order_plus_one*sizeof(float)); } } if ((*iLBCdec_inst).use_enhancer == 1) { /* post filtering */ (*iLBCdec_inst).last_lag = enhancerInterface(data, decresidual, iLBCdec_inst); /* synthesis filtering */ /* if (iLBCdec_inst->mode==20) {*/ /* Enhancer has 40 samples delay */ i=0; syntFilter(data + i*SUBL,(*iLBCdec_inst).old_syntdenum + (i+NSUB-1)*(LPC_FILTERORDER+1), SUBL, (*iLBCdec_inst).syntMem); for (i=1; i < NSUB; i++) { syntFilter(data + i*SUBL, syntdenum + (i-1)*(LPC_FILTERORDER+1), SUBL, (*iLBCdec_inst).syntMem); } /* 30ms for (i=0; i < 2; i++) { syntFilter(data + i*SUBL, (*iLBCdec_inst).old_syntdenum + (i+4)*(LPC_FILTERORDER+1), SUBL, (*iLBCdec_inst).syntMem); } for (i=2; i < NSUB; i++) { syntFilter(data + i*SUBL, syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL, (*iLBCdec_inst).syntMem); } */ } else { /* Find last lag */ lag = 20; maxcc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], &decresidual[BLOCKL_MAX-ENH_BLOCKL-lag], ENH_BLOCKL); for (ilag=21; ilag<120; ilag++) { cc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], &decresidual[BLOCKL_MAX-ENH_BLOCKL-ilag], ENH_BLOCKL); if (cc > maxcc) { maxcc = cc; lag = ilag; } } (*iLBCdec_inst).last_lag = lag; /* copy data and run synthesis filter */ memcpy(data, decresidual, BLOCKL*sizeof(float)); for (i=0; i < NSUB; i++) { syntFilter(data + i*SUBL, syntdenum + i*(LPC_FILTERORDER+1), SUBL, (*iLBCdec_inst).syntMem); } } /* high pass filtering on output if desired, otherwise copy to out */ /*hpOutput(data, BLOCKL, decblock, (*iLBCdec_inst).hpomem);*/ memcpy(decblock,data,BLOCKL*sizeof(float)); memcpy((*iLBCdec_inst).old_syntdenum, syntdenum, NSUB*(LPC_FILTERORDER+1)*sizeof(float)); iLBCdec_inst->prev_enh_pl=0; if (mode==0) { /* PLC was used */ iLBCdec_inst->prev_enh_pl=1; } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?