1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /****************************************************************** 12 13 iLBC Speech Coder ANSI-C Source Code 14 15 WebRtcIlbcfix_StateConstruct.c 16 17 ******************************************************************/ 18 19 #include "defines.h" 20 #include "constants.h" 21 22 /*----------------------------------------------------------------* 23 * decoding of the start state 24 *---------------------------------------------------------------*/ 25 26 void WebRtcIlbcfix_StateConstruct( 27 size_t idxForMax, /* (i) 6-bit index for the quantization of 28 max amplitude */ 29 int16_t *idxVec, /* (i) vector of quantization indexes */ 30 int16_t *syntDenum, /* (i) synthesis filter denumerator */ 31 int16_t *Out_fix, /* (o) the decoded state vector */ 32 size_t len /* (i) length of a state vector */ 33 ) { 34 size_t k; 35 int16_t maxVal; 36 int16_t *tmp1, *tmp2, *tmp3; 37 /* Stack based */ 38 int16_t numerator[1+LPC_FILTERORDER]; 39 int16_t sampleValVec[2*STATE_SHORT_LEN_30MS+LPC_FILTERORDER]; 40 int16_t sampleMaVec[2*STATE_SHORT_LEN_30MS+LPC_FILTERORDER]; 41 int16_t *sampleVal = &sampleValVec[LPC_FILTERORDER]; 42 int16_t *sampleMa = &sampleMaVec[LPC_FILTERORDER]; 43 int16_t *sampleAr = &sampleValVec[LPC_FILTERORDER]; 44 45 /* initialization of coefficients */ 46 47 for (k=0; k<LPC_FILTERORDER+1; k++){ 48 numerator[k] = syntDenum[LPC_FILTERORDER-k]; 49 } 50 51 /* decoding of the maximum value */ 52 53 maxVal = WebRtcIlbcfix_kFrgQuantMod[idxForMax]; 54 55 /* decoding of the sample values */ 56 tmp1 = sampleVal; 57 tmp2 = &idxVec[len-1]; 58 59 if (idxForMax<37) { 60 for(k=0; k<len; k++){ 61 /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 2097152 (= 0.5 << 22) 62 maxVal is in Q8 and result is in Q(-1) */ 63 *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 2097152) >> 64 22); 65 tmp1++; 66 tmp2--; 67 } 68 } else if (idxForMax<59) { 69 for(k=0; k<len; k++){ 70 /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 262144 (= 0.5 << 19) 71 maxVal is in Q5 and result is in Q(-1) */ 72 *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 262144) >> 73 19); 74 tmp1++; 75 tmp2--; 76 } 77 } else { 78 for(k=0; k<len; k++){ 79 /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 65536 (= 0.5 << 17) 80 maxVal is in Q3 and result is in Q(-1) */ 81 *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 65536) >> 82 17); 83 tmp1++; 84 tmp2--; 85 } 86 } 87 88 /* Set the rest of the data to zero */ 89 WebRtcSpl_MemSetW16(&sampleVal[len], 0, len); 90 91 /* circular convolution with all-pass filter */ 92 93 /* Set the state to zero */ 94 WebRtcSpl_MemSetW16(sampleValVec, 0, (LPC_FILTERORDER)); 95 96 /* Run MA filter + AR filter */ 97 WebRtcSpl_FilterMAFastQ12( 98 sampleVal, sampleMa, 99 numerator, LPC_FILTERORDER+1, len + LPC_FILTERORDER); 100 WebRtcSpl_MemSetW16(&sampleMa[len + LPC_FILTERORDER], 0, (len - LPC_FILTERORDER)); 101 WebRtcSpl_FilterARFastQ12( 102 sampleMa, sampleAr, 103 syntDenum, LPC_FILTERORDER+1, 2 * len); 104 105 tmp1 = &sampleAr[len-1]; 106 tmp2 = &sampleAr[2*len-1]; 107 tmp3 = Out_fix; 108 for(k=0;k<len;k++){ 109 (*tmp3) = (*tmp1) + (*tmp2); 110 tmp1--; 111 tmp2--; 112 tmp3++; 113 } 114 } 115