1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20
21 3GPP TS 26.173
22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31
32
33
34 Filename: dec_acelp_4p_in_64.cpp
35
36 Date: 05/08/2007
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41
42 Description:
43
44 ------------------------------------------------------------------------------
45 INPUT AND OUTPUT DEFINITIONS
46
47 int16 index[], (i) : index (20): 5+5+5+5 = 20 bits.
48 (i) : index (36): 9+9+9+9 = 36 bits.
49 (i) : index (44): 13+9+13+9 = 44 bits.
50 (i) : index (52): 13+13+13+13 = 52 bits.
51 (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.
52 (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.
53 (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.
54 int16 nbbits, (i) : 20, 36, 44, 52, 64, 72 or 88 bits
55 int16 code[] (o) Q9: algebraic (fixed) codebook excitation
56
57 ------------------------------------------------------------------------------
58 FUNCTION DESCRIPTION
59
60 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook decoder.
61 4 tracks x 16 positions per track = 64 samples.
62
63 20 bits --> 4 pulses in a frame of 64 samples.
64 36 bits --> 8 pulses in a frame of 64 samples.
65 44 bits --> 10 pulses in a frame of 64 samples.
66 52 bits --> 12 pulses in a frame of 64 samples.
67 64 bits --> 16 pulses in a frame of 64 samples.
68 72 bits --> 18 pulses in a frame of 64 samples.
69 88 bits --> 24 pulses in a frame of 64 samples.
70
71 All pulses can have two (2) possible amplitudes: +1 or -1.
72 Each pulse can have sixteen (16) possible positions.
73
74 ------------------------------------------------------------------------------
75 REQUIREMENTS
76
77
78 ------------------------------------------------------------------------------
79 REFERENCES
80
81 ------------------------------------------------------------------------------
82 PSEUDO-CODE
83
84 ------------------------------------------------------------------------------
85 */
86
87
88 /*----------------------------------------------------------------------------
89 ; INCLUDES
90 ----------------------------------------------------------------------------*/
91
92 #include "pv_amr_wb_type_defs.h"
93 #include "pvamrwbdecoder_basic_op.h"
94 #include "pvamrwbdecoder_cnst.h"
95 #include "pvamrwbdecoder_acelp.h"
96
97 #include "q_pulse.h"
98
99 /*----------------------------------------------------------------------------
100 ; MACROS
101 ; Define module specific macros here
102 ----------------------------------------------------------------------------*/
103
104
105 /*----------------------------------------------------------------------------
106 ; DEFINES
107 ; Include all pre-processor statements here. Include conditional
108 ; compile variables also.
109 ----------------------------------------------------------------------------*/
110 #define L_CODE 64 /* codevector length */
111 #define NB_TRACK 4 /* number of track */
112 #define NB_POS 16 /* number of position */
113
114 /*----------------------------------------------------------------------------
115 ; LOCAL FUNCTION DEFINITIONS
116 ; Function Prototype declaration
117 ----------------------------------------------------------------------------*/
118 #ifdef __cplusplus
119 extern "C"
120 {
121 #endif
122
123 void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[]);
124
125 #ifdef __cplusplus
126 }
127 #endif
128
129 /*----------------------------------------------------------------------------
130 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
131 ; Variable declaration - defined here and used outside this module
132 ----------------------------------------------------------------------------*/
133
134 /*----------------------------------------------------------------------------
135 ; EXTERNAL FUNCTION REFERENCES
136 ; Declare functions defined elsewhere and referenced in this module
137 ----------------------------------------------------------------------------*/
138
139 /*----------------------------------------------------------------------------
140 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
141 ; Declare variables used in this module but defined elsewhere
142 ----------------------------------------------------------------------------*/
143
144 /*----------------------------------------------------------------------------
145 ; FUNCTION CODE
146 ----------------------------------------------------------------------------*/
147
dec_acelp_4p_in_64(int16 index[],int16 nbbits,int16 code[])148 void dec_acelp_4p_in_64(
149 int16 index[], /* (i) : index (20): 5+5+5+5 = 20 bits. */
150 /* (i) : index (36): 9+9+9+9 = 36 bits. */
151 /* (i) : index (44): 13+9+13+9 = 44 bits. */
152 /* (i) : index (52): 13+13+13+13 = 52 bits. */
153 /* (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
154 /* (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
155 /* (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
156 int16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
157 int16 code[] /* (o) Q9: algebraic (fixed) codebook excitation */
158 )
159 {
160 int16 k, pos[6];
161 int32 L_index;
162 pv_memset(code, 0, L_CODE*sizeof(*code));
163
164 /* decode the positions and signs of pulses and build the codeword */
165
166
167 switch (nbbits)
168 {
169 case 20:
170 for (k = 0; k < NB_TRACK; k++)
171 {
172 L_index = index[k];
173 dec_1p_N1(L_index, 4, 0, pos);
174 add_pulses(pos, 1, k, code);
175 }
176 break;
177
178 case 36:
179 for (k = 0; k < NB_TRACK; k++)
180 {
181 L_index = index[k];
182 dec_2p_2N1(L_index, 4, 0, pos);
183 add_pulses(pos, 2, k, code);
184 }
185 break;
186 case 44:
187 for (k = 0; k < NB_TRACK - 2; k++)
188 {
189 L_index = index[k];
190 dec_3p_3N1(L_index, 4, 0, pos);
191 add_pulses(pos, 3, k, code);
192 }
193 for (k = 2; k < NB_TRACK; k++)
194 {
195 L_index = index[k];
196 dec_2p_2N1(L_index, 4, 0, pos);
197 add_pulses(pos, 2, k, code);
198 }
199 break;
200 case 52:
201 for (k = 0; k < NB_TRACK; k++)
202 {
203 L_index = index[k];
204 dec_3p_3N1(L_index, 4, 0, pos);
205 add_pulses(pos, 3, k, code);
206 }
207 break;
208 case 64:
209 for (k = 0; k < NB_TRACK; k++)
210 {
211 L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
212 dec_4p_4N(L_index, 4, 0, pos);
213 add_pulses(pos, 4, k, code);
214 }
215 break;
216 case 72:
217 for (k = 0; k < NB_TRACK - 2; k++)
218 {
219 L_index = ((int32)index[k] << 10) + index[k + NB_TRACK];
220 dec_5p_5N(L_index, 4, 0, pos);
221 add_pulses(pos, 5, k, code);
222 }
223 for (k = 2; k < NB_TRACK; k++)
224 {
225 L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
226 dec_4p_4N(L_index, 4, 0, pos);
227 add_pulses(pos, 4, k, code);
228 }
229 break;
230 case 88:
231 for (k = 0; k < NB_TRACK; k++)
232 {
233 L_index = ((int32)index[k] << 11) + index[k + NB_TRACK];
234 dec_6p_6N_2(L_index, 4, 0, pos);
235 add_pulses(pos, 6, k, code);
236 }
237 break;
238 default:
239 break;
240 }
241
242
243 }
244
245
246
add_pulses(int16 pos[],int16 nb_pulse,int16 track,int16 code[])247 void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[])
248 {
249 int16 i, k;
250
251 for (k = 0; k < nb_pulse; k++)
252 {
253 /* i = ((pos[k] & (NB_POS-1))*NB_TRACK) + track; */
254 i = ((pos[k] & (NB_POS - 1)) << 2) + track;
255
256 if ((pos[k] & NB_POS) == 0)
257 {
258 code[i] += 512;
259 }
260 else
261 {
262 code[i] -= 512;
263 }
264 }
265
266 }
267