ilbc_decode.cxx
来自「MiniSip Client with DomainKeys Authentic」· CXX 代码 · 共 547 行 · 第 1/2 页
CXX
547 行
//A.5 iLBC_decode.c /****************************************************************** iLBC Speech Coder ANSI-C Source Code iLBC_decode.c Copyright (c) 2001, Global IP Sound AB. All rights reserved. ******************************************************************/ #include <math.h> #include <stdlib.h> #include <string.h> #include"iLBC_define.h" #include"StateConstructW.h" #include"LPCdecode.h" #include"iCBConstruct.h" #include"doCPLC.h" #include"helpfun.h" #include"constants.h" #include"packing.h" #include "string.h" #include"enhancer.h" #include"hpOutput.h" #include"syntFilter.h" /*----------------------------------------------------------------* * Initiation of decoder instance. *---------------------------------------------------------------*/ short initDecode( /* (o) Number of decoded samples */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ int use_enhancer /* (i) 1 to use enhancer 0 to run without enhancer */ ){ int i; memset((*iLBCdec_inst).syntMem, 0, LPC_FILTERORDER*sizeof(float)); memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl, LPC_FILTERORDER*sizeof(float)); memset((*iLBCdec_inst).old_syntdenum, 0, ((LPC_FILTERORDER + 1)*NSUB_MAX)*sizeof(float)); for (i=0; i<NSUB_MAX; i++) (*iLBCdec_inst).old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0; (*iLBCdec_inst).last_lag = 20; (*iLBCdec_inst).prevLag = 120; (*iLBCdec_inst).prevGain = 0.0; (*iLBCdec_inst).consPLICount = 0; (*iLBCdec_inst).prevPLI = 0; (*iLBCdec_inst).prevLpc[0] = 1.0; memset((*iLBCdec_inst).prevLpc+1,0, LPC_FILTERORDER*sizeof(float)); memset((*iLBCdec_inst).prevResidual, 0, BLOCKL_MAX*sizeof(float)); (*iLBCdec_inst).seed=777; memset((*iLBCdec_inst).hpomem, 0, 4*sizeof(float)); (*iLBCdec_inst).use_enhancer = use_enhancer; memset((*iLBCdec_inst).enh_buf, 0, ENH_BUFL*sizeof(float)); for (i=0;i<ENH_NBLOCKS_TOT;i++) (*iLBCdec_inst).enh_period[i]=(float)40.0; iLBCdec_inst->prev_enh_pl = 0; return (BLOCKL); } /*----------------------------------------------------------------* * frame residual decoder function (subrutine to iLBC_decode) *---------------------------------------------------------------*/ void Decode( float *decresidual, /* (o) decoded residual frame */ int start, /* (i) location of start state */ int idxForMax, /* (i) codebook index for the maximum value */ int *idxVec, /* (i) codebook indexes for the samples in the start state */ float *syntdenum, /* (i) the decoded synthesis filter coefficients */ int *cb_index, /* (i) the indexes for the adaptive codebook */ int *gain_index, /* (i) the indexes for the corresponding gains */ int *extra_cb_index,/* (i) the indexes for the adaptive codebook part of start state */ int *extra_gain_index, /* (i) the indexes for the corresponding gains */ int state_first /* (i) 1 if non adaptive part of start state comes first 0 if that part comes last */ ){ float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; int k, meml_gotten, Nfor, Nback, i; int diff, start_pos; int subcount, subframe; diff = STATE_LEN - STATE_SHORT_LEN; if (state_first == 1) { start_pos = (start-1)*SUBL; } else { start_pos = (start-1)*SUBL + diff; } /* decode scalar part of start state */ StateConstructW(idxForMax, idxVec, &syntdenum[(start-1)*(LPC_FILTERORDER+1)], &decresidual[start_pos], STATE_SHORT_LEN); if (state_first) { /* put adaptive part in the end */ /* setup memory */ memset(mem, 0, (CB_MEML-STATE_SHORT_LEN)*sizeof(float)); memcpy(mem+CB_MEML-STATE_SHORT_LEN, decresidual+start_pos, STATE_SHORT_LEN*sizeof(float)); /* construct decoded vector */ iCBConstruct(&decresidual[start_pos+STATE_SHORT_LEN], extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES); } else {/* put adaptive part in the beginning */ /* create reversed vectors for prediction */ for(k=0; k<diff; k++ ){ reverseDecresidual[k] = decresidual[(start+1)*SUBL -1-(k+STATE_SHORT_LEN)]; } /* setup memory */ meml_gotten = STATE_SHORT_LEN; for( k=0; k<meml_gotten; k++){ mem[CB_MEML-1-k] = decresidual[start_pos + k]; } memset(mem, 0, (CB_MEML-k)*sizeof(float)); /* construct decoded vector */ iCBConstruct(reverseDecresidual, extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES); /* get decoded residual from reversed vector */ for( k=0; k<diff; k++ ){ decresidual[start_pos-1-k] = reverseDecresidual[k]; } } /* counter for predicted subframes */ subcount=0; /* forward prediction of subframes */ Nfor = NSUB-start-1; if( Nfor > 0 ){ /* setup memory */ memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, STATE_LEN*sizeof(float)); /* loop over subframes to encode */ for (subframe=0; subframe<Nfor; subframe++) { /* construct decoded vector */ iCBConstruct(&decresidual[(start+1+subframe)*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES); /* update memory */ memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL, &decresidual[(start+1+subframe)*SUBL], SUBL*sizeof(float)); subcount++; } } /* backward prediction of subframes */ Nback = start-1; if( Nback > 0 ){ /* setup memory */ meml_gotten = SUBL*(NSUB+1-start); if( meml_gotten > CB_MEML ) { meml_gotten=CB_MEML; } for( k=0; k<meml_gotten; k++) { mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; } memset(mem, 0, (CB_MEML-k)*sizeof(float)); /* loop over subframes to decode */ for (subframe=0; subframe<Nback; subframe++) { /* construct decoded vector */ iCBConstruct(&reverseDecresidual[subframe*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES); /* update memory */ memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL, &reverseDecresidual[subframe*SUBL], SUBL*sizeof(float)); subcount++; } /* get decoded residual from reversed vector */ for (i = 0; i < SUBL*Nback; i++) decresidual[SUBL*Nback - i - 1] = reverseDecresidual[i]; } } /*----------------------------------------------------------------* * main decoder function *---------------------------------------------------------------*/ void iLBC_decode( float *decblock, /* (o) decoded signal block */ unsigned char *bytes, /* (i) encoded signal bits */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */ int mode /* (i) 0: bad packet, PLC,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?