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