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