📄 ilbc_encode.cxx
字号:
//A.3 iLBC_encode.c /****************************************************************** iLBC Speech Coder ANSI-C Source Code iLBC_encode.c Copyright (c) 2001, Global IP Sound AB. All rights reserved. ******************************************************************/ #include <math.h> #include <string.h> #include"iLBC_define.h"#include"LPCencode.h"#include"FrameClassify.h"#include"StateSearchW.h"#include"StateConstructW.h"#include"helpfun.h"#include"constants.h"#include"packing.h"#include"iCBSearch.h"#include"iCBConstruct.h"#include"hpInput.h"#include"anaFilter.h"#include"syntFilter.h" /*----------------------------------------------------------------* * Initiation of encoder instance. *---------------------------------------------------------------*/ short initEncode( /* (o) Number of bytes encoded */ iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) Encoder instance */ ){ memset((*iLBCenc_inst).anaMem, 0, LPC_FILTERORDER*sizeof(float)); memcpy((*iLBCenc_inst).lsfold, lsfmeanTbl, LPC_FILTERORDER*sizeof(float)); memcpy((*iLBCenc_inst).lsfdeqold, lsfmeanTbl, LPC_FILTERORDER*sizeof(float)); memset((*iLBCenc_inst).lpc_buffer, 0, (LPC_LOOKBACK+BLOCKL_MAX)*sizeof(float)); memset((*iLBCenc_inst).hpimem, 0, 4*sizeof(float)); return (NO_OF_BYTES); } /*----------------------------------------------------------------* * main encoder function Andersen et. al. Experimental - Expires March 20th, 2003 46 Internet Low Bit Rate Codec September 2002 *---------------------------------------------------------------*/ void iLBC_encode( unsigned char *bytes, /* (o) encoded data bits iLBC */ float *block, /* (o) speech vector to encode */ iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder state */ ){ float data[BLOCKL_MAX]; float residual[BLOCKL_MAX], reverseResidual[BLOCKL_MAX]; int start, idxForMax, idxVec[STATE_LEN]; float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; int n, k, meml_gotten, Nfor, Nback, i, pos; int gain_index[CB_NSTAGES*NASUB_MAX], 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]; unsigned char *pbytes; int diff, start_pos, state_first; float en1, en2; int index, ulp, firstpart; int subcount, subframe; float weightState[LPC_FILTERORDER]; float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; float weightdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; float decresidual[BLOCKL_MAX]; /* high pass filtering of input signal if such is not done prior to calling this function */ /*hpInput(block, BLOCKL, data, (*iLBCenc_inst).hpimem);*/ /* otherwise simply copy */ memcpy(data,block,BLOCKL*sizeof(float)); /* LPC of hp filtered input data */ LPCencode(syntdenum, weightdenum, lsf_i, data, iLBCenc_inst); /* inverse filter to get residual */ for (n=0; n<NSUB; n++ ) { anaFilter(&data[n*SUBL], &syntdenum[n*(LPC_FILTERORDER+1)], SUBL, &residual[n*SUBL], (*iLBCenc_inst).anaMem); } /* find state location */ start = FrameClassify(residual); /* check if state should be in first or last part of the two subframes */ diff = STATE_LEN - STATE_SHORT_LEN; en1 = 0; index = (start-1)*SUBL; for (i = 0; i < STATE_SHORT_LEN; i++) { en1 += residual[index+i]*residual[index+i]; } en2 = 0; index = (start-1)*SUBL+diff; for (i = 0; i < STATE_SHORT_LEN; i++) { en2 += residual[index+i]*residual[index+i]; } if (en1 > en2) { state_first = 1; start_pos = (start-1)*SUBL; } else { state_first = 0; start_pos = (start-1)*SUBL + diff; } /* scalar quantization of state */ StateSearchW(&residual[start_pos], &syntdenum[(start-1)*(LPC_FILTERORDER+1)], &weightdenum[(start-1)*(LPC_FILTERORDER+1)], &idxForMax, idxVec, STATE_SHORT_LEN, state_first); StateConstructW(idxForMax, idxVec, &syntdenum[(start-1)*(LPC_FILTERORDER+1)], &decresidual[start_pos], STATE_SHORT_LEN); /* predictive quantization in state */ 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)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); /* encode subframes */ iCBSearch(extra_cb_index, extra_gain_index, &residual[start_pos+STATE_SHORT_LEN], mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES, &weightdenum[start*(LPC_FILTERORDER+1)], weightState, 0); /* 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++ ){ reverseResidual[k] = residual[(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)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); /* encode subframes */ iCBSearch(extra_cb_index, extra_gain_index, reverseResidual, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES, &weightdenum[(start-1)*(LPC_FILTERORDER+1)], weightState, 0); /* 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)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -