123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651 |
-
- #include <math.h>
- #include <stdlib.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"
-
- short initDecode(
- iLBC_Dec_Inst_t *iLBCdec_inst,
- int mode,
- int use_enhancer
- ){
- int i;
- iLBCdec_inst->mode = mode;
- if (mode==30) {
- iLBCdec_inst->blockl = BLOCKL_30MS;
- iLBCdec_inst->nsub = NSUB_30MS;
- iLBCdec_inst->nasub = NASUB_30MS;
- iLBCdec_inst->lpc_n = LPC_N_30MS;
- iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS;
- iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS;
- iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS;
-
- iLBCdec_inst->ULP_inst=&ULP_30msTbl;
- }
- else if (mode==20) {
- iLBCdec_inst->blockl = BLOCKL_20MS;
- iLBCdec_inst->nsub = NSUB_20MS;
- iLBCdec_inst->nasub = NASUB_20MS;
- iLBCdec_inst->lpc_n = LPC_N_20MS;
- iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS;
- iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS;
- iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS;
-
- iLBCdec_inst->ULP_inst=&ULP_20msTbl;
- }
- else {
- exit(2);
- }
- 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->per = 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 (short)(iLBCdec_inst->blockl);
- }
-
- void Decode(
- iLBC_Dec_Inst_t *iLBCdec_inst,
- float *decresidual,
- int start,
- int idxForMax,
- int *idxVec,
- float *syntdenum,
- int *cb_index,
- int *gain_index,
- int *extra_cb_index,
- int *extra_gain_index,
- int state_first
- ){
- float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];
- int k, meml_gotten, Nfor, Nback, i;
- int diff, start_pos;
- int subcount, subframe;
- diff = STATE_LEN - iLBCdec_inst->state_short_len;
- if (state_first == 1) {
- start_pos = (start-1)*SUBL;
- } else {
- start_pos = (start-1)*SUBL + diff;
- }
-
- StateConstructW(idxForMax, idxVec,
- &syntdenum[(start-1)*(LPC_FILTERORDER+1)],
- &decresidual[start_pos], iLBCdec_inst->state_short_len);
- if (state_first) {
-
- memset(mem, 0,
- (CB_MEML-iLBCdec_inst->state_short_len)*sizeof(float));
- memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len,
- decresidual+start_pos,
- iLBCdec_inst->state_short_len*sizeof(float));
-
- iCBConstruct(
- &decresidual[start_pos+iLBCdec_inst->state_short_len],
- extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl,
- stMemLTbl, diff, CB_NSTAGES);
- }
- else {
-
- for (k=0; k<diff; k++) {
- reverseDecresidual[k] =
- decresidual[(start+1)*SUBL-1-
- (k+iLBCdec_inst->state_short_len)];
- }
-
- meml_gotten = iLBCdec_inst->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));
-
- iCBConstruct(reverseDecresidual, extra_cb_index,
- extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl,
- diff, CB_NSTAGES);
-
- for (k=0; k<diff; k++) {
- decresidual[start_pos-1-k] = reverseDecresidual[k];
- }
- }
-
- subcount=0;
-
- Nfor = iLBCdec_inst->nsub-start-1;
- if ( Nfor > 0 ){
-
- memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float));
- memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,
- STATE_LEN*sizeof(float));
-
- for (subframe=0; subframe<Nfor; subframe++) {
-
- 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);
-
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
- memcpy(mem+CB_MEML-SUBL,
- &decresidual[(start+1+subframe)*SUBL],
- SUBL*sizeof(float));
- subcount++;
- }
- }
-
- Nback = start-1;
- if ( Nback > 0 ) {
-
- meml_gotten = SUBL*(iLBCdec_inst->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));
-
- for (subframe=0; subframe<Nback; subframe++) {
-
- iCBConstruct(&reverseDecresidual[subframe*SUBL],
- cb_index+subcount*CB_NSTAGES,
- gain_index+subcount*CB_NSTAGES,
- mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],
- SUBL, CB_NSTAGES);
-
- memmove(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
- memcpy(mem+CB_MEML-SUBL,
- &reverseDecresidual[subframe*SUBL],
- SUBL*sizeof(float));
- subcount++;
- }
-
- for (i=0; i<SUBL*Nback; i++)
- decresidual[SUBL*Nback - i - 1] =
- reverseDecresidual[i];
- }
- }
-
- void iLBC_decode(
- float *decblock,
- unsigned char *bytes,
- iLBC_Dec_Inst_t *iLBCdec_inst,
- int mode
- ){
- 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 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;
- int last_bit;
- 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) {
-
- pbytes=bytes;
- pos=0;
-
- 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<iLBCdec_inst->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<iLBCdec_inst->nasub; i++) {
- for (k=0; k<CB_NSTAGES; k++) {
- cb_index[i*CB_NSTAGES+k]=0;
- }
- }
- for (i=0; i<iLBCdec_inst->nasub; i++) {
- for (k=0; k<CB_NSTAGES; k++) {
- gain_index[i*CB_NSTAGES+k]=0;
- }
- }
-
- for (ulp=0; ulp<3; ulp++) {
-
- for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos);
- packcombine(&lsf_i[k], lastpart,
- iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]);
- }
-
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->start_bits[ulp], &pos);
- packcombine(&start, lastpart,
- iLBCdec_inst->ULP_inst->start_bits[ulp]);
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos);
- packcombine(&state_first, lastpart,
- iLBCdec_inst->ULP_inst->startfirst_bits[ulp]);
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos);
- packcombine(&idxForMax, lastpart,
- iLBCdec_inst->ULP_inst->scale_bits[ulp]);
- for (k=0; k<iLBCdec_inst->state_short_len; k++) {
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->state_bits[ulp], &pos);
- packcombine(idxVec+k, lastpart,
- iLBCdec_inst->ULP_inst->state_bits[ulp]);
- }
-
- for (k=0; k<CB_NSTAGES; k++) {
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp],
- &pos);
- packcombine(extra_cb_index+k, lastpart,
- iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]);
- }
- for (k=0; k<CB_NSTAGES; k++) {
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp],
- &pos);
- packcombine(extra_gain_index+k, lastpart,
- iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]);
- }
-
- for (i=0; i<iLBCdec_inst->nasub; i++) {
- for (k=0; k<CB_NSTAGES; k++) {
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->cb_index[i][k][ulp],
- &pos);
- packcombine(cb_index+i*CB_NSTAGES+k, lastpart,
- iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]);
- }
- }
- for (i=0; i<iLBCdec_inst->nasub; i++) {
- for (k=0; k<CB_NSTAGES; k++) {
- unpack( &pbytes, &lastpart,
- iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp],
- &pos);
- packcombine(gain_index+i*CB_NSTAGES+k, lastpart,
- iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]);
- }
- }
- }
-
- unpack( &pbytes, &last_bit, 1, &pos);
-
- if (start<1)
- mode = 0;
- if (iLBCdec_inst->mode==20 && start>3)
- mode = 0;
- if (iLBCdec_inst->mode==30 && start>5)
- mode = 0;
- if (last_bit==1)
- mode = 0;
- if (mode==1) {
-
- index_conv_dec(cb_index);
-
- SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n);
- LSF_check(lsfdeq, LPC_FILTERORDER,
- iLBCdec_inst->lpc_n);
- DecoderInterpolateLSF(syntdenum, weightdenum,
- lsfdeq, LPC_FILTERORDER, iLBCdec_inst);
- Decode(iLBCdec_inst, decresidual, start, idxForMax,
- idxVec, syntdenum, cb_index, gain_index,
- extra_cb_index, extra_gain_index,
- state_first);
-
- doThePLC(PLCresidual, PLClpc, 0, decresidual,
- syntdenum +
- (LPC_FILTERORDER + 1)*(iLBCdec_inst->nsub - 1),
- (*iLBCdec_inst).last_lag, iLBCdec_inst);
- memcpy(decresidual, PLCresidual,
- iLBCdec_inst->blockl*sizeof(float));
- }
- }
- if (mode == 0) {
-
-
- 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,
- iLBCdec_inst->blockl*sizeof(float));
- order_plus_one = LPC_FILTERORDER + 1;
- for (i = 0; i < iLBCdec_inst->nsub; i++) {
- memcpy(syntdenum+(i*order_plus_one), PLClpc,
- order_plus_one*sizeof(float));
- }
- }
- if (iLBCdec_inst->use_enhancer == 1) {
-
- iLBCdec_inst->last_lag =
- enhancerInterface(data, decresidual, iLBCdec_inst);
-
- if (iLBCdec_inst->mode==20) {
-
- i=0;
- syntFilter(data + i*SUBL,
- iLBCdec_inst->old_syntdenum +
- (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1),
- SUBL, iLBCdec_inst->syntMem);
- for (i=1; i < iLBCdec_inst->nsub; i++) {
- syntFilter(data + i*SUBL,
- syntdenum + (i-1)*(LPC_FILTERORDER+1),
- SUBL, iLBCdec_inst->syntMem);
- }
- } else if (iLBCdec_inst->mode==30) {
-
- for (i=0; i < 2; i++) {
- syntFilter(data + i*SUBL,
- iLBCdec_inst->old_syntdenum +
- (i+iLBCdec_inst->nsub-2)*(LPC_FILTERORDER+1),
- SUBL, iLBCdec_inst->syntMem);
- }
- for (i=2; i < iLBCdec_inst->nsub; i++) {
- syntFilter(data + i*SUBL,
- syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL,
- iLBCdec_inst->syntMem);
- }
- }
- } else {
-
- 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;
-
- memcpy(data, decresidual,
- iLBCdec_inst->blockl*sizeof(float));
- for (i=0; i < iLBCdec_inst->nsub; i++) {
- syntFilter(data + i*SUBL,
- syntdenum + i*(LPC_FILTERORDER+1), SUBL,
- iLBCdec_inst->syntMem);
- }
- }
-
- hpOutput(data, iLBCdec_inst->blockl,
- decblock,iLBCdec_inst->hpomem);
-
- memcpy(iLBCdec_inst->old_syntdenum, syntdenum,
- iLBCdec_inst->nsub*(LPC_FILTERORDER+1)*sizeof(float));
- iLBCdec_inst->prev_enh_pl=0;
- if (mode==0) {
- iLBCdec_inst->prev_enh_pl=1;
- }
- }
|