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/c1035pf.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Functions: q_p
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            build_code
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            code_10i40_35bits
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     Date: 09/28/2000
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Updated template. Cleaned up code. Passing in a pointer to
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              overflow flag for build_code() and code_10i40_35bits() functions.
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              Removed unnecessary header files.
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              1. Eliminated unused include files.
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              2. Replaced array addressing by pointers
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              3. Eliminated math operations that unnecessary checked for
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 saturation
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              4. Replaced for-loops with memset()
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Changed function name to pv_round to avoid conflict with
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              round function in C standard library.
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               files that now are chosen by OSCL definitions
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This file contains the function that searches a 35 bit algebraic codebook
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber containing 10 pulses in a frame of 40 samples.
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <string.h>
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "c1035pf.h"
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h"
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inv_sqrt.h"
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "set_sign.h"
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cor_h.h"
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cor_h_x.h"
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "s10_8pf.h"
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; [Define module specific macros here]
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; [Include all pre-processor statements here. Include conditional
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.]
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#define NB_PULSE  10
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; [List function prototypes here]
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; [Variable declaration - defined here and used outside this module]
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: q_p
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pShift_reg = pointer to Old CN generator shift register state (Word32)
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    no_bits = Number of bits (Word16)
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pShift_reg -> Updated CN generator shift register state
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    noise_bits = Generated random integer value (Word16)
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This is a local function that determnes the index of the pulses by looking up
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the gray encoder table
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber c1035pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid q_p (
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *ind,        // Pulse position
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 n            // Pulse number
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp;
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tmp = *ind;
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (sub (n, 5) < 0)
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *ind = (tmp & 0x8) | gray[tmp & 0x7];
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *ind = gray[tmp & 0x7];
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; FUNCTION CODE
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid q_p(
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *pInd,       /* Pulse position */
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 n            /* Pulse number   */
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp;
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tmp = *pInd;
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (n < 5)
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *pInd = (tmp & 0x8) | gray[tmp & 0x7];
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *pInd = gray[tmp & 0x7];
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: build_code
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pSeed = pointer to the Old CN generator shift register state (Word32)
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    n_param = Number of parameters to randomize (Word16)
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param_size_table = table holding paameter sizes (Word16)
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param[] = array to hold CN generated paramters (Word16)
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = pointer to overflow flag (Flag)
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param[] = CN generated parameters (Word16)
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pSeed = Updated CN generator shift register state (Word16)
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow -> 1 if overflow occured
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function builds the codeword, the filtered codeword and index of the
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber codevector, based on the signs and positions of 10 pulses.
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber c1035pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void build_code (
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 codvec[],    // (i)  : position of pulses
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[],      // (i)  : sign of d[n]
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[],       // (o)  : innovative code vector
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],         // (i)  : impulse response of weighted synthesis filter
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],         // (o)  : filtered innovative code
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[]       // (o)  : index of 10 pulses (sign+position)
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i, j, k, track, index, _sign[NB_PULSE];
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p0, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9;
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_CODE; i++)
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        cod[i] = 0;
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < NB_TRACK; i++)
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        indx[i] = -1;
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (k = 0; k < NB_PULSE; k++)
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // read pulse position
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        i = codvec[k];
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // read sign
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        j = sign[i];
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        index = mult (i, 6554);                  // index = pos/5
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // track = pos%5
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        track = sub (i, extract_l (L_shr (L_mult (index, 5), 1)));
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (j > 0)
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] = add (cod[i], 4096);
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            _sign[k] = 8192;
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] = sub (cod[i], 4096);
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            _sign[k] = -8192;
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            index = add (index, 8);
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (indx[track] < 0)
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            indx[track] = index;
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (((index ^ indx[track]) & 8) == 0)
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                // sign of 1st pulse == sign of 2nd pulse
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if (sub (indx[track], index) <= 0)
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track + 5] = index;
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track + 5] = indx[track];
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track] = index;
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                // sign of 1st pulse != sign of 2nd pulse
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if (sub ((Word16)(indx[track] & 7), (Word16)(index & 7)) <= 0)
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track + 5] = indx[track];
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track] = index;
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    indx[track + 5] = index;
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p0 = h - codvec[0];
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p1 = h - codvec[1];
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p2 = h - codvec[2];
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p3 = h - codvec[3];
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p4 = h - codvec[4];
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p5 = h - codvec[5];
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p6 = h - codvec[6];
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p7 = h - codvec[7];
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p8 = h - codvec[8];
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p9 = h - codvec[9];
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_CODE; i++)
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = 0;
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p0++, _sign[0]);
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p1++, _sign[1]);
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p2++, _sign[2]);
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p3++, _sign[3]);
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p4++, _sign[4]);
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p5++, _sign[5]);
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p6++, _sign[6]);
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p7++, _sign[7]);
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p8++, _sign[8]);
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, *p9++, _sign[9]);
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        y[i] = pv_round (s);
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; FUNCTION CODE
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void build_code(
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 codvec[],    /* (i)  : position of pulses                        */
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[],      /* (i)  : sign of d[n]                              */
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[],       /* (o)  : innovative code vector                    */
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],         /* (i)  : impulse response of weighted synthesis filter*/
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],         /* (o)  : filtered innovative code                  */
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[],      /* (o)  : index of 10 pulses (sign+position)        */
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow   /* i/o  : overflow Flag                             */
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i, k, track, index, _sign[NB_PULSE];
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p0, *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9;
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 temp;
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p__sign;
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_y;
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_codvec;
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    memset(cod, 0, L_CODE*sizeof(*cod));
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    memset(indx, 0xFF, NB_TRACK*sizeof(*indx));
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p__sign = _sign;
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p0 = &codvec[0];
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (k = 0; k < NB_PULSE; k++)
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* read pulse position */
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        i = *(p0++);
430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* read sign           */
431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        index = ((Word32)i * 6554) >> 15;       /* index = pos/5    */
433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* track = pos%5 */
435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* track = sub (i, extract_l (L_shr (L_mult (index, 5), 1))); */
436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        track = i - (index * 5);
437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sign[i] > 0)
439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] +=  4096;
441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p__sign++) = 8192;
442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            cod[i] -=  4096;
447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p__sign++) = -8192;
448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* index = add (index, 8); */
449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            index += 8;
450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p1 = &indx[track];
453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        temp = *p1;
455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (temp < 0)
457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *p1 = index;
459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (((index ^ temp) & 8) == 0)
463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* sign of 1st pulse == sign of 2nd pulse */
465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* if (sub (indx[track], index) <= 0) */
467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if (temp <= index)
468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *(p1 + 5) = index;
470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *(p1 + 5) = temp;
474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *p1 = index;
475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else
478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* sign of 1st pulse != sign of 2nd pulse */
480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* if (sub ((Word16)(indx[track] & 7), (Word16)(index & 7)) <= 0) */
482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                if ((temp & 7) <= (index & 7))
483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *(p1 + 5) = temp;
485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *p1 = index;
486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                else
488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                {
489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *(p1 + 5) = index;
490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                }
491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_codvec = &codvec[0];
496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p0 = h - *(p_codvec++);
498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p1 = h - *(p_codvec++);
499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p2 = h - *(p_codvec++);
500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p3 = h - *(p_codvec++);
501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p4 = h - *(p_codvec++);
502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p5 = h - *(p_codvec++);
503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p6 = h - *(p_codvec++);
504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p7 = h - *(p_codvec++);
505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p8 = h - *(p_codvec++);
506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p9 = h - *(p_codvec++);
507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_y = y;
509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = L_CODE; i != 0; i--)
511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p__sign = _sign;
513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s  = (*p0++ * *(p__sign++)) >> 7;
515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p1++ * *(p__sign++)) >> 7;
516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p2++ * *(p__sign++)) >> 7;
517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p3++ * *(p__sign++)) >> 7;
518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p4++ * *(p__sign++)) >> 7;
519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p5++ * *(p__sign++)) >> 7;
520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p6++ * *(p__sign++)) >> 7;
521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p7++ * *(p__sign++)) >> 7;
522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p8++ * *(p__sign++)) >> 7;
523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (*p9++ * *(p__sign++)) >> 7;
524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_y++) = (s + 0x080) >> 8;
526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: code_10i40_35bits
533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pSeed = pointer to the Old CN generator shift register state (Word32)
538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    n_param = Number of parameters to randomize (Word16)
539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param_size_table = table holding paameter sizes (Word16)
540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param[] = array to hold CN generated paramters (Word16)
541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = pointer to overflow flag (Flag)
542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    param[] = CN generated parameters (Word16)
545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pSeed = Updated CN generator shift register state (Word16)
546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow -> 1 if overflow occured
547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function searches a 35 bit algebraic codebook containing 10 pulses in a
561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frame of 40 samples.
562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The code contains 10 nonzero pulses: i0...i9.
564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber All pulses can have two possible amplitudes: +1 or -1.
565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The 40 positions in a subframe are divided into 5 tracks of
566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber interleaved positions. Each track contains two pulses.
567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The pulses can have the following possible positions:
568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i0, i5 :  0, 5, 10, 15, 20, 25, 30, 35.
570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i1, i6 :  1, 6, 11, 16, 21, 26, 31, 36.
571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i2, i7 :  2, 7, 12, 17, 22, 27, 32, 37.
572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i3, i8 :  3, 8, 13, 18, 23, 28, 33, 38.
573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i4, i9 :  4, 9, 14, 19, 24, 29, 34, 39.
574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Each pair of pulses require 1 bit for their signs and 6 bits for their
576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber positions (3 bits + 3 bits). This results in a 35 bit codebook.
577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The function determines the optimal pulse signs and positions, builds
578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the codevector, and computes the filtered codevector.
579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber c1035pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid code_10i40_35bits (
593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 x[],   // (i)   : target vector
594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cn[],  // (i)   : residual after long term prediction
595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],   // (i)   : impulse response of weighted synthesis filter
596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                           // h[-L_subfr..-1] must be set to zero
597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[], // (o)   : algebraic (fixed) codebook excitation
598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],   // (o)   : filtered fixed codebook excitation
599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[] // (o)   : index of 10 pulses (sign + position)
600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ipos[NB_PULSE], pos_max[NB_TRACK], codvec[NB_PULSE];
603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 dn[L_CODE], sign[L_CODE];
604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rr[L_CODE][L_CODE], i;
605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h_x (h, x, dn, 2);
607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    set_sign12k2 (dn, cn, sign, pos_max, NB_TRACK, ipos, STEP);
608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h (h, sign, rr);
609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    search_10and8i40 (NB_PULSE, STEP, NB_TRACK,
611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      dn, rr, ipos, pos_max, codvec);
612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    build_code (codvec, sign, cod, h, y, indx);
614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < 10; i++)
615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        q_p (&indx[i], i);
617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; FUNCTION CODE
646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid code_10i40_35bits(
648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 x[],     /* (i)   : target vector                                */
649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cn[],    /* (i)   : residual after long term prediction          */
650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],     /* (i)   : impulse response of weighted synthesis filter
651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                             h[-L_subfr..-1] must be set to zero            */
652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 cod[],   /* (o)   : algebraic (fixed) codebook excitation        */
653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y[],     /* (o)   : filtered fixed codebook excitation           */
654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 indx[],  /* (o)   : index of 10 pulses (sign + position)         */
655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag *pOverflow /* (i/o) : overflow Flag                                */
656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 ipos[NB_PULSE], pos_max[NB_TRACK], codvec[NB_PULSE];
659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 dn[L_CODE], sign[L_CODE];
660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rr[L_CODE][L_CODE], i;
661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h_x(h, x, dn, 2, pOverflow);
663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    set_sign12k2(dn, cn, sign, pos_max, NB_TRACK, ipos, STEP, pOverflow);
664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cor_h(h, sign, rr, pOverflow);
665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    search_10and8i40(NB_PULSE, STEP, NB_TRACK,
667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                     dn, rr, ipos, pos_max, codvec, pOverflow);
668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    build_code(codvec, sign, cod, h, y, indx, pOverflow);
670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < 10; i++)
671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        q_p(&indx[i], i);
673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
677