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
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/d8_31pf.c
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Functions:
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Date: 01/28/2002
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Modified to pass overflow flag through to basic math function.
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber The flag is passed back to the calling function by pointer reference.
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Per review comments...
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (1) Removed include of "count.h" and "basic_op.h"
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (2) Added includes of mult.h, shl.h, shr.h, add.h, sub.h, negate.h,
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     L_mult.h, and L_shr.h
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d8_31pf.h"
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h"
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "basic_op.h"
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst.h"
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also.
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NB_PULSE  8           /* number of pulses  */
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* define values/representation for output codevector and sign */
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define POS_CODE  8191
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NEG_CODE  8191
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: decompress10
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   MSBs -- Word16 -- MSB part of the index
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   LSBs -- Word16 -- LSB part of the index
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   index1 -- Word16 -- index for first pos in pos_index[]
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   index2 -- Word16 -- index for second pos in pos_index[]
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   index3 -- Word16 -- index for third pos in pos_index[]
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   pos_indx[] -- array of type Word16 -- position of 3 pulses (decompressed)
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   pOverflow  Flag set when overflow occurs, pointer of type Flag *
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void decompress10(
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 MSBs,        /* i : MSB part of the index                 */
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 LSBs,        /* i : LSB part of the index                 */
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index1,      /* i : index for first pos in pos_index[]    */
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index2,      /* i : index for second pos in pos_index[]   */
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index3,      /* i : index for third pos in pos_index[]    */
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pos_indx[],  /* o : position of 3 pulses (decompressed)   */
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow)   /* o : Flag set when overflow occurs         */
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ia;
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ib;
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ic;
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 tempWord32;
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      pos_indx[index1] = ((MSBs-25*(MSBs/25))%5)*2 + (LSBs-4*(LSBs/4))%2;
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      pos_indx[index2] = ((MSBs-25*(MSBs/25))/5)*2 + (LSBs-4*(LSBs/4))/2;
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      pos_indx[index3] = (MSBs/25)*2 + LSBs/4;
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    */
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (MSBs > 124)
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        MSBs = 124;
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia =
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs,
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1311,
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tempWord32 =
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_mult(
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ia,
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            25,
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia = (Word16)(MSBs - (tempWord32 >> 1));
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ia,
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            6554,
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tempWord32 =
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_mult(
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            5,
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib = ia - (Word16)(tempWord32 >> 1);
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        shl(
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ic = LSBs - ((LSBs >> 2) << 2);
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[index1] = ib + (ic & 1);
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ia,
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            6554,
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        shl(
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[index2] = ib + (ic >> 1);
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib = LSBs >> 2;
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ic =
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs,
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1311,
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ic =
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        shl(
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ic,
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[index3] =
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        add(
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ic,
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: decompress_code
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    indx[] -- array of type Word16 -- position and sign of
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                      8 pulses (compressed)
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    sign_indx[] -- array of type Word16 -- signs of 4 pulses (signs only)
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[]  -- array of type Word16 -- position index of 8 pulses
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                           (position only)
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow pointer to type Flag -- Flag set when overflow occurs
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    PURPOSE: decompression of the linear codewords to 4+three indeces
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             one bit from each pulse is made robust to errors by
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             minimizing the phase shift of a bit error.
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             4 signs (one for each track)
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             i0,i4,i1 => one index (7+3) bits, 3   LSBs more robust
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             i2,i6,i5 => one index (7+3) bits, 3   LSBs more robust
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             i3,i7    => one index (5+2) bits, 2-3 LSbs more robust
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void decompress_code(
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 indx[],      /* i : position and sign of 8 pulses (compressed) */
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 sign_indx[], /* o : signs of 4 pulses (signs only)             */
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pos_indx[],  /* o : position index of 8 pulses (position only) */
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow    /* o : Flag set when overflow occurs              */
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ia;
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ib;
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 MSBs;
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 LSBs;
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 MSBs0_24;
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 tempWord32;
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < NB_TRACK_MR102; i++)
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        sign_indx[i] = indx[i];
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      First index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      MSBs = indx[NB_TRACK]/8;
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      LSBs = indx[NB_TRACK]%8;
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    MSBs = indx[NB_TRACK_MR102] >> 3;
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    LSBs = indx[NB_TRACK_MR102] & 0x7;
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    decompress10(
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        MSBs,
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        LSBs,
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        0,
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        4,
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        1,
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pos_indx,
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Second index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      MSBs = indx[NB_TRACK+1]/8;
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      LSBs = indx[NB_TRACK+1]%8;
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    MSBs = indx[NB_TRACK_MR102+1] >> 3;
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    LSBs = indx[NB_TRACK_MR102+1] & 0x7;
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    decompress10(
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        MSBs,
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        LSBs,
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        2,
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        6,
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        5,
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pos_indx,
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Third index: 10x10 -> 2x5x2x5-> 25x2x2 -> 5+1x2 bits
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      MSBs = indx[NB_TRACK+2]/4;
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      LSBs = indx[NB_TRACK+2]%4;
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      MSBs0_24 = (MSBs*25+12)/32;
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      if ((MSBs0_24/5)%2==1)
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         pos_indx[3] = (4-(MSBs0_24%5))*2 + LSBs%2;
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      else
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         pos_indx[3] = (MSBs0_24%5)*2 + LSBs%2;
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      pos_indx[7] = (MSBs0_24/5)*2 + LSBs/2;
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    MSBs = indx[NB_TRACK_MR102+2] >> 2;
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    LSBs = indx[NB_TRACK_MR102+2] & 0x3;
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tempWord32 =
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_mult(
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs,
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            25,
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia =
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        (Word16)
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_shr(
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            tempWord32,
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia += 12;
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    MSBs0_24 = ia >> 5;
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia =
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs0_24,
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            6554,
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia &= 1;
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs0_24,
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            6554,
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tempWord32 =
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_mult(
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            5,
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib = MSBs0_24 - (Word16)(tempWord32 >> 1);
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (ia == 1)
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        ib = 4 - ib;
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ib =
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        shl(
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia = LSBs & 0x1;
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[3] =
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        add(
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ib,
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ia,
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia =
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        mult(
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            MSBs0_24,
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            6554,
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ia =
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        shl(
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ia,
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            1,
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pos_indx[7] = ia + (LSBs >> 1);
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: dec_8i40_31bits
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    index   array of type Word16 --  index of 8 pulses (sign+position)
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    cod     array of type Word16 --  algebraic (fixed) codebook excitation
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow pointer to type Flag -- Flag set when overflow occurs
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PURPOSE:  Builds the innovative codevector from the received
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index of algebraic codebook.
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
558a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid dec_8i40_31bits(
559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index[],    /* i : index of 8 pulses (sign+position)         */
560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 cod[],      /* o : algebraic (fixed) codebook excitation     */
561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow   /* o : Flag set when overflow occurs             */
562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 j;
566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pos1;
567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pos2;
568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 sign;
569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 linear_signs[NB_TRACK_MR102];
571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 linear_codewords[NB_PULSE];
572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < L_CODE; i++)
574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        cod[i] = 0;
576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    decompress_code(
579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        index,
580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        linear_signs,
581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        linear_codewords,
582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* decode the positions and signs of pulses and build the codeword */
585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (j = 0; j < NB_TRACK_MR102; j++)    /* NB_TRACK_MR102 = 4 */
586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* position of pulse "j" */
588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pos1 = (linear_codewords[j] << 2) + j;
590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (linear_signs[j] == 0)
593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            sign = POS_CODE; /* +1.0 */
595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            sign = -NEG_CODE; /* -1.0 */
599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (pos1 < L_SUBFR)
602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            cod[pos1] = sign;    /* avoid buffer overflow */
604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* compute index i */
607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* position of pulse "j+4" */
608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pos2 = (linear_codewords[j + 4] << 2) + j;
610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (pos2 < pos1)
613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            sign = negate(sign);
615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (pos2 < L_SUBFR)
618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            cod[pos2] += sign;     /* avoid buffer overflow */
620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    } /* for (j = 0; j < NB_TRACK_MR102; j++) */
624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
627