1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied.
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License.
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -------------------------------------------------------------------
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************************
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard:
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    3GPP TS 26.073
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Available from http://www.3gpp.org
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder.
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pathname: ./audio/gsm-amr/c/src/c4_17pf.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Functions:
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 05/26/2000
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Modified to pass overflow flag through to basic math function.
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The flag is passed back to the calling function by pointer reference.
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Optimized functions to further reduce clock cycle usage.
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              Updated copyright year, removed unnecessary include files,
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              and removed unused #defines.
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Changed round function name to pv_round to avoid conflict with
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              round function in C standard library.
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added #ifdef __cplusplus around extern'ed table.
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Purpose          : Searches a 17 bit algebraic codebook containing 4 pulses
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    in a frame of 40 samples
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "c4_17pf.h"
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "inv_sqrt.h"
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cor_h.h"
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "set_sign.h"
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*--------------------------------------------------------------------------*/
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberextern "C"
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; MACROS
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Define module specific macros here
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; DEFINES
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Include all pre-processor statements here. Include conditional
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; compile variables also.
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#define NB_PULSE  4
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; LOCAL FUNCTION DEFINITIONS
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Function Prototype declaration
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static void search_4i40(
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],        /* i : correlation between target and h[]            */
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn2[],       /* i : maximum of corr. in each track.               */
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE],/* i : matrix of autocorrelation                     */
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],    /* o : algebraic codebook vector                     */
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs                 */
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    );
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static Word16 build_code(
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],    /* i : algebraic codebook vector                     */
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[],   /* i : sign of dn[]                                  */
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],       /* o : algebraic (fixed) codebook excitation         */
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],         /* i : impulse response of weighted synthesis filter */
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],         /* o : filtered fixed codebook excitation            */
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[],      /* o : index of 4 pulses (position+sign+ampl)*4      */
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs                 */
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    );
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; LOCAL VARIABLE DEFINITIONS
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Variable declaration - defined here and used outside this module
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Declare variables used in this module but defined elsewhere
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    extern const Word16 gray[];
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    extern const Word16 dgray[];
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME:  code_4i40_17bits()
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        x[]   Array of type Word16 -- target vector
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        h[]   Array of type Word16 -- impulse response of weighted synthesis filter
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                      h[-L_subfr..-1] must be set to zero.
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        T0           Array of type Word16 -- Pitch lag
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pitch_sharp, Array of type Word16 --  Last quantized pitch gain
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        code[]  Array of type Word16 -- Innovative codebook
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y[]     Array of type Word16 -- filtered fixed codebook excitation
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * sign  Pointer of type Word16 -- Pointer to the signs of 4 pulses
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pOverflow    Pointer to Flag      -- set when overflow occurs
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        index
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PURPOSE:  Searches a 17 bit algebraic codebook containing 4 pulses
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               in a frame of 40 samples.
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     DESCRIPTION:
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       The code length is 40, containing 4 nonzero pulses: i0...i3.
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       All pulses can have two possible amplitudes: +1 or -1.
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       Pulse i0 to i2 can have 8 possible positions, pulse i3 can have
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       2x8=16 positions.
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          i0 :  0, 5, 10, 15, 20, 25, 30, 35.
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          i1 :  1, 6, 11, 16, 21, 26, 31, 36.
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          i2 :  2, 7, 12, 17, 22, 27, 32, 37.
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          i3 :  3, 8, 13, 18, 23, 28, 33, 38.
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                4, 9, 14, 19, 24, 29, 34, 39.
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c3_14pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code_4i40_17bits(
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 x[],         /* i : target vector                                 */
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],         /* i : impulse response of weighted synthesis filter */
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*     h[-L_subfr..-1] must be set to zero.          */
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 T0,          /* i : Pitch lag                                     */
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 pitch_sharp, /* i : Last quantized pitch gain                     */
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 code[],      /* o : Innovative codebook                           */
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],         /* o : filtered fixed codebook excitation            */
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 * sign,      /* o : Signs of 4 pulses                             */
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs                 */
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[NB_PULSE];
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[L_CODE];
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn2[L_CODE];
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[L_CODE];
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[L_CODE][L_CODE];
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i;
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 index;
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sharp;
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 tempWord;
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sharp = pitch_sharp << 1;
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (T0 < L_CODE)
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = T0; i < L_CODE; i++)
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                tempWord =
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mult(
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        h[i - T0],
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sharp,
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                h[i] =
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    add(
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        h[i],
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        tempWord,
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h_x(
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            h,
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            x,
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            1,
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        set_sign(
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn_sign,
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn2,
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            4);
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h(
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            h,
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn_sign,
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            rr,
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        search_4i40(
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn2,
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            rr,
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            codvec,
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* function result */
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        index =
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            build_code(
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                codvec,
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                dn_sign,
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                code,
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                h,
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y,
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                sign,
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-----------------------------------------------------------------*
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * Compute innovation vector gain.                                 *
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * Include fixed-gain pitch contribution into code[].              *
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *-----------------------------------------------------------------*/
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        tempWord = T0 - L_CODE;
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (tempWord < 0)
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = T0; i < L_CODE; i++)
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                tempWord =
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mult(
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        code[i - T0],
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sharp,
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                code[i] =
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    add(
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        code[i],
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        tempWord,
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return index;
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: search_4i40()
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn[]         Array of type Word16 -- correlation between target and h[]
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn2[]        Array of type Word16 -- maximum of corr. in each track.
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rr[][L_CODE] Double Array of type Word16 -- autocorrelation matrix
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec[]     Array of type Word16 -- algebraic codebook vector
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pOverflow    Pointer to Flag      -- set when overflow occurs
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PURPOSE: Search the best codevector; determine positions of the 4 pulses
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              in the 40-sample frame.
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c4_17pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static void search_4i40(
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],         /* i : correlation between target and h[]  */
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn2[],        /* i : maximum of corr. in each track.     */
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE], /* i : matrix of autocorrelation           */
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],     /* o : algebraic codebook vector           */
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow   /* o : Flag set when overflow occurs       */
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i0;
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i1;
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i2;
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i3;
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ix = 0; /* initialization only needed to keep gcc silent */
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ps = 0; /* initialization only needed to keep gcc silent */
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i;
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 pos;
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 track;
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ipos[NB_PULSE];
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 psk;
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ps0;
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ps1;
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sq;
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sq1;
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alpk;
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alp;
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alp_16;
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p_codvec = &codvec[0];
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s;
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 alp0;
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 alp1;
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        OSCL_UNUSED_ARG(pOverflow);
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Default value */
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        psk = -1;
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        alpk = 1;
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < NB_PULSE; i++)
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(p_codvec++) = i;
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (track = 3; track < 5; track++)
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* fix starting position */
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ipos[0] = 0;
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ipos[1] = 1;
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ipos[2] = 2;
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ipos[3] = track;
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /*------------------------------------------------------------------*
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             * main loop: try 4 tracks.                                         *
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             *------------------------------------------------------------------*/
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = 0; i < NB_PULSE; i++)
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /*----------------------------------------------------------------*
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * i0 loop: try 4 positions (use position with max of corr.).     *
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 *----------------------------------------------------------------*/
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP)
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    if (dn2[i0] >= 0)
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    {
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps0 = dn[i0];
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp0 = (Word32) rr[i0][i0] << 14;
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /*----------------------------------------------------------------*
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         * i1 loop: 8 positions.                                          *
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *----------------------------------------------------------------*/
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sq = -1;
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp = 1;
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps = 0;
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ix = ipos[1];
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* initialize 4 index for next loop. */
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /*-------------------------------------------------------------------*
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *  These index have low complexity address computation because      *
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *  they are, in fact, pointers with fixed increment.  For example,  *
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *  "rr[i0][i3]" is a pointer initialized to "&rr[i0][ipos[3]]"      *
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *  and incremented by "STEP".                                       *
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *-------------------------------------------------------------------*/
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP)
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        {
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* idx increment = STEP */
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* ps1 = add(ps0, dn[i1], pOverflow); */
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            ps1 = ps0 + dn[i1];
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1]; */
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp0, rr[i1][i1], _1_4, pOverflow); */
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 = alp0 + ((Word32) rr[i1][i1] << 14);
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1, rr[i0][i1], _1_2, pOverflow); */
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i0][i1] << 15;
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* sq1 = mult(ps1, ps1, pOverflow); */
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp_16 = pv_round(alp1, pOverflow); */
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_mult(alp, sq1, pOverflow); */
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s = ((Word32) alp * sq1) << 1;
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_msu(s, sq, alp_16, pOverflow); */
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s -= (((Word32) sq * alp_16) << 1);
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            if (s > 0)
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            {
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                sq = sq1;
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ps = ps1;
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                alp = alp_16;
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ix = i1;
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            }
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        }
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        i1 = ix;
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /*----------------------------------------------------------------*
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         * i2 loop: 8 positions.                                          *
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *----------------------------------------------------------------*/
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps0 = ps;
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* alp0 = L_mult(alp, _1_4, pOverflow); */
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp0 = (Word32) alp << 14;
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sq = -1;
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp = 1;
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps = 0;
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ix = ipos[2];
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* initialize 4 index for next loop (see i1 loop) */
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        for (i2 = ipos[2]; i2 < L_CODE; i2 += STEP)
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        {
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* index increment = STEP */
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* ps1 = add(ps0, dn[i2], pOverflow); */
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            ps1 = ps0 + dn[i2];
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = alp0 + rr[i0][i2] + rr[i1][i2] + 1/2*rr[i2][i2]; */
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* idx incr = STEP */
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp0, rr[i2][i2], _1_16, pOverflow); */
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 = alp0 + ((Word32) rr[i2][i2] << 12);
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* idx incr = STEP */
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1, rr[i1][i2], _1_8, pOverflow); */
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i1][i2] << 13;
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* idx incr = STEP */
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1,rr[i0][i2], _1_8, pOverflow); */
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i0][i2] << 13;
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* sq1 = mult(ps1, ps1, pOverflow); */
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp_16 = pv_round(alp1, pOverflow); */
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_mult(alp, sq1, pOverflow); */
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s = ((Word32) alp * sq1) << 1;
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_msu(s, sq, alp_16, pOverflow); */
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s -= (((Word32) sq * alp_16) << 1);
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            if (s > 0)
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            {
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                sq = sq1;
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ps = ps1;
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                alp = alp_16;
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ix = i2;
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            }
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        }
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        i2 = ix;
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /*----------------------------------------------------------------*
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         * i3 loop: 8 positions.                                          *
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *----------------------------------------------------------------*/
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps0 = ps;
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp0 = L_deposit_h(alp);
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sq = -1;
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp = 1;
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ps = 0;
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ix = ipos[3];
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* initialize 5 index for next loop (see i1 loop) */
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        for (i3 = ipos[3]; i3 < L_CODE; i3 += STEP)
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        {
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* ps1 = add(ps0, dn[i3], pOverflow); */
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            ps1 = ps0 + dn[i3]; /* index increment = STEP */
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = alp0 + rr[i0][i3] + rr[i1][i3] + rr[i2][i3] + 1/2*rr[i3][i3]; */
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp0, rr[i3][i3], _1_16, pOverflow); */
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 = alp0 + ((Word32) rr[i3][i3] << 12); /* idx incr = STEP */
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1, rr[i2][i3], _1_8, pOverflow); */
595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i2][i3] << 13;  /* idx incr = STEP */
596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1, rr[i1][i3], _1_8, pOverflow); */
598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i1][i3] << 13;  /* idx incr = STEP */
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp1 = L_mac(alp1, rr[i0][i3], _1_8, pOverflow); */
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp1 += (Word32) rr[i0][i3] << 13;  /* idx incr = STEP */
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* sq1 = mult(ps1, ps1, pOverflow); */
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* alp_16 = pv_round(alp1, pOverflow); */
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_mult(alp, sq1, pOverflow); */
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s = ((Word32) alp * sq1) << 1;
611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            /* s = L_msu(s, sq, alp_16, pOverflow); */
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            s -= (((Word32) sq * alp_16) << 1);
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            if (s > 0)
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            {
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                sq = sq1;
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ps = ps1;
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                alp = alp_16;
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                ix = i3;
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            }
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        }
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /*----------------------------------------------------------------*
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         * memorise codevector if this one is better than the last one.   *
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         *----------------------------------------------------------------*/
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* s = L_mult(alpk, sq, pOverflow); */
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        s = ((Word32) alpk * sq) << 1;
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        /* s = L_msu(s, psk, alp, pOverflow); */
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        s -= (((Word32) psk * alp) << 1);
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        if (s > 0)
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        {
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            psk = sq;
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            alpk = alp;
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            p_codvec = &codvec[0];
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            *(p_codvec++) = i0;
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            *(p_codvec++) = i1;
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            *(p_codvec++) = i2;
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            *(p_codvec) = ix;
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        }
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    }
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /*----------------------------------------------------------------*
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * Cyclic permutation of i0,i1,i2 and i3.                         *
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 *----------------------------------------------------------------*/
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pos = ipos[3];
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ipos[3] = ipos[2];
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ipos[2] = ipos[1];
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ipos[1] = ipos[0];
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ipos[0] = pos;
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME:  build_code()
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec[]   Array of type Word16 -- position of pulses
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn_sign[]  Array of type Word16 -- sign of pulses
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        h[]        Array of type Word16 -- impulse response of
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                           weighted synthesis filter
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod[]  Array of type Word16 -- innovative code vector
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y[]    Array of type Word16 -- filtered innovative code
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign[] Array of type Word16 -- index of 4 pulses (sign + position)
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pOverflow  Pointer to Flag  -- set when overflow occurs
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PURPOSE: Builds the codeword, the filtered codeword and index of the
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              codevector, based on the signs and positions of 4 pulses.
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c4_17pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static Word16
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    build_code(
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],  /* i : position of pulses                            */
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[], /* i : sign of pulses                                */
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],     /* o : innovative code vector                        */
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],       /* i : impulse response of weighted synthesis filter */
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],       /* o : filtered innovative code                      */
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[],    /* o : index of 4 pulses (sign+position)             */
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs               */
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i;
749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 j;
750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 k;
751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 track;
752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 index;
753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 _sign[NB_PULSE];
754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 indx;
755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rsign;
756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p0;
758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p1;
759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p2;
760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p3;
761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p_cod = &cod[0];
762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s;
764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++)
766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(p_cod++) = 0;
768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx = 0;
771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rsign = 0;
772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (k = 0; k < NB_PULSE; k++)
774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            i = codvec[k]; /* read pulse position */
776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            j = dn_sign[i]; /* read sign          */
777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* index = pos/5 */
779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* index = mult(i, 6554, pOverflow); */
780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            index = (Word16)(((Word32) i * 6554) >> 15);
781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* track = pos%5 */
783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* s = L_mult(index, 5, pOverflow); */
784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s = ((Word32) index * 5) << 1;
785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* s = L_shr(s, 1, pOverflow); */
787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s >>= 1;
788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* track = sub(i, (Word16) s, pOverflow); */
790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            track = i - (Word16) s;
791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            index = gray[index];
793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (track == 1)
795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* index = shl(index, 3, pOverflow); */
797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index <<= 3;
798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else if (track == 2)
800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* index = shl(index, 6, pOverflow); */
802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index <<= 6;
803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else if (track == 3)
805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* index = shl(index, 10, pOverflow); */
807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index <<= 10;
808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else if (track == 4)
810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                track = 3;
812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* index = shl(index, 10, pOverflow); */
814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index <<= 10;
815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* index = add(index, 512, pOverflow); */
817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index += 512;
818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (j > 0)
821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                cod[i] = 8191;
823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                _sign[k] = 32767;
824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* track = shl(1, track, pOverflow); */
826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                track = 1 << track;
827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* rsign = add(rsign, track, pOverflow); */
829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                rsign += track;
830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                cod[i] = -8192;
834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                _sign[k] = (Word16) - 32768L;
835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* indx = add(indx, index, pOverflow); */
838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            indx += index;
839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *sign = rsign;
841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p0 = h - codvec[0];
843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p1 = h - codvec[1];
844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p2 = h - codvec[2];
845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p3 = h - codvec[3];
846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++)
848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s = 0;
850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mac(
852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p0++,
854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    _sign[0],
855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mac(
859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p1++,
861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    _sign[1],
862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mac(
866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p2++,
868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    _sign[2],
869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mac(
873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p3++,
875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    _sign[3],
876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            y[i] =
879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pv_round(
880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        } /* for (i = 0; i < L_CODE; i++) */
884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return indx;
886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    } /* build_code */
888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus
890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
892