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