1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.073
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/lsp_az.c
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Funtions: Get_lsp_pol
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Lsp_Az
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated template used to PV coding template. First attempt at
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          optimizing C code.
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Deleted all Local stores needed/modified. Optimized Lsp_Az
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          function by getting rid of call to L_shr_r function.
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated file per comments gathered from Phase 2/3 review.
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Added setting of Overflow flag in the inlined code.
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: 1. Optimized Lsp_Az function code.
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              2. Changed Input/Output definitions by adding Word type.
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Made changes based on review meeting.
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              1. Removed pseudocode.
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              template. Removed unnecessary include files.
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Replaced basic_op.h and oper_32b.h with the header files of the
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              math functions used in the file.
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Modified to pass overflow flag through to L_add and L_sub.  The
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber flag is passed back to the calling function by pointer reference.
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Removed the id line since it was removed in the header file by
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              Ken.
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Added the write-only variable, pOverflow, to the inputs section.
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  For lsp_az() and Get_lsp_pol()
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              1. Eliminated unused include files.
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              2. Replaced array addressing by pointers
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              3. Eliminated math operations that unnecessary checked for
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 saturation, in some cases this by shifting before adding and
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 in other cases by evaluating the operands
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              4. Unrolled loops to speed up processing
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              5. Replaced mpy_32_16 by multpilcations in place
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              6. Eliminated if-else statements for sign extension when
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 right-shifting
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Added casting to eliminate warnings, and eliminated include
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               files that now are chosen by OSCL definitions
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced "int" and/or "char" with defined types.
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               Added proper casting (Word32) to some left shifting operations
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Who:                           Date:
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains functions that convert line spectral pairs (LSP) to
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber linear predictive (LP) coefficients (filter order = 10). The functions
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber included in this file include Get_lsp_pol, which finds the coefficients of
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber F1(z) and F2(z), and Lsp_Az, which converts LSP to LPC by multiplying
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber F1(z) by 1+z^(-1) and F2(z) by 1-z^(-1), then calculating A(z) = (F1(z) +
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber F2(z))/2.
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_az.h"
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also.
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Get_lsp_pol
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp = pointer to the buffer containing the line spectral pairs (LSP)
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          of type Word16
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f = pointer to the polynomial of type Word32 to be generated
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by f contains the polynomial generated
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function finds the polynomial F1(z) or F2(z) from the LSPs. If the LSP
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vector is passed at address 0, F1(z) is computed and if it is passed at
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber address 1, F2(z) is computed.
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This is performed by expanding the product polynomials:
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    F1(z) =   product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        i=0,2,4,6,8
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    F2(z) =   product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        i=1,3,5,7,9
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where lsp[] is the LSP vector in the cosine domain.
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber The expansion is performed using the following recursion:
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[0] = 1
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    b = -2.0 * lsp[0]
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[1] = b
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for i=2 to 5 do
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        b = -2.0 * lsp[2*i-2];
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for j=i-1 down to 2 do
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            f[j] = f[j] + b*f[j-1] + f[j-2];
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f[1] = f[1] + b;
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_az.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void Get_lsp_pol (Word16 *lsp, Word32 *f)
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, j, hi, lo;
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t0;
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // f[0] = 1.0;
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *f = L_mult (4096, 2048);
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f++;
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *f = L_msu ((Word32) 0, *lsp, 512);    // f[1] =  -2.0 * lsp[0];
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f++;
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp += 2;                              // Advance lsp pointer
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 2; i <= 5; i++)
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f = f[-2];
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 1; j < i; j++, f--)
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_Extract (f[-1], &hi, &lo);
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = Mpy_32_16 (hi, lo, *lsp); // t0 = f[-1] * lsp
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = L_shl (t0, 1);
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *f = L_add (*f, f[-2]); // *f += f[-2]
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *f = L_sub (*f, t0); // *f -= t0
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f = L_msu (*f, *lsp, 512); // *f -= lsp<<9
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f += i;                            // Advance f pointer
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp += 2;                          // Advance lsp pointer
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void Get_lsp_pol(
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp,
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 *f,
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag   *pOverflow)
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 i;
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 j;
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 hi;
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lo;
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t0;
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* f[0] = 1.0;             */
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *f++ = (Word32) 0x01000000;
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *f++ = (Word32) - *(lsp++) << 10;       /* f[1] =  -2.0 * lsp[0];  */
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp++;                                  /* Advance lsp pointer     */
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 2; i <= 5; i++)
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f = *(f - 2);
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 1; j < i; j++)
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            hi = (Word16)(*(f - 1) >> 16);
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lo = (Word16)((*(f - 1) >> 1) - ((Word32) hi << 15));
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0  = ((Word32)hi * *lsp);
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 += ((Word32)lo * *lsp) >> 15;
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(f) +=  *(f - 2);          /*      *f += f[-2]      */
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(f--) -=  t0 << 2;         /*      *f -= t0         */
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f -= (Word32)(*lsp++) << 10;
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f  += i;
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp++;
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Get_lsp_pol_wrapper
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp = pointer to the buffer containing the line spectral pairs (LSP)
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          of type Word16
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f = pointer to the polynomial of type Word32 to be generated
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by f contains the polynomial generated
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function provides external access to the static function Get_lsp_pol.
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CALL Get_lsp_pol(lsp = lsp_ptr
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  f = f_ptr )
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   MODIFYING(nothing)
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   RETURNING(nothing)
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Get_lsp_pol_wrapper(
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp,
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 *f,
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag   *pOverflow)
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     CALL Get_lsp_pol(lsp = lsp_ptr
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              f = f_ptr )
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Get_lsp_pol(lsp, f, pOverflow);
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       MODIFYING(nothing)
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       RETURNING(nothing)
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Lsp_Az
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp = pointer to the buffer containing the line spectral pairs (LSP)
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          of type Word16
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      a = pointer to the buffer containing Linear Predictive (LP)
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          coefficients of type Word16 to be generated
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Stores/Buffers/Pointers Needed:
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Stores/Buffers/Pointers Needed:
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow  = pointer set in case where one of the operations overflows.
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 [data type Pointer to Flag]
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pointers and Buffers Modified:
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a buffer contains the generated Linear Predictive (LP) coefficients
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Stores Modified:
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Stores Modified:
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        None
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function converts from the line spectral pairs (LSP) to LP coefficients
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for a 10th order filter.
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This is done by:
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    (1) Find the coefficients of F1(z) and F2(z) (see Get_lsp_pol)
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    (2) Multiply F1(z) by 1+z^{-1} and F2(z) by 1-z^{-1}
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    (3) A(z) = ( F1(z) + F2(z) ) / 2
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber lsp_az.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Lsp_Az (
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp[],        // (i)  : line spectral frequencies
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 a[]           // (o)  : predictor coefficients (order = 10)
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, j;
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 f1[6], f2[6];
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t0;
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Get_lsp_pol (&lsp[0], f1);
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Get_lsp_pol (&lsp[1], f2);
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 5; i > 0; i--)
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f1[i] = L_add (f1[i], f1[i - 1]); // f1[i] += f1[i-1];
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f2[i] = L_sub (f2[i], f2[i - 1]); // f2[i] -= f2[i-1];
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a[0] = 4096;
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 1, j = 10; i <= 5; i++, j--)
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = L_add (f1[i], f2[i]);           // f1[i] + f2[i]
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[i] = extract_l (L_shr_r (t0, 13));
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = L_sub (f1[i], f2[i]);           // f1[i] - f2[i]
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[j] = extract_l (L_shr_r (t0, 13));
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
508a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Lsp_Az(
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp[],        /* (i)  : line spectral frequencies            */
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 a[],          /* (o)  : predictor coefficients (order = 10)  */
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow     /* (o)  : overflow flag                        */
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 i;
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 j;
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 f1[6];
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 f2[6];
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t0;
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t1;
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *p_a = &a[0];
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 *p_f1;
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 *p_f2;
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Get_lsp_pol(&lsp[0], f1, pOverflow);
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Get_lsp_pol(&lsp[1], f2, pOverflow);
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_f1 = &f1[5];
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_f2 = &f2[5];
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 5; i > 0; i--)
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(p_f1--) += f1[i-1];
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(p_f2--) -= f2[i-1];
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *(p_a++) = 4096;
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_f1 = &f1[1];
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_f2 = &f2[1];
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 1, j = 10; i <= 5; i++, j--)
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = *(p_f1) + *(p_f2);               /* f1[i] + f2[i] */
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = *(p_f1++) - *(p_f2++);           /* f1[i] - f2[i] */
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = t0 + ((Word32) 1 << 12);
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = t1 + ((Word32) 1 << 12);
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(p_a++) = (Word16)(t0 >> 13);
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[j]     = (Word16)(t1 >> 13);
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
556