1 2 /****************************************************************** 3 4 iLBC Speech Coder ANSI-C Source Code 5 6 LPC_decode.c 7 8 Copyright (C) The Internet Society (2004). 9 All Rights Reserved. 10 11 ******************************************************************/ 12 13 #include <math.h> 14 #include <string.h> 15 16 #include "helpfun.h" 17 #include "lsf.h" 18 #include "iLBC_define.h" 19 #include "constants.h" 20 21 /*---------------------------------------------------------------* 22 * interpolation of lsf coefficients for the decoder 23 *--------------------------------------------------------------*/ 24 LSFinterpolate2a_dec(float * a,float * lsf1,float * lsf2,float coef,int length)25 void LSFinterpolate2a_dec( 26 float *a, /* (o) lpc coefficients for a sub-frame */ 27 float *lsf1, /* (i) first lsf coefficient vector */ 28 float *lsf2, /* (i) second lsf coefficient vector */ 29 float coef, /* (i) interpolation weight */ 30 int length /* (i) length of lsf vectors */ 31 ){ 32 float lsftmp[LPC_FILTERORDER]; 33 34 interpolate(lsftmp, lsf1, lsf2, coef, length); 35 lsf2a(a, lsftmp); 36 } 37 38 /*---------------------------------------------------------------* 39 * obtain dequantized lsf coefficients from quantization index 40 *--------------------------------------------------------------*/ 41 SimplelsfDEQ(float * lsfdeq,int * index,int lpc_n)42 void SimplelsfDEQ( 43 float *lsfdeq, /* (o) dequantized lsf coefficients */ 44 int *index, /* (i) quantization index */ 45 int lpc_n /* (i) number of LPCs */ 46 ){ 47 int i, j, pos, cb_pos; 48 49 50 51 52 53 /* decode first LSF */ 54 55 pos = 0; 56 cb_pos = 0; 57 for (i = 0; i < LSF_NSPLIT; i++) { 58 for (j = 0; j < dim_lsfCbTbl[i]; j++) { 59 lsfdeq[pos + j] = lsfCbTbl[cb_pos + 60 (long)(index[i])*dim_lsfCbTbl[i] + j]; 61 } 62 pos += dim_lsfCbTbl[i]; 63 cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 64 } 65 66 if (lpc_n>1) { 67 68 /* decode last LSF */ 69 70 pos = 0; 71 cb_pos = 0; 72 for (i = 0; i < LSF_NSPLIT; i++) { 73 for (j = 0; j < dim_lsfCbTbl[i]; j++) { 74 lsfdeq[LPC_FILTERORDER + pos + j] = 75 lsfCbTbl[cb_pos + 76 (long)(index[LSF_NSPLIT + i])* 77 dim_lsfCbTbl[i] + j]; 78 } 79 pos += dim_lsfCbTbl[i]; 80 cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 81 } 82 } 83 } 84 85 /*----------------------------------------------------------------* 86 * obtain synthesis and weighting filters form lsf coefficients 87 *---------------------------------------------------------------*/ 88 DecoderInterpolateLSF(float * syntdenum,float * weightdenum,float * lsfdeq,int length,iLBC_Dec_Inst_t * iLBCdec_inst)89 void DecoderInterpolateLSF( 90 float *syntdenum, /* (o) synthesis filter coefficients */ 91 float *weightdenum, /* (o) weighting denumerator 92 coefficients */ 93 float *lsfdeq, /* (i) dequantized lsf coefficients */ 94 int length, /* (i) length of lsf coefficient vector */ 95 iLBC_Dec_Inst_t *iLBCdec_inst 96 /* (i) the decoder state structure */ 97 ){ 98 int i, pos, lp_length; 99 float lp[LPC_FILTERORDER + 1], *lsfdeq2; 100 101 102 103 104 105 106 lsfdeq2 = lsfdeq + length; 107 lp_length = length + 1; 108 109 if (iLBCdec_inst->mode==30) { 110 /* sub-frame 1: Interpolation between old and first */ 111 112 LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq, 113 lsf_weightTbl_30ms[0], length); 114 memcpy(syntdenum,lp,lp_length*sizeof(float)); 115 bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, 116 lp_length); 117 118 /* sub-frames 2 to 6: interpolation between first 119 and last LSF */ 120 121 pos = lp_length; 122 for (i = 1; i < 6; i++) { 123 LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2, 124 lsf_weightTbl_30ms[i], length); 125 memcpy(syntdenum + pos,lp,lp_length*sizeof(float)); 126 bwexpand(weightdenum + pos, lp, 127 LPC_CHIRP_WEIGHTDENUM, lp_length); 128 pos += lp_length; 129 } 130 } 131 else { 132 pos = 0; 133 for (i = 0; i < iLBCdec_inst->nsub; i++) { 134 LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, 135 lsfdeq, lsf_weightTbl_20ms[i], length); 136 memcpy(syntdenum+pos,lp,lp_length*sizeof(float)); 137 bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM, 138 lp_length); 139 pos += lp_length; 140 } 141 } 142 143 /* update memory */ 144 145 if (iLBCdec_inst->mode==30) 146 memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2, 147 length*sizeof(float)); 148 else 149 memcpy(iLBCdec_inst->lsfdeqold, lsfdeq, 150 length*sizeof(float)); 151 152 } 153 154 155 156 157 158 159