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/c2_9pf.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Funtions: code_2i40_9bits
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           search_2i40
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           Test_search_2i40
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           build_code
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           Test_build_code
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 05/26/2000
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Changed template used to PV coding template. First attempt at
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          optimizing C code.
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated file per comments gathered from Phase 2/3 review.
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added setting of Overflow flag in inlined code.
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              template.
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replaced basic_op.h with the header files of the math functions
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              used by the file.
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Defined one local variable per line.
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Passed in pOverflow flag for EPOC compatibility.
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Optimized search_2i40() to reduce clock cycle usage.
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Removed unnecessary include files and #defines.
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Changed function name to pv_round to avoid conflict with
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              round function in C standard library.
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added #ifdef __cplusplus around extern'ed table.
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This file contains the functions that search a 9 bit algebraic codebook
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber containing 2 pulses in a frame of 40 samples.
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "c2_9pf.h"
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "inv_sqrt.h"
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cor_h.h"
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cor_h_x.h"
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "set_sign.h"
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*--------------------------------------------------------------------------*/
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberextern "C"
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; MACROS
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Define module specific macros here
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; DEFINES
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Include all pre-processor statements here. Include conditional
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; compile variables also.
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#define NB_PULSE  2
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; LOCAL FUNCTION DEFINITIONS
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Function Prototype declaration
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static void search_2i40(
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,       /* i : subframe number                               */
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],        /* i : correlation between target and h[]            */
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE],/* i : matrix of autocorrelation                     */
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],    /* o : algebraic codebook vector                     */
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs                 */
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    );
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static Word16 build_code(
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,       /* i : subframe number                               */
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],    /* i : algebraic codebook vector                     */
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[],   /* i : sign of dn[]                                  */
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],       /* o : algebraic (fixed) codebook excitation         */
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],         /* i : impulse response of weighted synthesis filter */
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],         /* o : filtered fixed codebook excitation            */
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[],      /* o : sign of 2 pulses                              */
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs                 */
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    );
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; LOCAL VARIABLE DEFINITIONS
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Variable declaration - defined here and used outside this module
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word16 trackTable[4*5] =
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        0, 1, 0, 1, -1, /* subframe 1; track to code;
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         * -1 do not code this position
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         */
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        0, -1, 1, 0, 1, /* subframe 2 */
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        0, 1, 0, -1, 1, /* subframe 3 */
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        0, 1, -1, 0, 1
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    };/* subframe 4 */
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------------
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ; Declare variables used in this module but defined elsewhere
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ----------------------------------------------------------------------------*/
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    extern const Word16 startPos[];
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: code_2i40_9bits
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subNr = subframe number (Word16)
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        x  = target buffer (Word16)
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        h  = buffer containing the impulse response of the
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             weighted synthesis filter; h[-L_subfr .. -1] must be
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             set to zero (Word16)
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        T0 = pitch lag (Word16)
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pitch_sharp = last quantized pitch gain (Word16)
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        code = buffer containing the innovative codebook (Word16)
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y = buffer containing the filtered fixed codebook excitation (Word16)
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign = pointer to the signs of 2 pulses (Word16)
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        code buffer contains the new innovation vector gains
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        index = code index (Word16)
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Overflow = overflow flag (Flag)
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     This function searches a 9 bit algebraic codebook containing 2 pulses in a
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     frame of 40 samples.
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     The code length is 40, containing 2 nonzero pulses: i0...i1. All pulses can
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     have two possible amplitudes: +1 or -1. Pulse i0 can have 8 possible positions,
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     pulse i1 can have 8 positions. Also coded is which track pair should be used,
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     i.e. first or second pair. Where each pair contains 2 tracks.
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        First subframe:
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        first   i0 :  0, 5, 10, 15, 20, 25, 30, 35.
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            i1 :  2, 7, 12, 17, 22, 27, 32, 37.
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        second  i0 :  1, 6, 11, 16, 21, 26, 31, 36.
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  3, 8, 13, 18, 23, 28, 33, 38.
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Second subframe:
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        first   i0 :  0, 5, 10, 15, 20, 25, 30, 35.
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  3, 8, 13, 18, 23, 28, 33, 38.
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        second  i0 :  2, 7, 12, 17, 22, 27, 32, 37.
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  4, 9, 14, 19, 24, 29, 34, 39.
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Third subframe:
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        first   i0 :  0, 5, 10, 15, 20, 25, 30, 35.
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  2, 7, 12, 17, 22, 27, 32, 37.
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        second  i0 :  1, 6, 11, 16, 21, 26, 31, 36.
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  4, 9, 14, 19, 24, 29, 34, 39.
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Fourth subframe:
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        first   i0 :  0, 5, 10, 15, 20, 25, 30, 35.
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  3, 8, 13, 18, 23, 28, 33, 38.
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        second  i0 :  1, 6, 11, 16, 21, 26, 31, 36.
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    i1 :  4, 9, 14, 19, 24, 29, 34, 39.
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code_2i40_9bits(
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,       // i : subframe number
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 x[],         // i : target vector
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],         // i : impulse response of weighted synthesis filter
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            //     h[-L_subfr..-1] must be set to zero.
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 T0,          // i : Pitch lag
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 pitch_sharp, // i : Last quantized pitch gain
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 code[],      // o : Innovative codebook
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],         // o : filtered fixed codebook excitation
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 * sign       // o : Signs of 2 pulses
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[NB_PULSE];
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[L_CODE], dn2[L_CODE], dn_sign[L_CODE];
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[L_CODE][L_CODE];
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i, index, sharp;
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sharp = shl(pitch_sharp, 1);
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (sub(T0, L_CODE) < 0)
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           for (i = T0; i < L_CODE; i++) {
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              h[i] = add(h[i], mult(h[i - T0], sharp));
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           }
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h_x(h, x, dn, 1);
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        set_sign(dn, dn_sign, dn2, 8); // dn2[] not used in this codebook search
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h(h, dn_sign, rr);
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        search_2i40(subNr, dn, rr, codvec);
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        index = build_code(subNr, codvec, dn_sign, code, h, y, sign);
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * Compute innovation vector gain.                                 *
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * Include fixed-gain pitch contribution into code[].              *
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (sub(T0, L_CODE) < 0)
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           for (i = T0; i < L_CODE; i++) {
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              code[i] = add(code[i], mult(code[i - T0], sharp));
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           }
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return index;
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code_2i40_9bits(
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,       /* i : subframe number                          */
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 x[],         /* i : target vector                            */
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],         /* i : impulse response of weighted synthesis   */
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*     filter h[-L_subfr..-1] must be set to 0. */
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 T0,          /* i : Pitch lag                                */
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 pitch_sharp, /* i : Last quantized pitch gain                */
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 code[],      /* o : Innovative codebook                      */
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],         /* o : filtered fixed codebook excitation       */
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 * sign,      /* o : Signs of 2 pulses                        */
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow  /* o : Flag set when overflow occurs            */
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[NB_PULSE];
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[L_CODE];
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn2[L_CODE];
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[L_CODE];
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[L_CODE][L_CODE];
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
3212d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 i;
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 index;
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sharp;
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 temp;
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 L_temp;
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        L_temp = ((Word32) pitch_sharp) << 1;
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Check for overflow condition */
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (L_temp != (Word32)((Word16) L_temp))
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(pOverflow) = 1;
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sharp = (pitch_sharp > 0) ? MAX_16 : MIN_16;
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sharp = (Word16) L_temp;
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (T0 < L_CODE)
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = T0; i < L_CODE; i++)
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                temp =
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mult(
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        *(h + i - T0),
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sharp,
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(h + i) =
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    add(
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        *(h + i),
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        temp,
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h_x(
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            h,
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            x,
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            1,
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* dn2[] not used in this codebook search */
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        set_sign(
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn_sign,
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn2,
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            8);
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cor_h(
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            h,
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn_sign,
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            rr,
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        search_2i40(
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subNr,
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            rr,
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            codvec,
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        index =
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            build_code(
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subNr,
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                codvec,
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                dn_sign,
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                code,
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                h,
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y,
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                sign,
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-----------------------------------------------------------------*
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         * Compute innovation vector gain.                                 *
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         * Include fixed-gain pitch contribution into code[].              *
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *-----------------------------------------------------------------*/
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (T0 < L_CODE)
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = T0; i < L_CODE; i++)
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                temp =
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mult(
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        *(code + i - T0),
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sharp,
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(code + i) =
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    add(
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        *(code + i),
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        temp,
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(index);
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: search_2i40
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subNr = subframe number (Word16)
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn = vector containing the correlation between target and the impulse
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             response of the weighted synthesis filter (Word16)
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rr = autocorrelation matrix (Word16)
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec = algebraic codebook vector (Word16)
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec contains the newly calculated codevectors
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        startPos = table containing the start positions used by fixed codebook
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   routines (const Word16)
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     This function searches the best codevector and determines the positions of
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the 2 pulses in the 40-sample frame.
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static void search_2i40(
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,        // i : subframe number
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],         // i : correlation between target and h[]
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE], // i : matrix of autocorrelation
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[]      // o : algebraic codebook vector
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i0, i1;
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ix = 0; // initialization only needed to keep gcc silent
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16  track1, ipos[NB_PULSE];
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 psk, ps0, ps1, sq, sq1;
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alpk, alp, alp_16;
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s, alp0, alp1;
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i;
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        psk = -1;
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        alpk = 1;
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < NB_PULSE; i++)
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           codvec[i] = i;
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (track1 = 0; track1 < 2; track1++) {
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           // fix starting position
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           ipos[0] = startPos[subNr*2+8*track1];
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           ipos[1] = startPos[subNr*2+1+8*track1];
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               * i0 loop: try 8 positions.                                      *
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP) {
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 ps0 = dn[i0];
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 alp0 = L_mult(rr[i0][i0], _1_4);
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               * i1 loop: 8 positions.                                          *
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 sq = -1;
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 alp = 1;
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 ix = ipos[1];
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *-------------------------------------------------------------------*
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *  These index have low complexity address computation because      *
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *  they are, in fact, pointers with fixed increment.  For example,  *
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *  "rr[i0][i2]" is a pointer initialized to "&rr[i0][ipos[2]]"      *
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *  and incremented by "STEP".                                       *
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *-------------------------------------------------------------------*
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP) {
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    ps1 = add(ps0, dn[i1]);   // idx increment = STEP
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    // alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1];
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp1 = L_mac(alp0, rr[i1][i1], _1_4); // idx incr = STEP
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp1 = L_mac(alp1, rr[i0][i1], _1_2); // idx incr = STEP
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    sq1 = mult(ps1, ps1);
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp_16 = pv_round(alp1);
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s = L_msu(L_mult(alp, sq1), sq, alp_16);
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    if (s > 0) {
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                       sq = sq1;
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                       alp = alp_16;
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                       ix = i1;
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    }
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 }
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               * memorise codevector if this one is better than the last one.   *
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               *----------------------------------------------------------------*
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 s = L_msu(L_mult(alpk, sq), psk, alp);
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 if (s > 0) {
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    psk = sq;
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alpk = alp;
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    codvec[0] = i0;
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    codvec[1] = ix;
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 }
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              }
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static void search_2i40(
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,        /* i : subframe number                    */
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],         /* i : correlation between target and h[] */
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE], /* i : matrix of autocorrelation          */
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],     /* o : algebraic codebook vector          */
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow   /* o : Flag set when overflow occurs      */
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
5952d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 i0;
5962d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 i1;
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ix = 0; /* initialization only needed to keep gcc silent */
5982d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 track1;
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ipos[NB_PULSE];
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 psk;
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ps0;
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 ps1;
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sq;
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sq1;
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alpk;
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alp;
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 alp_16;
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s;
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 alp0;
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 alp1;
6112d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 i;
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 L_temp;
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p_codvec = &codvec[0];
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        OSCL_UNUSED_ARG(pOverflow);
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        psk = -1;
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        alpk = 1;
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Unrolled the following FOR loop to save MIPS */
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* for (i = 0; i < NB_PULSE; i++)           */
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* {                            */
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*  *(codvec + i) = i;          */
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* }                        */
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *(p_codvec++) = 0;
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *(p_codvec) = 1;
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (track1 = 0; track1 < 2; track1++)
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* fix starting position */
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            i = (subNr << 1) + (track1 << 3);
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *ipos = *(startPos + i);
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(ipos + 1) = *(startPos + i + 1);
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /*----------------------------------------------------------*
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             * i0 loop: try 8 positions.                                *
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             *----------------------------------------------------------*/
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i0 = *ipos; i0 < L_CODE; i0 += STEP)
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ps0 = *(dn + i0);
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* Left shift by 1 converts integer product to */
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* fractional product.                 */
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                alp0 = (Word32) rr[i0][i0] << 14;
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /*--------------------------------------------------*
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * i1 loop: 8 positions.                            *
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 *--------------------------------------------------*/
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                sq = -1;
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                alp = 1;
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                ix = *(ipos + 1);
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /*--------------------------------------------------*
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * These index have low complexity address          *
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * computation because they are, in fact, pointers  *
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * with fixed increment. For example, "rr[i0][i2]"  *
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 * is a pointer initialized to "&rr[i0][ipos[2]]"   *
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *  and incremented by "STEP".                       *
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *---------------------------------------------------*/
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                for (i1 = *(ipos + 1); i1 < L_CODE; i1 += STEP)
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* idx increment = STEP */
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* ps1 = add(ps0, *(dn + i1), pOverflow); */
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    ps1 = ps0 + dn[i1];
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* alp1 = alp0+rr[i0][i1]+1/2*rr[i1][i1]; */
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* idx incr = STEP */
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* Extra left shift by 1 converts integer  */
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* product to fractional product     */
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* alp1 = L_add(alp0, s, pOverflow); */
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp1 = alp0 + ((Word32) rr[i1][i1] << 14);
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* idx incr = STEP */
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* Extra left shift by 1 converts integer  */
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* product to fractional product     */
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* alp1 = L_add(alp1, s, pOverflow); */
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp1 += (Word32) rr[i0][i1] << 15;
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* sq1 = mult(ps1, ps1, pOverflow); */
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    sq1 = (Word16)(((Word32) ps1 * ps1) >> 15);
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* alp_16 = pv_round(alp1, pOverflow); */
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16);
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* L_temp = L_mult(alp, sq1, pOverflow); */
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    L_temp = ((Word32) alp * sq1) << 1;
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    /* s = L_msu(L_temp, sq, alp_16, pOverflow); */
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s = L_temp - (((Word32) sq * alp_16) << 1);
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    if (s > 0)
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    {
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        sq = sq1;
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        alp = alp_16;
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        ix = i1;
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    }
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* memorize codevector if this one is better than the last one. */
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* L_temp = L_mult(alpk, sq, pOverflow); */
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_temp = ((Word32) alpk * sq) << 1;
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* s = L_msu(L_temp, psk, alp, pOverflow); */
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                s = L_temp - (((Word32) psk * alp) << 1);
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                if (s > 0)
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    psk = sq;
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    alpk = alp;
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    p_codvec = &codvec[0];
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *(p_codvec++) = i0;
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *(p_codvec) = ix;
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: Test_search_2i40
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subNr = subframe number (Word16)
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn = vector containing the correlation between target and the impulse
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             response of the weighted synthesis filter (Word16)
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rr = autocorrelation matrix (Word16)
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec = algebraic codebook vector (Word16)
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec contains the newly calculated codevectors
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        startPos = table containing the start positions used by fixed codebook
754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   routines (const Word16)
755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     This function provides external access to the local function search_2i40.
760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL search_2i40 ( subNr = subNr
775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                dn = dn
776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                rr = rr
777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                codvec = codvec )
778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(nothing)
780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    void Test_search_2i40(
805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,        /* i : subframe number                    */
806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn[],         /* i : correlation between target and h[] */
807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 rr[][L_CODE], /* i : matrix of autocorrelation          */
808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],     /* o : algebraic codebook vector          */
809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow   /* o : Flag set when overflow occurs      */
810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*----------------------------------------------------------------------------
813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         CALL search_2i40 ( subNr = subNr
814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    dn = dn
815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    rr = rr
816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    codvec = codvec )
817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           MODIFYING(nothing)
818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           RETURNING(nothing)
819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        ----------------------------------------------------------------------------*/
820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        search_2i40(
821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subNr,
822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dn,
823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            rr,
824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            codvec,
825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: build_code
835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subNr = subframe number (Word16)
840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec = vector containing the position of pulses (Word16)
841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn_sign = vector containing the sign of pulses (Word16)
842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod = innovative code vector (Word16)
843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        h = vector containing the impulse response of the weighted
844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            synthesis filter (Word16)
845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y = vector containing the filtered innovative code (Word16)
846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign = vector containing the sign of 2 pulses (Word16)
847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod vector contains the new innovative code
850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y vector contains the new filtered innovative code
851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign vector contains the sign of 2 pulses
852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx = codebook index (Word16)
855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        trackTable = table used for tracking codewords (Word16)
861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     This function builds the codeword, the filtered codeword and index of the
866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     codevector, based on the signs and positions of 2 pulses.
867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static Word16 build_code(
882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,     // i : subframe number
883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],  // i : position of pulses
884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[], // i : sign of pulses
885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],     // o : innovative code vector
886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],       // i : impulse response of weighted synthesis filter
887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],       // o : filtered innovative code
888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[]     // o : sign of 2 pulses
889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 i, j, k, track, first, index, _sign[NB_PULSE], indx, rsign;
892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p0, *p1, *pt;
893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s;
894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        static Word16 trackTable[4*5] = {
895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           0, 1, 0, 1, -1, // subframe 1; track to code; -1 do not code this position
896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           0, -1, 1, 0, 1, // subframe 2
897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           0, 1, 0, -1, 1, // subframe 3
898b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           0, 1, -1, 0, 1};// subframe 4
899b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
900b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pt = &trackTable[add(subNr, shl(subNr, 2))];
901b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
902b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++) {
903b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            cod[i] = 0;
904b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
905b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
906b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx = 0;
907b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rsign = 0;
908b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (k = 0; k < NB_PULSE; k++) {
909b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           i = codvec[k];    // read pulse position
910b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           j = dn_sign[i];   // read sign
911b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
912b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           index = mult(i, 6554);    // index = pos/5
913b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     // track = pos%5
914b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           track = sub(i, extract_l(L_shr(L_mult(index, 5), 1)));
915b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
916b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           first = pt[track];
917b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
918b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           if (first == 0) {
919b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              if (k == 0) {
920b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 track = 0;
921b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              } else {
922b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 track = 1;
923b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 index = shl(index, 3);
924b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              }
925b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           } else {
926b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              if (k == 0) {
927b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 track = 0;
928b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 index = add(index, 64);  // table bit is MSB
929b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              } else {
930b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 track = 1;
931b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 index = shl(index, 3);
932b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              }
933b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           }
934b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
935b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           if (j > 0) {
936b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              cod[i] = 8191;
937b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              _sign[k] = 32767;
938b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              rsign = add(rsign, shl(1, track));
939b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           } else {
940b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              cod[i] = -8192;
941b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              _sign[k] = (Word16) - 32768L;
942b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
943b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
944b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           indx = add(indx, index);
945b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
946b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *sign = rsign;
947b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
948b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p0 = h - codvec[0];
949b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p1 = h - codvec[1];
950b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
951b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++) {
952b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           s = 0;
953b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           s = L_mac(s, *p0++, _sign[0]);
954b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           s = L_mac(s, *p1++, _sign[1]);
955b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           y[i] = pv_round(s);
956b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
957b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
958b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return indx;
959b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
960b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
961b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
962b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
963b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
964b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
965b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
966b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
967b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
968b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
969b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
970b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
971b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
972b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
973b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
974b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
975b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
976b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
977b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
978b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
979b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
980b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
981b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
982b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
983b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
984b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    static Word16 build_code(
985b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,     /* i : subframe number                            */
986b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],  /* i : position of pulses                         */
987b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[], /* i : sign of pulses                             */
988b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],     /* o : innovative code vector                     */
989b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],       /* i : impulse response of weighted synthesis     */
990b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*     filter                                     */
991b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],       /* o : filtered innovative code                   */
992b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[],    /* o : sign of 2 pulses                           */
993b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag  *pOverflow  /* o : Flag set when overflow occurs              */
994b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
995b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
9962d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 i;
9972d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 j;
9982d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 k;
9992d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 track;
10002d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 first;
10012d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 index;
10022d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer        Word16 rsign;
1003b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 indx;
1004b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 _sign[NB_PULSE];
1005b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p0;
1006b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 *p1;
1007b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1008b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        const Word16 *pt;
1009b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1010b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 s;
1011b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1012b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pt = trackTable + subNr + (subNr << 2);
1013b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1014b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++)
1015b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1016b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(cod + i) = 0;
1017b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1018b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1019b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx = 0;
1020b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        rsign = 0;
1021b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1022b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (k = 0; k < NB_PULSE; k++)
1023b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1024b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            i = *(codvec + k);  /* read pulse position */
1025b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            j = *(dn_sign + i); /* read sign           */
1026b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1027b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s = ((Word32)(i * 6554)) >> 15;
1028b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            index = (Word16) s; /* index = pos/5 */
1029b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1030b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            track = i - (5 * index);    /* track = pos%5 */
1031b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1032b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            first = *(pt + track);
1033b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1034b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1035b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (k == 0)
1036b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1037b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                track = 0;
1038b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1039b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                if (first != 0)
1040b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                {
1041b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    index += 64;  /* table bit is MSB */
1042b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                }
1043b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1044b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
1045b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1046b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                track = 1;
1047b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                index <<= 3;
1048b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1049b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1050b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (j > 0)
1051b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1052b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(cod + i) = 8191;
1053b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(_sign + k) = 32767;
1054b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                rsign += (1 << track);
1055b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1056b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
1057b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1058b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(cod + i) = ~(8192) + 1;
1059b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(_sign + k) = (Word16)(~(32768) + 1);
1060b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1061b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1062b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            indx += index;
1063b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1064b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1065b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *sign = rsign;
1066b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1067b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p0 = h - *codvec;
1068b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p1 = h - *(codvec + 1);
1069b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1070b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_CODE; i++)
1071b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1072b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s = 0;
1073b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
1074b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mult(
1075b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p0++,
1076b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *_sign,
1077b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
1078b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1079b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            s =
1080b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_mac(
1081b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
1082b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *p1++,
1083b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    *(_sign + 1),
1084b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
1085b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1086b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(y + i) =
1087b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pv_round(
1088b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    s,
1089b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
1090b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1091b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1092b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(indx);
1093b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1094b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1095b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /****************************************************************************/
1096b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1097b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
1098b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1099b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION NAME: Test_build_code
1100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     INPUT AND OUTPUT DEFINITIONS
1102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Inputs:
1104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subNr = subframe number (Word16)
1105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        codvec = vector containing the position of pulses (Word16)
1106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dn_sign = vector containing the sign of pulses (Word16)
1107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod = innovative code vector (Word16)
1108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        h = vector containing the impulse response of the weighted
1109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            synthesis filter (Word16)
1110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y = vector containing the filtered innovative code (Word16)
1111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign = vector containing the sign of 2 pulses (Word16)
1112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Outputs:
1114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod vector contains the new innovative code
1115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y vector contains the new filtered innovative code
1116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sign vector contains the sign of 2 pulses
1117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Returns:
1119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        indx = codebook index (Word16)
1120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Global Variables Used:
1122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        None
1123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Local Variables Needed:
1125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        trackTable = table used for tracking codewords (Word16)
1126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     FUNCTION DESCRIPTION
1129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     This function provides external access to the local function build_code.
1131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REQUIREMENTS
1134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     None
1136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     REFERENCES
1139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     PSEUDO-CODE
1144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CALL build_code ( subNr = subNr
1146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               codvec = codvec
1147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               dn_sign = dn_sign
1148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               cod = cod
1149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               h = h
1150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               y = y
1151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               sign = sign )
1152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       MODIFYING(nothing)
1153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       RETURNING(indx)
1154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     RESOURCES USED [optional]
1157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     When the code is written for a specific target processor the
1159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     the resources used should be documented below.
1160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     HEAP MEMORY USED: x bytes
1162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     STACK MEMORY USED: x bytes
1164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CLOCK CYCLES: (cycle count equation for this function) + (variable
1166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    used to represent cycle count for each subroutine
1167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    called)
1168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         where: (cycle count variable) = cycle count for [subroutine
1169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                         name]
1170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     CAUTION [optional]
1173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     [State any special notes, constraints or cautions for users of this function]
1174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ------------------------------------------------------------------------------
1176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    */
1177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 Test_build_code(
1179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 subNr,      /* i : subframe number                            */
1180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 codvec[],   /* i : position of pulses                         */
1181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 dn_sign[],  /* i : sign of pulses                             */
1182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 cod[],      /* o : innovative code vector                     */
1183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 h[],        /* i : impulse response of weighted synthesis     */
1184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*     filter                                     */
1185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 y[],        /* o : filtered innovative code                   */
1186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 sign[],     /* o : sign of 2 pulses                           */
1187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Flag   * pOverflow /* o : Flag set when overflow occurs              */
1188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    )
1189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16  test_index;
1191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*----------------------------------------------------------------------------
1193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         CALL build_code ( subNr = subNr
1194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   codvec = codvec
1195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   dn_sign = dn_sign
1196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   cod = cod
1197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   h = h
1198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   y = y
1199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   sign = sign )
1200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           MODIFYING(nothing)
1201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           RETURNING(indx)
1202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        ----------------------------------------------------------------------------*/
1203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        test_index =
1204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            build_code(
1205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subNr,
1206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                codvec,
1207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                dn_sign,
1208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                cod,
1209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                h,
1210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y,
1211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                sign,
1212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
1213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(test_index);
1215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus
1218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
1220