Asterisk - The Open Source Telephony Project  18.5.0
iCBConstruct.c
Go to the documentation of this file.
1 
2  /******************************************************************
3 
4  iLBC Speech Coder ANSI-C Source Code
5 
6  iCBConstruct.c
7 
8  Copyright (C) The Internet Society (2004).
9  All Rights Reserved.
10 
11  ******************************************************************/
12 
13  #include <math.h>
14 
15  #include "iLBC_define.h"
16  #include "gainquant.h"
17  #include "getCBvec.h"
18 
19  /*----------------------------------------------------------------*
20  * Convert the codebook indexes to make the search easier
21  *---------------------------------------------------------------*/
22 
23 
24 
25 
26 
27 
29  int *index /* (i/o) Codebook indexes */
30  ){
31  int k;
32 
33  for (k=1; k<CB_NSTAGES; k++) {
34 
35  if ((index[k]>=108)&&(index[k]<172)) {
36  index[k]-=64;
37  } else if (index[k]>=236) {
38  index[k]-=128;
39  } else {
40  /* ERROR */
41  }
42  }
43  }
44 
46  int *index /* (i/o) Codebook indexes */
47  ){
48  int k;
49 
50  for (k=1; k<CB_NSTAGES; k++) {
51 
52  if ((index[k]>=44)&&(index[k]<108)) {
53  index[k]+=64;
54  } else if ((index[k]>=108)&&(index[k]<128)) {
55  index[k]+=128;
56  } else {
57  /* ERROR */
58  }
59  }
60  }
61 
62  /*----------------------------------------------------------------*
63  * Construct decoded vector from codebook and gains.
64  *---------------------------------------------------------------*/
65 
67  float *decvector, /* (o) Decoded vector */
68  int *index, /* (i) Codebook indices */
69  int *gain_index,/* (i) Gain quantization indices */
70  float *mem, /* (i) Buffer for codevector construction */
71  int lMem, /* (i) Length of buffer */
72  int veclen, /* (i) Length of vector */
73  int nStages /* (i) Number of codebook stages */
74  ){
75  int j,k;
76 
77 
78 
79 
80 
81  float gain[CB_NSTAGES];
82  float cbvec[SUBL];
83 
84  /* gain de-quantization */
85 
86  gain[0] = gaindequant(gain_index[0], 1.0, 32);
87  if (nStages > 1) {
88  gain[1] = gaindequant(gain_index[1],
89  (float)fabs(gain[0]), 16);
90  }
91  if (nStages > 2) {
92  gain[2] = gaindequant(gain_index[2],
93  (float)fabs(gain[1]), 8);
94  }
95 
96  /* codebook vector construction and construction of
97  total vector */
98 
99  getCBvec(cbvec, mem, index[0], lMem, veclen);
100  for (j=0;j<veclen;j++){
101  decvector[j] = gain[0]*cbvec[j];
102  }
103  if (nStages > 1) {
104  for (k=1; k<nStages; k++) {
105  getCBvec(cbvec, mem, index[k], lMem, veclen);
106  for (j=0;j<veclen;j++) {
107  decvector[j] += gain[k]*cbvec[j];
108  }
109  }
110  }
111  }
#define CB_NSTAGES
Definition: iLBC_define.h:56
void getCBvec(float *cbvec, float *mem, int index, int lMem, int cbveclen)
Definition: getCBvec.c:21
void iCBConstruct(float *decvector, int *index, int *gain_index, float *mem, int lMem, int veclen, int nStages)
Definition: iCBConstruct.c:66
#define SUBL
Definition: iLBC_define.h:33
float gaindequant(int index, float maxIn, int cblen)
Definition: gainquant.c:83
void index_conv_enc(int *index)
Definition: iCBConstruct.c:28
void index_conv_dec(int *index)
Definition: iCBConstruct.c:45