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.073
22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2004, 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 Pathname: ./audio/gsm-amr/c/src/dec_lag3.c
35 Functions: Dec_lag3
36
37 Date: 01/31/2002
38
39 ------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description:
43 (1) Updated to accept new parameter, Flag *pOverflow.
44 (2) Placed file in the proper PV Software template.
45
46 Description:
47 (1) Removed "count.h" and "basic_op.h" and replaced with individual include
48 files (add.h, sub.h, etc.)
49
50 Description:
51 (1) Removed optimization -- mult(i, 3, pOverflow) is NOT the same as adding
52 i to itself 3 times. The reason is because the mult function does a
53 right shift by 15, which will obliterate smaller numbers.
54
55 Description: Replaced "int" and/or "char" with OSCL defined types.
56
57 Description:
58
59 ------------------------------------------------------------------------------
60 INPUT AND OUTPUT DEFINITIONS
61
62 Inputs:
63 index -- Word16 -- received pitch index
64 t0_min -- Word16 -- minimum of search range
65 t0_max -- Word16 -- maximum of search range
66 i_subfr -- Word16 -- subframe flag
67 T0_prev -- Word16 -- integer pitch delay of last subframe
68 used in 2nd and 4th subframes
69 flag4 -- Word16 -- flag for encoding with 4 bits
70
71 Outputs:
72
73 T0 -- Pointer to type Word16 -- integer part of pitch lag
74 T0_frac -- Pointer to type Word16 -- fractional part of pitch lag
75 pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
76
77 Returns:
78 None.
79
80 Global Variables Used:
81 None
82
83 Local Variables Needed:
84 None
85
86
87 )
88 ------------------------------------------------------------------------------
89 FUNCTION DESCRIPTION
90
91 PURPOSE: Decoding of fractional pitch lag with 1/3 resolution.
92 Extract the integer and fraction parts of the pitch lag from
93 the received adaptive codebook index.
94
95 See "Enc_lag3.c" for more details about the encoding procedure.
96
97 The fractional lag in 1st and 3rd subframes is encoded with 8 bits
98 while that in 2nd and 4th subframes is relatively encoded with 4, 5
99 and 6 bits depending on the mode.
100
101 ------------------------------------------------------------------------------
102 REQUIREMENTS
103
104
105
106 ------------------------------------------------------------------------------
107 REFERENCES
108
109 dec_lag3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
110
111 ------------------------------------------------------------------------------
112 PSEUDO-CODE
113
114
115
116 ------------------------------------------------------------------------------
117 RESOURCES USED
118 When the code is written for a specific target processor the
119 the resources used should be documented below.
120
121 STACK USAGE: [stack count for this module] + [variable to represent
122 stack usage for each subroutine called]
123
124 where: [stack usage variable] = stack usage for [subroutine
125 name] (see [filename].ext)
126
127 DATA MEMORY USED: x words
128
129 PROGRAM MEMORY USED: x words
130
131 CLOCK CYCLES: [cycle count equation for this module] + [variable
132 used to represent cycle count for each subroutine
133 called]
134
135 where: [cycle count variable] = cycle count for [subroutine
136 name] (see [filename].ext)
137
138 ------------------------------------------------------------------------------
139 */
140
141
142 /*----------------------------------------------------------------------------
143 ; INCLUDES
144 ----------------------------------------------------------------------------*/
145 #include "dec_lag3.h"
146 #include "typedef.h"
147 #include "basic_op.h"
148
149 /*----------------------------------------------------------------------------
150 ; MACROS
151 ; Define module specific macros here
152 ----------------------------------------------------------------------------*/
153
154
155 /*----------------------------------------------------------------------------
156 ; DEFINES
157 ; Include all pre-processor statements here. Include conditional
158 ; compile variables also.
159 ----------------------------------------------------------------------------*/
160
161 /*----------------------------------------------------------------------------
162 ; LOCAL FUNCTION DEFINITIONS
163 ; Function Prototype declaration
164 ----------------------------------------------------------------------------*/
165
166
167 /*----------------------------------------------------------------------------
168 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
169 ; Variable declaration - defined here and used outside this module
170 ----------------------------------------------------------------------------*/
171
172 /*----------------------------------------------------------------------------
173 ; EXTERNAL FUNCTION REFERENCES
174 ; Declare functions defined elsewhere and referenced in this module
175 ----------------------------------------------------------------------------*/
176
177 /*----------------------------------------------------------------------------
178 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
179 ; Declare variables used in this module but defined elsewhere
180 ----------------------------------------------------------------------------*/
181
182 /*----------------------------------------------------------------------------
183 ; FUNCTION CODE
184 ----------------------------------------------------------------------------*/
185
Dec_lag3(Word16 index,Word16 t0_min,Word16 t0_max,Word16 i_subfr,Word16 T0_prev,Word16 * T0,Word16 * T0_frac,Word16 flag4,Flag * pOverflow)186 void Dec_lag3(Word16 index, /* i : received pitch index */
187 Word16 t0_min, /* i : minimum of search range */
188 Word16 t0_max, /* i : maximum of search range */
189 Word16 i_subfr, /* i : subframe flag */
190 Word16 T0_prev, /* i : integer pitch delay of last subframe
191 used in 2nd and 4th subframes */
192 Word16 * T0, /* o : integer part of pitch lag */
193 Word16 * T0_frac, /* o : fractional part of pitch lag */
194 Word16 flag4, /* i : flag for encoding with 4 bits */
195 Flag *pOverflow /* o : Flag set when overflow occurs */
196 )
197 {
198 Word16 i;
199 Word16 tmp_lag;
200
201 if (i_subfr == 0) /* if 1st or 3rd subframe */
202 {
203
204 if (index < 197)
205 {
206
207 tmp_lag = index + 2;
208
209 tmp_lag =
210 mult(
211 tmp_lag,
212 10923,
213 pOverflow);
214
215 i =
216 add(
217 tmp_lag,
218 19,
219 pOverflow);
220
221 *T0 = i;
222
223 /* i = 3 * (*T0) */
224
225 i = add(i, i, pOverflow);
226 i = add(i, *T0, pOverflow);
227
228 tmp_lag =
229 sub(
230 index,
231 i,
232 pOverflow);
233
234 *T0_frac =
235 add(
236 tmp_lag,
237 58,
238 pOverflow);
239 }
240 else
241 {
242 *T0 = index - 112;
243
244 *T0_frac = 0;
245 }
246
247 }
248 else
249 { /* 2nd or 4th subframe */
250
251 if (flag4 == 0)
252 {
253
254 /* 'normal' decoding: either with 5 or 6 bit resolution */
255
256 i =
257 add(
258 index,
259 2,
260 pOverflow);
261
262 i =
263 mult(
264 i,
265 10923,
266 pOverflow);
267
268 i =
269 sub(
270 i,
271 1,
272 pOverflow);
273
274 *T0 =
275 add(
276 i,
277 t0_min,
278 pOverflow);
279
280 /* i = 3* (*T0) */
281 i = add(add(i, i, pOverflow), i, pOverflow);
282
283 tmp_lag =
284 sub(
285 index,
286 2,
287 pOverflow);
288
289 *T0_frac =
290 sub(
291 tmp_lag,
292 i,
293 pOverflow);
294 }
295 else
296 {
297
298 /* decoding with 4 bit resolution */
299
300 tmp_lag = T0_prev;
301
302 i =
303 sub(
304 tmp_lag,
305 t0_min,
306 pOverflow);
307
308 if (i > 5)
309 {
310 tmp_lag =
311 add(
312 t0_min,
313 5,
314 pOverflow);
315 }
316
317 i =
318 sub(
319 t0_max,
320 tmp_lag,
321 pOverflow);
322
323 if (i > 4)
324 {
325 tmp_lag =
326 sub(
327 t0_max,
328 4,
329 pOverflow);
330 }
331
332 if (index < 4)
333 {
334 i =
335 sub(
336 tmp_lag,
337 5,
338 pOverflow);
339
340 *T0 =
341 add(
342 i,
343 index,
344 pOverflow);
345
346 *T0_frac = 0;
347 }
348 else
349 {
350 /* 4 >= index < 12 */
351 if (index < 12)
352 {
353 i = index - 5;
354
355 i = mult(
356 i,
357 10923,
358 pOverflow);
359
360 i--;
361
362 *T0 = add(
363 i,
364 tmp_lag,
365 pOverflow);
366
367 i = add(
368 add(
369 i,
370 i,
371 pOverflow),
372 i,
373 pOverflow);
374
375 tmp_lag = index - 9;
376
377 *T0_frac =
378 sub(
379 tmp_lag,
380 i,
381 pOverflow);
382 }
383 else
384 {
385 i = index - 12;
386
387 i =
388 add(
389 i,
390 tmp_lag,
391 pOverflow);
392
393 *T0 =
394 add(
395 i,
396 1,
397 pOverflow);
398
399 *T0_frac = 0;
400 }
401 }
402
403 } /* end if (decoding with 4 bit resolution) */
404 }
405
406 return;
407 }
408