/src/pjsip/third_party/ilbc/iCBConstruct.c
Line | Count | Source |
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 | | |
28 | | void index_conv_enc( |
29 | | int *index /* (i/o) Codebook indexes */ |
30 | 427 | ){ |
31 | 427 | int k; |
32 | | |
33 | 1.28k | for (k=1; k<CB_NSTAGES; k++) { |
34 | | |
35 | 854 | if ((index[k]>=108)&&(index[k]<172)) { |
36 | 438 | index[k]-=64; |
37 | 438 | } else if (index[k]>=236) { |
38 | 196 | index[k]-=128; |
39 | 220 | } else { |
40 | | /* ERROR */ |
41 | 220 | } |
42 | 854 | } |
43 | 427 | } |
44 | | |
45 | | void index_conv_dec( |
46 | | int *index /* (i/o) Codebook indexes */ |
47 | 182 | ){ |
48 | 182 | int k; |
49 | | |
50 | 546 | for (k=1; k<CB_NSTAGES; k++) { |
51 | | |
52 | 364 | if ((index[k]>=44)&&(index[k]<108)) { |
53 | 183 | index[k]+=64; |
54 | 183 | } else if ((index[k]>=108)&&(index[k]<128)) { |
55 | 86 | index[k]+=128; |
56 | 95 | } else { |
57 | | /* ERROR */ |
58 | 95 | } |
59 | 364 | } |
60 | 182 | } |
61 | | |
62 | | /*----------------------------------------------------------------* |
63 | | * Construct decoded vector from codebook and gains. |
64 | | *---------------------------------------------------------------*/ |
65 | | |
66 | | void iCBConstruct( |
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 | 3.04k | ){ |
75 | 3.04k | int j,k; |
76 | | |
77 | | |
78 | | |
79 | | |
80 | | |
81 | 3.04k | float gain[CB_NSTAGES]; |
82 | 3.04k | float cbvec[SUBL]; |
83 | | |
84 | | /* gain de-quantization */ |
85 | | |
86 | 3.04k | gain[0] = gaindequant(gain_index[0], 1.0, 32); |
87 | 3.04k | if (nStages > 1) { |
88 | 3.04k | gain[1] = gaindequant(gain_index[1], |
89 | 3.04k | (float)fabs(gain[0]), 16); |
90 | 3.04k | } |
91 | 3.04k | if (nStages > 2) { |
92 | 3.04k | gain[2] = gaindequant(gain_index[2], |
93 | 3.04k | (float)fabs(gain[1]), 8); |
94 | 3.04k | } |
95 | | |
96 | | /* codebook vector construction and construction of |
97 | | total vector */ |
98 | | |
99 | 3.04k | getCBvec(cbvec, mem, index[0], lMem, veclen); |
100 | 113k | for (j=0;j<veclen;j++){ |
101 | 110k | decvector[j] = gain[0]*cbvec[j]; |
102 | 110k | } |
103 | 3.04k | if (nStages > 1) { |
104 | 9.13k | for (k=1; k<nStages; k++) { |
105 | 6.09k | getCBvec(cbvec, mem, index[k], lMem, veclen); |
106 | 227k | for (j=0;j<veclen;j++) { |
107 | 221k | decvector[j] += gain[k]*cbvec[j]; |
108 | 221k | } |
109 | 6.09k | } |
110 | 3.04k | } |
111 | 3.04k | } |
112 | | |