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