16 #include "iLBC_define.h"
17 #include "StateConstructW.h"
18 #include "LPCdecode.h"
19 #include "iCBConstruct.h"
22 #include "constants.h"
27 #include "syntFilter.h"
43 iLBCdec_inst->mode = mode;
50 iLBCdec_inst->blockl = BLOCKL_30MS;
51 iLBCdec_inst->nsub = NSUB_30MS;
52 iLBCdec_inst->nasub = NASUB_30MS;
53 iLBCdec_inst->lpc_n = LPC_N_30MS;
54 iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS;
55 iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS;
56 iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS;
58 iLBCdec_inst->ULP_inst=&ULP_30msTbl;
61 iLBCdec_inst->blockl = BLOCKL_20MS;
62 iLBCdec_inst->nsub = NSUB_20MS;
63 iLBCdec_inst->nasub = NASUB_20MS;
64 iLBCdec_inst->lpc_n = LPC_N_20MS;
65 iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS;
66 iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS;
67 iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS;
69 iLBCdec_inst->ULP_inst=&ULP_20msTbl;
75 memset(iLBCdec_inst->syntMem, 0,
76 LPC_FILTERORDER*
sizeof(
float));
77 memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl,
78 LPC_FILTERORDER*
sizeof(
float));
80 memset(iLBCdec_inst->old_syntdenum, 0,
81 ((LPC_FILTERORDER + 1)*NSUB_MAX)*
sizeof(
float));
82 for (i=0; i<NSUB_MAX; i++)
83 iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0;
85 iLBCdec_inst->last_lag = 20;
87 iLBCdec_inst->prevLag = 120;
88 iLBCdec_inst->per = 0.0;
89 iLBCdec_inst->consPLICount = 0;
90 iLBCdec_inst->prevPLI = 0;
91 iLBCdec_inst->prevLpc[0] = 1.0;
92 memset(iLBCdec_inst->prevLpc+1,0,
93 LPC_FILTERORDER*
sizeof(
float));
94 memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX*
sizeof(
float));
95 iLBCdec_inst->seed=777;
102 memset(iLBCdec_inst->hpomem, 0, 4*
sizeof(
float));
104 iLBCdec_inst->use_enhancer = use_enhancer;
105 memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL*
sizeof(
float));
106 for (i=0;i<ENH_NBLOCKS_TOT;i++)
107 iLBCdec_inst->enh_period[i]=(
float)40.0;
109 iLBCdec_inst->prev_enh_pl = 0;
111 return (iLBCdec_inst->blockl);
138 int *extra_gain_index,
145 float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];
146 int k, meml_gotten, Nfor, Nback, i;
148 int subcount, subframe;
155 diff = STATE_LEN - iLBCdec_inst->state_short_len;
157 if (state_first == 1) {
158 start_pos = (start-1)*SUBL;
160 start_pos = (start-1)*SUBL + diff;
165 StateConstructW(idxForMax, idxVec,
166 &syntdenum[(start-1)*(LPC_FILTERORDER+1)],
167 &decresidual[start_pos], iLBCdec_inst->state_short_len);
175 (CB_MEML-iLBCdec_inst->state_short_len)*
sizeof(
float));
176 memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len,
177 decresidual+start_pos,
178 iLBCdec_inst->state_short_len*
sizeof(
float));
183 &decresidual[start_pos+iLBCdec_inst->state_short_len],
184 extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl,
185 stMemLTbl, diff, CB_NSTAGES);
192 for (k=0; k<diff; k++) {
193 reverseDecresidual[k] =
194 decresidual[(start+1)*SUBL-1-
195 (k+iLBCdec_inst->state_short_len)];
200 meml_gotten = iLBCdec_inst->state_short_len;
201 for (k=0; k<meml_gotten; k++){
202 mem[CB_MEML-1-k] = decresidual[start_pos + k];
209 memset(mem, 0, (CB_MEML-k)*
sizeof(
float));
213 iCBConstruct(reverseDecresidual, extra_cb_index,
214 extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl,
219 for (k=0; k<diff; k++) {
220 decresidual[start_pos-1-k] = reverseDecresidual[k];
230 Nfor = iLBCdec_inst->nsub-start-1;
236 memset(mem, 0, (CB_MEML-STATE_LEN)*
sizeof(
float));
237 memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,
238 STATE_LEN*
sizeof(
float));
242 for (subframe=0; subframe<Nfor; subframe++) {
246 iCBConstruct(&decresidual[(start+1+subframe)*SUBL],
247 cb_index+subcount*CB_NSTAGES,
248 gain_index+subcount*CB_NSTAGES,
249 mem+CB_MEML-memLfTbl[subcount],
250 memLfTbl[subcount], SUBL, CB_NSTAGES);
254 memmove(mem, mem+SUBL, (CB_MEML-SUBL)*
sizeof(
float));
255 memcpy(mem+CB_MEML-SUBL,
261 &decresidual[(start+1+subframe)*SUBL],
278 meml_gotten = SUBL*(iLBCdec_inst->nsub+1-start);
280 if ( meml_gotten > CB_MEML ) {
283 for (k=0; k<meml_gotten; k++) {
284 mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k];
286 memset(mem, 0, (CB_MEML-k)*
sizeof(
float));
290 for (subframe=0; subframe<Nback; subframe++) {
294 iCBConstruct(&reverseDecresidual[subframe*SUBL],
295 cb_index+subcount*CB_NSTAGES,
296 gain_index+subcount*CB_NSTAGES,
297 mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],
302 memmove(mem, mem+SUBL, (CB_MEML-SUBL)*
sizeof(
float));
303 memcpy(mem+CB_MEML-SUBL,
304 &reverseDecresidual[subframe*SUBL],
316 for (i=0; i<SUBL*Nback; i++)
317 decresidual[SUBL*Nback - i - 1] =
318 reverseDecresidual[i];
328 unsigned char *bytes,
334 float data[BLOCKL_MAX];
335 float lsfdeq[LPC_FILTERORDER*LPC_N_MAX];
336 float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1];
337 float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1];
338 int k, i, start, idxForMax, pos, lastpart, ulp;
341 int idxVec[STATE_LEN];
342 int gain_index[NASUB_MAX*CB_NSTAGES],
343 extra_gain_index[CB_NSTAGES];
344 int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES];
345 int lsf_i[LSF_NSPLIT*LPC_N_MAX];
348 unsigned char *pbytes;
349 float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
351 float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)];
352 float decresidual[BLOCKL_MAX];
368 for (k=0; k<LSF_NSPLIT*LPC_N_MAX; k++) {
374 for (k=0; k<iLBCdec_inst->state_short_len; k++) {
377 for (k=0; k<CB_NSTAGES; k++) {
380 for (k=0; k<CB_NSTAGES; k++) {
381 extra_gain_index[k]=0;
383 for (i=0; i<iLBCdec_inst->nasub; i++) {
384 for (k=0; k<CB_NSTAGES; k++) {
385 cb_index[i*CB_NSTAGES+k]=0;
388 for (i=0; i<iLBCdec_inst->nasub; i++) {
389 for (k=0; k<CB_NSTAGES; k++) {
390 gain_index[i*CB_NSTAGES+k]=0;
396 for (ulp=0; ulp<3; ulp++) {
399 for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){
400 unpack( &pbytes, &lastpart,
401 iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos);
402 packcombine(&lsf_i[k], lastpart,
403 iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]);
408 unpack( &pbytes, &lastpart,
409 iLBCdec_inst->ULP_inst->start_bits[ulp], &pos);
410 packcombine(&start, lastpart,
411 iLBCdec_inst->ULP_inst->start_bits[ulp]);
413 unpack( &pbytes, &lastpart,
419 iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos);
420 packcombine(&state_first, lastpart,
421 iLBCdec_inst->ULP_inst->startfirst_bits[ulp]);
423 unpack( &pbytes, &lastpart,
424 iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos);
425 packcombine(&idxForMax, lastpart,
426 iLBCdec_inst->ULP_inst->scale_bits[ulp]);
428 for (k=0; k<iLBCdec_inst->state_short_len; k++) {
429 unpack( &pbytes, &lastpart,
430 iLBCdec_inst->ULP_inst->state_bits[ulp], &pos);
431 packcombine(idxVec+k, lastpart,
432 iLBCdec_inst->ULP_inst->state_bits[ulp]);
437 for (k=0; k<CB_NSTAGES; k++) {
438 unpack( &pbytes, &lastpart,
439 iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp],
441 packcombine(extra_cb_index+k, lastpart,
442 iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]);
444 for (k=0; k<CB_NSTAGES; k++) {
445 unpack( &pbytes, &lastpart,
446 iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp],
448 packcombine(extra_gain_index+k, lastpart,
449 iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]);
454 for (i=0; i<iLBCdec_inst->nasub; i++) {
455 for (k=0; k<CB_NSTAGES; k++) {
456 unpack( &pbytes, &lastpart,
457 iLBCdec_inst->ULP_inst->cb_index[i][k][ulp],
459 packcombine(cb_index+i*CB_NSTAGES+k, lastpart,
460 iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]);
464 for (i=0; i<iLBCdec_inst->nasub; i++) {
465 for (k=0; k<CB_NSTAGES; k++) {
466 unpack( &pbytes, &lastpart,
472 iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp],
474 packcombine(gain_index+i*CB_NSTAGES+k, lastpart,
475 iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]);
481 unpack( &pbytes, &last_bit, 1, &pos);
486 if (iLBCdec_inst->mode==20 && start>3)
488 if (iLBCdec_inst->mode==30 && start>5)
497 index_conv_dec(cb_index);
501 SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n);
502 LSF_check(lsfdeq, LPC_FILTERORDER,
503 iLBCdec_inst->lpc_n);
504 DecoderInterpolateLSF(syntdenum, weightdenum,
505 lsfdeq, LPC_FILTERORDER, iLBCdec_inst);
507 Decode(iLBCdec_inst, decresidual, start, idxForMax,
508 idxVec, syntdenum, cb_index, gain_index,
509 extra_cb_index, extra_gain_index,
514 doThePLC(PLCresidual, PLClpc, 0, decresidual,
516 (LPC_FILTERORDER + 1)*(iLBCdec_inst->nsub - 1),
517 (*iLBCdec_inst).last_lag, iLBCdec_inst);
525 memcpy(decresidual, PLCresidual,
526 iLBCdec_inst->blockl*
sizeof(
float));
538 memset(zeros, 0, BLOCKL_MAX*
sizeof(
float));
541 memset(one+1, 0, LPC_FILTERORDER*
sizeof(
float));
545 doThePLC(PLCresidual, PLClpc, 1, zeros, one,
546 (*iLBCdec_inst).last_lag, iLBCdec_inst);
547 memcpy(decresidual, PLCresidual,
548 iLBCdec_inst->blockl*
sizeof(
float));
550 order_plus_one = LPC_FILTERORDER + 1;
551 for (i = 0; i < iLBCdec_inst->nsub; i++) {
552 memcpy(syntdenum+(i*order_plus_one), PLClpc,
553 order_plus_one*
sizeof(
float));
557 if (iLBCdec_inst->use_enhancer == 1) {
561 iLBCdec_inst->last_lag =
562 enhancerInterface(data, decresidual, iLBCdec_inst);
566 if (iLBCdec_inst->mode==20) {
569 syntFilter(data + i*SUBL,
570 iLBCdec_inst->old_syntdenum +
571 (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1),
572 SUBL, iLBCdec_inst->syntMem);
578 for (i=1; i < iLBCdec_inst->nsub; i++) {
579 syntFilter(data + i*SUBL,
580 syntdenum + (i-1)*(LPC_FILTERORDER+1),
581 SUBL, iLBCdec_inst->syntMem);
583 }
else if (iLBCdec_inst->mode==30) {
585 for (i=0; i < 2; i++) {
586 syntFilter(data + i*SUBL,
587 iLBCdec_inst->old_syntdenum +
588 (i+iLBCdec_inst->nsub-2)*(LPC_FILTERORDER+1),
589 SUBL, iLBCdec_inst->syntMem);
591 for (i=2; i < iLBCdec_inst->nsub; i++) {
592 syntFilter(data + i*SUBL,
593 syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL,
594 iLBCdec_inst->syntMem);
602 maxcc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL],
603 &decresidual[BLOCKL_MAX-ENH_BLOCKL-lag], ENH_BLOCKL);
605 for (ilag=21; ilag<120; ilag++) {
606 cc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL],
607 &decresidual[BLOCKL_MAX-ENH_BLOCKL-ilag],
615 iLBCdec_inst->last_lag = lag;
619 memcpy(data, decresidual,
620 iLBCdec_inst->blockl*
sizeof(
float));
621 for (i=0; i < iLBCdec_inst->nsub; i++) {
622 syntFilter(data + i*SUBL,
623 syntdenum + i*(LPC_FILTERORDER+1), SUBL,
624 iLBCdec_inst->syntMem);
636 hpOutput(data, iLBCdec_inst->blockl,
637 decblock,iLBCdec_inst->hpomem);
641 memcpy(iLBCdec_inst->old_syntdenum, syntdenum,
643 iLBCdec_inst->nsub*(LPC_FILTERORDER+1)*
sizeof(
float));
645 iLBCdec_inst->prev_enh_pl=0;
648 iLBCdec_inst->prev_enh_pl=1;