1d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* ------------------------------------------------------------------
2d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
4d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * you may not use this file except in compliance with the License.
6d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * You may obtain a copy of the License at
7d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
8d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
10d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Unless required by applicable law or agreed to in writing, software
11d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * express or implied.
14d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * See the License for the specific language governing permissions
15d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * and limitations under the License.
16d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * -------------------------------------------------------------------
17d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */
18d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************************
19d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPortions of this file are derived from the following 3GPP standard:
20d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
21d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    3GPP TS 26.073
22d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Available from http://www.3gpp.org
24d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
25d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPermission to distribute, modify and use this file under the standard license
27d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberterms listed above has been obtained from the copyright holder.
28d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber****************************************************************************************/
29d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
30d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
31d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
32d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
33d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
34d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pathname: ./audio/gsm-amr/c/src/c8_31pf.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Functions:
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     Date: 05/26/2000
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Modified to pass overflow flag through to basic math function.
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The flag is passed back to the calling function by pointer reference.
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Optimized file to reduce clock cycle usage. Updated copyright
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              year. Removed unnecessary include files and unused #defines.
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Changed round function name to pv_round to avoid conflict with
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              round function in C standard library.
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Purpose          : Searches a 31 bit algebraic codebook containing
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  : 8 pulses in a frame of 40 samples.
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  : in the same manner as GSM-EFR
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "c8_31pf.h"
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "typedef.h"
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inv_sqrt.h"
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cor_h.h"
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cor_h_x2.h"
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "set_sign.h"
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "s10_8pf.h"
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h"
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define NB_PULSE 8
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* define values/representation for output codevector and sign */
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define POS_CODE  8191
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define NEG_CODE  8191
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define POS_SIGN  32767
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define NEG_SIGN  (Word16) (-32768L)
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Declare variables used in this module but defined elsewhere
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME:
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    codvec[]   Array of type Word16 -- position of pulses
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    sign[]     Array of type Word16 -- sign of pulses
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h[]        Array of type Word16 -- impulse response of
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                       weighted synthesis filter
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cod[]       Array of type Word16 -- innovative code vector
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    y[]         Array of type Word16 -- filtered innovative code
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    sign_indx[] Array of type Word16 -- signs of 4 pulses (signs only)
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pos_indx[]  Array of type Word16 --
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                             position index of 8 pulses(position only)
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow  Pointer to Flag  -- set when overflow occurs
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*************************************************************************
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *  FUNCTION:  build_code()
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *  PURPOSE: Builds the codeword, the filtered codeword and a
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *   linear uncombined version of  the index of the
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *           codevector, based on the signs and positions of 8  pulses.
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *************************************************************************/
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void build_code(
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 codvec[],    /* i : position of pulses                           */
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[],      /* i : sign of d[n]                                 */
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[],       /* o : innovative code vector                       */
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],         /* i : impulse response of weighted synthesis filter*/
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],         /* o : filtered innovative code                     */
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign_indx[], /* o : signs of 4  pulses (signs only)              */
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_indx[],  /* o : position index of 8 pulses(position only)    */
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   * pOverflow  /* o : Flag set when overflow occurs                */
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 j;
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 k;
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 track;
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign_index;
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_index;
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 _sign[NB_PULSE];
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p0;
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p1;
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p2;
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p3;
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p4;
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p5;
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p6;
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p7;
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_cod = &cod[0];
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_codvec = &codvec[0];
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_CODE; i++)
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_cod++) = 0;
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < NB_TRACK_MR102; i++)
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pos_indx[i] = -1;
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        sign_indx[i] = -1;
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (k = 0; k < NB_PULSE; k++)
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* read pulse position */
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        i = codvec[k];
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* read sign           */
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        j = sign[i];
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pos_index = i >> 2; /* index = pos/4 */
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        track = i & 3;     /* track = pos%4 */
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (j > 0)
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] = (Word16)((Word32) cod[i] + POS_CODE);
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            _sign[k] = POS_SIGN;
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            sign_index = 0;  /* bit=0 -> positive pulse */
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] = (Word16)((Word32) cod[i] - NEG_CODE);
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            _sign[k] = NEG_SIGN;
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            sign_index = 1; /* bit=1 => negative pulse */
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* index = add (index, 8); 1 = negative  old code */
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (pos_indx[track] < 0)
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {   /* first set first NB_TRACK pulses  */
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[track] = pos_index;
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            sign_indx[track] = sign_index;
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {   /* 2nd row of pulses , test if positions needs to be switched */
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (((sign_index ^ sign_indx[track]) & 1) == 0)
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* sign of 1st pulse == sign of 2nd pulse */
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if (pos_indx[track] <= pos_index)
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {   /* no swap */
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track + NB_TRACK_MR102] = pos_index;
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {   /* swap*/
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track + NB_TRACK_MR102] = pos_indx[track];
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track] = pos_index;
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    sign_indx[track] = sign_index;
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* sign of 1st pulse != sign of 2nd pulse */
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if (pos_indx[track] <= pos_index)
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {  /*swap*/
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track + NB_TRACK_MR102] = pos_indx[track];
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track] = pos_index;
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    sign_indx[track] = sign_index;
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {   /*no swap */
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pos_indx[track + NB_TRACK_MR102] = pos_index;
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p0 = h - *(p_codvec++);
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p1 = h - *(p_codvec++);
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p2 = h - *(p_codvec++);
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p3 = h - *(p_codvec++);
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p4 = h - *(p_codvec++);
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p5 = h - *(p_codvec++);
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p6 = h - *(p_codvec++);
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p7 = h - *(p_codvec);
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_CODE; i++)
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = 0;
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p0++,
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[0],
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p1++,
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[1],
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p2++,
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[2],
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p3++,
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[3],
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p4++,
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[4],
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p5++,
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[5],
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p6++,
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[6],
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s =
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_mac(
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *p7++,
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                _sign[7],
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        y[i] =
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pv_round(
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s,
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                pOverflow);
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    } /* for (i = 0; i < L_CODE; i++) */
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} /* build_code */
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: compress_code()
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION:
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: compression of three indeces [0..9] to one 10 bit index
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          minimizing the phase shift of a bit error.
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic Word16 compress10(
437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_indxA,  /* i : signs of 4 pulses (signs only)             */
438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_indxB,  /* i : position index of 8 pulses (pos only)      */
439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_indxC,  /* i : position and sign of 8 pulses (compressed) */
440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag  *pOverflow)  /* o : Flag set when overflow occurs              */
441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx;
443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ia;
444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ib;
445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ic;
446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 tempWord32;
448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ia = pos_indxA >> 1;
452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = pos_indxB >> 1;
454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = ((Word32) ib * 5) << 1;
456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = tempWord32 >> 1;
458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = (Word16) tempWord32;
460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ic = pos_indxC >> 1;
462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = ((Word32) ic * 25) << 1;
464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = tempWord32 >> 1;
466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ic = (Word16) tempWord32;
468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ic;
470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ia;
472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx = ib << 3;
474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ia = pos_indxA & 1;
476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = ((Word16)(pos_indxB & 1)) << 1;
478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ic = ((Word16)(pos_indxC & 1)) << 2;
480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ic;
482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ia;
484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx += ib;
486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return indx;
488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: compress_code()
496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    sign_indx   Array of type Word16 -- signs of 4 pulses (signs only)
501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pos_indx    Array of type Word16 -- position index of 8 pulses
502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                            (position only)
503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx         Array of type Word16 -- position and sign of 8 pulses
506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                            (compressed)
507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow    Pointer to Flag      -- set when overflow occurs
508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: compression of the linear codewords to 4+three indeces
522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          one bit from each pulse is made robust to errors by
523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          minimizing the phase shift of a bit error.
524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          4 signs (one for each track)
525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          i0,i4,i1 => one index (7+3) bits, 3   LSBs more robust
526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          i2,i6,i5 => one index (7+3) bits, 3   LSBs more robust
527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          i3,i7    => one index (5+2) bits, 2-3 LSbs more robust
528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [1] c3_14pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void compress_code(
566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign_indx[], /* i : signs of 4 pulses (signs only)             */
567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_indx[],  /* i : position index of 8 pulses (position only) */
568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[],      /* o : position and sign of 8 pulses (compressed) */
569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag  *pOverflow)   /* o : Flag set when overflow occurs              */
570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ia;
573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ib;
574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ic;
575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_indx = &indx[0];
577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_sign_indx = &sign_indx[0];
578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 tempWord32;
580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < NB_TRACK_MR102; i++)
582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_indx++) = *(p_sign_indx++);
584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* First index
587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      indx[NB_TRACK] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */
588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx[NB_TRACK_MR102] =
590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        compress10(
591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[0],
592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[4],
593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[1],
594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pOverflow);
595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Second index
597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      indx[NB_TRACK+1] = (ia/2+(ib/2)*5 +(ic/2)*25)*8 + ia%2 + (ib%2)*2 + (ic%2)*4; */
598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx[NB_TRACK_MR102+1] =
600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        compress10(
601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[2],
602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[6],
603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pos_indx[5],
604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pOverflow);
605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*
607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      Third index
608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      if ((ib/2)%2 == 1)
609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        indx[NB_TRACK+2] = ((((4-ia/2) + (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2;
610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      else
611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        indx[NB_TRACK+2] = ((((ia/2) +   (ib/2)*5)*32+12)/25)*4 + ia%2 + (ib%2)*2;
612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        */
613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = pos_indx[7] >> 1;
615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib &= 1;
617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ia = pos_indx[3] >> 1;
619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (ib == 1)
621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        ia = 4 - ia;
623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = pos_indx[7] >> 1;
626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = ((Word32) ib * 5) << 1;
628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tempWord32 = tempWord32 >> 1;
630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = (Word16) tempWord32;
632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ia;
634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib <<= 5;
636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += 12;
638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ic = (Word16)(((Word32) ib * 1311) >> 15);
640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ic <<= 2;
642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ia = pos_indx[3] & 1;
644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib = ((Word16)(pos_indx[7] & 1)) << 1;
646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ic;
648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ib += ia;
650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx[NB_TRACK_MR102+2] = ib;
652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} /* compress_code */
654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: code_8i40_31bits()
661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    x   Array of type Word16 -- target vector
666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cn  Array of type Word16 -- residual after long term prediction
667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h   Array of type Word16 -- impulse response of weighted synthesis filter
668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cod Array of type Word16 -- algebraic (fixed) codebook excitation
672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    y   Array of type Word16 -- filtered fixed codebook excitation
673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    indx Array of type Word16 -- index of 8 pulses (signs+positions)
674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow    Pointer to Flag      -- set when overflow occurs
675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION:
689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE:  Searches a 31 bit algebraic codebook containing 8 pulses
691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           in a frame of 40 samples.
692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION:
694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   The code contains 8 nonzero pulses: i0...i7.
695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   All pulses can have two possible amplitudes: +1 or -1.
696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   The 40 positions in a subframe are divided into 4 tracks of
697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   interleaved positions. Each track contains two pulses.
698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   The pulses can have the following possible positions:
699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      i0, i4 :  0, 4, 8,  12, 16, 20, 24, 28, 32, 36
701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      i1, i5 :  1, 5, 9,  13, 17, 21, 25, 29, 33, 37
702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      i2, i6 :  2, 6, 10, 14, 18, 22, 26, 30, 34, 38
703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      i3, i7 :  3, 7, 11, 15, 19, 23, 27, 31, 35, 39
704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   Each pair of pulses require 1 bit for their signs. The positions
706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   are encoded together 3,3 and 2 resulting in
707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   (7+3) + (7+3) + (5+2) bits for their
708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   positions. This results in a 31 (4 sign and 27 pos) bit codebook.
709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   The function determines the optimal pulse signs and positions, builds
710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   the codevector, and computes the filtered codevector.
711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [1] c8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid code_8i40_31bits(
748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 x[],        /* i : target vector                                  */
749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cn[],       /* i : residual after long term prediction            */
750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],        /* i : impulse response of weighted synthesis
751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                             filter                                         */
752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[],      /* o : algebraic (fixed) codebook excitation          */
753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],        /* o : filtered fixed codebook excitation             */
754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[],     /* o : 7 Word16, index of 8 pulses (signs+positions)  */
755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag  *pOverflow   /* o : Flag set when overflow occurs                  */
756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ipos[NB_PULSE];
759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pos_max[NB_TRACK_MR102];
760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 codvec[NB_PULSE];
761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 dn[L_CODE];
763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[L_CODE];
764d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
765d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rr[L_CODE][L_CODE];
766d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 linear_signs[NB_TRACK_MR102];
767d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 linear_codewords[NB_PULSE];
768d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
769d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h_x2(
770d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h,
771d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        x,
772d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        dn,
773d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        2,
774d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        NB_TRACK_MR102,
775d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        STEP_MR102,
776d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
777d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
778d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* 2 = use GSMEFR scaling */
779d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
780d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    set_sign12k2(
781d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        dn,
782d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        cn,
783d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        sign,
784d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pos_max,
785d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        NB_TRACK_MR102,
786d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        ipos,
787d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        STEP_MR102,
788d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
789d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
790d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* same setsign alg as GSM-EFR new constants though*/
791d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
792d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h(
793d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h,
794d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        sign,
795d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr,
796d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
797d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
798d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    search_10and8i40(
799d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        NB_PULSE,
800d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        STEP_MR102,
801d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        NB_TRACK_MR102,
802d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        dn,
803d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr,
804d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        ipos,
805d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pos_max,
806d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        codvec,
807d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
808d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
809d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    build_code(
810d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        codvec,
811d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        sign,
812d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        cod,
813d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h,
814d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        y,
815d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        linear_signs,
816d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        linear_codewords,
817d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
818d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
819d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    compress_code(
820d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        linear_signs,
821d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        linear_codewords,
822d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        indx,
823d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
824d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
825d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} /* code_8i40_31bits */
826d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
827d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
828d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
829