2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
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.
11 /******************************************************************
13 iLBC Speech Coder ANSI-C Source Code
15 WebRtcIlbcfix_GetCbVec.c
17 ******************************************************************/
20 #include "constants.h"
21 #include "create_augmented_vec.h"
23 /*----------------------------------------------------------------*
24 * Construct codebook vector for given index.
25 *---------------------------------------------------------------*/
27 void WebRtcIlbcfix_GetCbVec(
28 int16_t *cbvec, /* (o) Constructed codebook vector */
29 int16_t *mem, /* (i) Codebook buffer */
30 int16_t index, /* (i) Codebook index */
31 int16_t lMem, /* (i) Length of codebook buffer */
32 int16_t cbveclen /* (i) Codebook vector length */
37 int16_t tempbuff2[SUBL+5];
39 /* Determine size of codebook sections */
41 base_size=lMem-cbveclen+1;
44 base_size+=WEBRTC_SPL_RSHIFT_W16(cbveclen,1);
47 /* No filter -> First codebook section */
49 if (index<lMem-cbveclen+1) {
51 /* first non-interpolated vectors */
55 WEBRTC_SPL_MEMCPY_W16(cbvec, mem+lMem-k, cbveclen);
57 } else if (index < base_size) {
61 k=(int16_t)WEBRTC_SPL_MUL_16_16(2, (index-(lMem-cbveclen+1)))+cbveclen;
63 lag=WEBRTC_SPL_RSHIFT_W16(k, 1);
65 WebRtcIlbcfix_CreateAugmentedVec(lag, mem+lMem, cbvec);
69 /* Higher codebbok section based on filtering */
75 /* first non-interpolated vectors */
77 if (index-base_size<lMem-cbveclen+1) {
79 /* Set up filter memory, stuff zeros outside memory buffer */
81 memIndTest = lMem-(index-base_size+cbveclen);
83 WebRtcSpl_MemSetW16(mem-CB_HALFFILTERLEN, 0, CB_HALFFILTERLEN);
84 WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
86 /* do filtering to get the codebook vector */
88 WebRtcSpl_FilterMAFastQ12(
89 &mem[memIndTest+4], cbvec, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
90 CB_FILTERLEN, cbveclen);
93 /* interpolated vectors */
96 /* Stuff zeros outside memory buffer */
97 memIndTest = lMem-cbveclen-CB_FILTERLEN;
98 WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
101 WebRtcSpl_FilterMAFastQ12(
102 &mem[memIndTest+7], tempbuff2, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
103 CB_FILTERLEN, (int16_t)(cbveclen+5));
105 /* Calculate lag index */
106 lag = (cbveclen<<1)-20+index-base_size-lMem-1;
108 WebRtcIlbcfix_CreateAugmentedVec(lag, tempbuff2+SUBL+5, cbvec);