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 Pathname: ./audio/gsm-amr/c/src/int_lpc.c
31 Functions:
32
33 ------------------------------------------------------------------------------
34 REVISION HISTORY
35
36 Description: Updated template used to PV coding template.
37 Changed to accept the pOverflow flag for EPOC compatibility.
38
39 Description: Per review comments, replaced includes of "basic_op.h"
40 and "count.h" with "shr.h", "sub.h", and "add.h"
41
42 Description: For Int_lpc_1and3() and Int_lpc_1and3_2()
43 1. Replaced array addressing by pointers
44 2. Eliminated math operations that unnecessary checked for
45 saturation
46 3. Unrolled loops to speed up processing
47
48 Description: Replaced "int" and/or "char" with OSCL defined types.
49
50
51 Who: Date:
52 Description:
53
54 ------------------------------------------------------------------------------
55 MODULE DESCRIPTION
56
57
58 ------------------------------------------------------------------------------
59 */
60
61 /*----------------------------------------------------------------------------
62 ; INCLUDES
63 ----------------------------------------------------------------------------*/
64 #include "int_lpc.h"
65 #include "typedef.h"
66 #include "cnst.h"
67 #include "lsp_az.h"
68 #include "basic_op.h"
69
70 /*----------------------------------------------------------------------------
71 ; MACROS
72 ; Define module specific macros here
73 ----------------------------------------------------------------------------*/
74
75 /*----------------------------------------------------------------------------
76 ; DEFINES
77 ; Include all pre-processor statements here. Include conditional
78 ; compile variables also.
79 ----------------------------------------------------------------------------*/
80
81 /*----------------------------------------------------------------------------
82 ; LOCAL FUNCTION DEFINITIONS
83 ; Function Prototype declaration
84 ----------------------------------------------------------------------------*/
85
86 /*----------------------------------------------------------------------------
87 ; LOCAL VARIABLE DEFINITIONS
88 ; Variable declaration - defined here and used outside this module
89 ----------------------------------------------------------------------------*/
90
91
92 /*
93 ------------------------------------------------------------------------------
94 FUNCTION NAME: Int_lpc_1and3
95 ------------------------------------------------------------------------------
96 INPUT AND OUTPUT DEFINITIONS
97
98 Inputs:
99 lsp_old -- array of type Word16 -- LSP vector at the
100 4th subfr. of past frame (M)
101 lsp_mid -- array of type Word16 -- LSP vector at the 2nd subfr. of
102 present frame (M)
103 lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
104 present frame (M)
105
106 Outputs:
107 Az -- array of type Word16 -- interpolated LP parameters in all subfr.
108 (AZ_SIZE)
109 pOverflow -- pointer to type Flag -- Overflow indicator
110
111 Returns:
112 None
113
114 Global Variables Used:
115 None
116
117 Local Variables Needed:
118 None
119
120 ------------------------------------------------------------------------------
121 FUNCTION DESCRIPTION
122
123 Purpose : Interpolates the LSPs and converts to LPC parameters
124 to get a different LP filter in each subframe.
125 Description : The 20 ms speech frame is divided into 4 subframes.
126 The LSPs are quantized and transmitted at the 2nd and
127 4th subframes (twice per frame) and interpolated at the
128 1st and 3rd subframe.
129
130 |------|------|------|------|
131 sf1 sf2 sf3 sf4
132 F0 Fm F1
133
134 sf1: 1/2 Fm + 1/2 F0 sf3: 1/2 F1 + 1/2 Fm
135 sf2: Fm sf4: F1
136
137 ------------------------------------------------------------------------------
138 REQUIREMENTS
139
140 None
141
142 ------------------------------------------------------------------------------
143 REFERENCES
144
145 int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
146
147 ------------------------------------------------------------------------------
148 PSEUDO-CODE
149
150
151 ------------------------------------------------------------------------------
152 RESOURCES USED [optional]
153
154 When the code is written for a specific target processor the
155 the resources used should be documented below.
156
157 HEAP MEMORY USED: x bytes
158
159 STACK MEMORY USED: x bytes
160
161 CLOCK CYCLES: (cycle count equation for this function) + (variable
162 used to represent cycle count for each subroutine
163 called)
164 where: (cycle count variable) = cycle count for [subroutine
165 name]
166
167 ------------------------------------------------------------------------------
168 CAUTION [optional]
169 [State any special notes, constraints or cautions for users of this function]
170
171 ------------------------------------------------------------------------------
172 */
173
Int_lpc_1and3(Word16 lsp_old[],Word16 lsp_mid[],Word16 lsp_new[],Word16 Az[],Flag * pOverflow)174 void Int_lpc_1and3(
175 Word16 lsp_old[], /* i : LSP vector at the 4th subfr. of past frame (M) */
176 Word16 lsp_mid[], /* i : LSP vector at the 2nd subfr. of
177 present frame (M) */
178 Word16 lsp_new[], /* i : LSP vector at the 4th subfr. of
179 present frame (M) */
180 Word16 Az[], /* o : interpolated LP parameters in all subfr.
181 (AZ_SIZE) */
182 Flag *pOverflow
183 )
184 {
185 Word16 i;
186 Word16 lsp[M];
187 Word16 *p_lsp_old = &lsp_old[0];
188 Word16 *p_lsp_mid = &lsp_mid[0];
189 Word16 *p_lsp_new = &lsp_new[0];
190 Word16 *p_lsp = &lsp[0];
191
192 /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
193
194 for (i = M >> 1; i != 0; i--)
195 {
196 *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
197 *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
198 }
199
200 Lsp_Az(
201 lsp,
202 Az,
203 pOverflow); /* Subframe 1 */
204
205 Az += MP1;
206
207 Lsp_Az(
208 lsp_mid,
209 Az,
210 pOverflow); /* Subframe 2 */
211
212 Az += MP1;
213
214 p_lsp_mid = &lsp_mid[0];
215 p_lsp = &lsp[0];
216
217 for (i = M >> 1; i != 0; i--)
218 {
219 *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
220 *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
221 }
222
223 Lsp_Az(
224 lsp,
225 Az,
226 pOverflow); /* Subframe 3 */
227
228 Az += MP1;
229
230 Lsp_Az(
231 lsp_new,
232 Az,
233 pOverflow); /* Subframe 4 */
234
235 return;
236 }
237
238
239 /*
240 ------------------------------------------------------------------------------
241 FUNCTION NAME: Int_lpc_1and3_2
242 ------------------------------------------------------------------------------
243 INPUT AND OUTPUT DEFINITIONS
244
245 Inputs:
246 lsp_old -- array of type Word16 -- LSP vector at the
247 4th subfr. of past frame (M)
248 lsp_mid -- array of type Word16 -- LSP vector at the 2nd subfr. of
249 present frame (M)
250 lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
251 present frame (M)
252
253 Outputs:
254 Az -- array of type Word16 -- interpolated LP parameters in.
255 subfr 1 and 2.
256 pOverflow -- pointer to type Flag -- Overflow indicator
257
258 Returns:
259 None
260
261 Global Variables Used:
262
263
264 Local Variables Needed:
265 None
266
267 ------------------------------------------------------------------------------
268 FUNCTION DESCRIPTION
269
270 Purpose : Interpolation of the LPC parameters. Same as the Int_lpc
271 function but we do not recompute Az() for subframe 2 and
272 4 because it is already available.
273
274 ------------------------------------------------------------------------------
275 REQUIREMENTS
276
277 None
278
279 ------------------------------------------------------------------------------
280 REFERENCES
281
282 int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
283
284 ------------------------------------------------------------------------------
285 PSEUDO-CODE
286
287
288 ------------------------------------------------------------------------------
289 RESOURCES USED [optional]
290
291 When the code is written for a specific target processor the
292 the resources used should be documented below.
293
294 HEAP MEMORY USED: x bytes
295
296 STACK MEMORY USED: x bytes
297
298 CLOCK CYCLES: (cycle count equation for this function) + (variable
299 used to represent cycle count for each subroutine
300 called)
301 where: (cycle count variable) = cycle count for [subroutine
302 name]
303
304 ------------------------------------------------------------------------------
305 CAUTION [optional]
306 [State any special notes, constraints or cautions for users of this function]
307
308 ------------------------------------------------------------------------------
309 */
310
Int_lpc_1and3_2(Word16 lsp_old[],Word16 lsp_mid[],Word16 lsp_new[],Word16 Az[],Flag * pOverflow)311 void Int_lpc_1and3_2(
312 Word16 lsp_old[], /* i : LSP vector at the 4th subfr. of past frame (M) */
313 Word16 lsp_mid[], /* i : LSP vector at the 2nd subframe of
314 present frame (M) */
315 Word16 lsp_new[], /* i : LSP vector at the 4th subframe of
316 present frame (M) */
317 Word16 Az[], /* o :interpolated LP parameters
318 in subframes 1 and 3 (AZ_SIZE) */
319 Flag *pOverflow
320 )
321 {
322 Word16 i;
323 Word16 lsp[M];
324 Word16 *p_lsp_old = &lsp_old[0];
325 Word16 *p_lsp_mid = &lsp_mid[0];
326 Word16 *p_lsp_new = &lsp_new[0];
327 Word16 *p_lsp = &lsp[0];
328
329 /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
330
331 for (i = M >> 1; i != 0; i--)
332 {
333 *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
334 *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
335 }
336 Lsp_Az(lsp, Az, pOverflow); /* Subframe 1 */
337 Az += MP1 * 2;
338
339 p_lsp_mid = &lsp_mid[0];
340 p_lsp = &lsp[0];
341
342 for (i = M >> 1; i != 0; i--)
343 {
344 *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
345 *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
346 }
347
348 Lsp_Az(lsp, Az, pOverflow); /* Subframe 3 */
349
350 return;
351 }
352
353
354 /*
355 ------------------------------------------------------------------------------
356 FUNCTION NAME: lsp
357 ------------------------------------------------------------------------------
358 INPUT AND OUTPUT DEFINITIONS
359
360 Inputs:
361 lsp_old -- array of type Word16 -- LSP vector at the
362 4th subfr. of past frame (M)
363 lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
364 present frame (M)
365
366 Outputs:
367 Az -- array of type Word16 -- interpolated LP parameters in.
368 all subframes.
369 pOverflow -- pointer to type Flag -- Overflow indicator
370
371 Returns:
372 None
373
374 Global Variables Used:
375
376
377 Local Variables Needed:
378 None
379
380 ------------------------------------------------------------------------------
381 FUNCTION DESCRIPTION
382
383 PURPOSE: Interpolates the LSPs and convert to LP parameters to get
384 a different LP filter in each subframe.
385
386 DESCRIPTION:
387 The 20 ms speech frame is divided into 4 subframes.
388 The LSPs are quantized and transmitted at the 4th subframe
389 (once per frame) and interpolated at the 1st, 2nd and 3rd subframe.
390
391 |------|------|------|------|
392 sf1 sf2 sf3 sf4
393 F0 F1
394
395 sf1: 3/4 F0 + 1/4 F1 sf3: 1/4 F0 + 3/4 F1
396 sf2: 1/2 F0 + 1/2 F1 sf4: F1
397
398 ------------------------------------------------------------------------------
399 REQUIREMENTS
400
401 None
402
403 ------------------------------------------------------------------------------
404 REFERENCES
405
406 int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
407
408 ------------------------------------------------------------------------------
409 PSEUDO-CODE
410
411
412 ------------------------------------------------------------------------------
413 RESOURCES USED [optional]
414
415 When the code is written for a specific target processor the
416 the resources used should be documented below.
417
418 HEAP MEMORY USED: x bytes
419
420 STACK MEMORY USED: x bytes
421
422 CLOCK CYCLES: (cycle count equation for this function) + (variable
423 used to represent cycle count for each subroutine
424 called)
425 where: (cycle count variable) = cycle count for [subroutine
426 name]
427
428 ------------------------------------------------------------------------------
429 CAUTION [optional]
430 [State any special notes, constraints or cautions for users of this function]
431
432 ------------------------------------------------------------------------------
433 */
434
Int_lpc_1to3(Word16 lsp_old[],Word16 lsp_new[],Word16 Az[],Flag * pOverflow)435 void Int_lpc_1to3(
436 Word16 lsp_old[], /* input : LSP vector at the 4th SF of past frame */
437 Word16 lsp_new[], /* input : LSP vector at the 4th SF of present frame */
438 Word16 Az[], /* output: interpolated LP parameters in all SFs */
439 Flag *pOverflow
440 )
441 {
442 Word16 i;
443 Word16 temp;
444 Word16 temp2;
445
446 Word16 lsp[M];
447
448 for (i = 0; i < M; i++)
449 {
450 temp = shr(lsp_old[i], 2, pOverflow);
451 temp = sub(lsp_old[i], temp, pOverflow);
452 temp2 = shr(lsp_new[i], 2, pOverflow);
453
454 lsp[i] = add(temp2, temp, pOverflow);
455 }
456
457 Lsp_Az(
458 lsp,
459 Az,
460 pOverflow); /* Subframe 1 */
461
462 Az += MP1;
463
464
465 for (i = 0; i < M; i++)
466 {
467 temp = shr(lsp_new[i], 1, pOverflow);
468 temp2 = shr(lsp_old[i], 1, pOverflow);
469 lsp[i] = add(temp, temp2, pOverflow);
470 }
471
472 Lsp_Az(
473 lsp,
474 Az,
475 pOverflow); /* Subframe 2 */
476
477 Az += MP1;
478
479 for (i = 0; i < M; i++)
480 {
481 temp = shr(lsp_new[i], 2, pOverflow);
482 temp = sub(lsp_new[i], temp, pOverflow);
483 temp2 = shr(lsp_old[i], 2, pOverflow);
484
485 lsp[i] = add(temp2, temp, pOverflow);
486 }
487
488 Lsp_Az(
489 lsp,
490 Az,
491 pOverflow); /* Subframe 3 */
492
493 Az += MP1;
494
495 Lsp_Az(
496 lsp_new,
497 Az,
498 pOverflow); /* Subframe 4 */
499
500 return;
501 }
502 /*
503 ------------------------------------------------------------------------------
504 FUNCTION NAME: Int_lpc_1to3_2
505 ------------------------------------------------------------------------------
506 INPUT AND OUTPUT DEFINITIONS
507
508 Inputs:
509 lsp_old -- array of type Word16 -- LSP vector at the
510 4th subfr. of past frame (M)
511 lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
512 present frame (M)
513
514 Outputs:
515 Az -- array of type Word16 -- interpolated LP parameters in.
516 subfr 1, 2, and 3.
517 pOverflow -- pointer to type Flag -- Overflow indicator
518
519 Returns:
520 None
521
522 Global Variables Used:
523 None
524
525 Local Variables Needed:
526 None
527
528 ------------------------------------------------------------------------------
529 FUNCTION DESCRIPTION
530
531 Interpolation of the LPC parameters.
532 Same as the previous function but we do not recompute Az() for
533 subframe 4 because it is already available.
534
535 ------------------------------------------------------------------------------
536 REQUIREMENTS
537
538 None
539
540 ------------------------------------------------------------------------------
541 REFERENCES
542
543 int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
544
545 ------------------------------------------------------------------------------
546 PSEUDO-CODE
547
548
549 ------------------------------------------------------------------------------
550 RESOURCES USED [optional]
551
552 When the code is written for a specific target processor the
553 the resources used should be documented below.
554
555 HEAP MEMORY USED: x bytes
556
557 STACK MEMORY USED: x bytes
558
559 CLOCK CYCLES: (cycle count equation for this function) + (variable
560 used to represent cycle count for each subroutine
561 called)
562 where: (cycle count variable) = cycle count for [subroutine
563 name]
564
565 ------------------------------------------------------------------------------
566 CAUTION [optional]
567 [State any special notes, constraints or cautions for users of this function]
568
569 ------------------------------------------------------------------------------
570 */
571
Int_lpc_1to3_2(Word16 lsp_old[],Word16 lsp_new[],Word16 Az[],Flag * pOverflow)572 void Int_lpc_1to3_2(
573 Word16 lsp_old[], /* input : LSP vector at the 4th SF of past frame */
574 Word16 lsp_new[], /* input : LSP vector at the 4th SF of present frame */
575 Word16 Az[], /* output: interpolated LP parameters in SFs 1,2,3 */
576 Flag *pOverflow
577 )
578 {
579 Word16 i;
580 Word16 temp;
581 Word16 temp2;
582 Word16 lsp[M];
583
584 for (i = 0; i < M; i++)
585 {
586 temp = shr(lsp_old[i], 2, pOverflow);
587
588 temp = sub(lsp_old[i], temp, pOverflow);
589
590 temp2 = shr(lsp_new[i], 2, pOverflow);
591
592 lsp[i] = add(temp2, temp, pOverflow);
593 }
594
595 Lsp_Az(
596 lsp,
597 Az,
598 pOverflow); /* Subframe 1 */
599
600 Az += MP1;
601
602 for (i = 0; i < M; i++)
603 {
604 temp = shr(lsp_new[i], 1, pOverflow);
605 temp2 = shr(lsp_old[i], 1, pOverflow);
606
607 lsp[i] = add(temp2, temp, pOverflow);
608 }
609
610 Lsp_Az(
611 lsp,
612 Az,
613 pOverflow); /* Subframe 2 */
614
615 Az += MP1;
616
617 for (i = 0; i < M; i++)
618 {
619 temp = shr(lsp_new[i], 2, pOverflow);
620 temp = sub(lsp_new[i], temp, pOverflow);
621 temp2 = shr(lsp_old[i], 2, pOverflow);
622
623 lsp[i] = add(temp, temp2, pOverflow);
624 }
625
626 Lsp_Az(
627 lsp,
628 Az,
629 pOverflow); /* Subframe 3 */
630
631 return;
632 }
633
634