1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied.
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License.
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -------------------------------------------------------------------
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************************
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard:
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    3GPP TS 26.073
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Available from http://www.3gpp.org
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder.
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pathname: ./audio/gsm-amr/c/src/gain_q.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Functions:
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 02/05/2002
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated template used to PV coding template.
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Changed to accept the pOverflow flag for EPOC compatibility.
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Removed everything associated with gc_pred_init
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber and gc_pred_exit.  gc_pred_exit was simply removed -- gc_pred_init
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber was replaced with calls to gc_pred_reset.  This is because the gc_pred
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber related structures are no longer dynamically allocated via malloc.
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  For gainQuant()
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Replaced gc_pred_copy() with memcpy.
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              2. Eliminated unused include file gc_pred.h.
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               files that now are chosen by OSCL definitions
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Quantazation of gains
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <stdlib.h>
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <string.h>
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "gain_q.h"
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "qua_gain.h"
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "mode.h"
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "g_code.h"
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "q_gain_c.h"
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "calc_en.h"
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "qgain795.h"
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "qgain475.h"
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "set_zero.h"
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Define module specific macros here
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Include all pre-processor statements here. Include conditional
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also.
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#define NPRED 4  /* number of prediction taps */
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Function Prototype declaration
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL VARIABLE DEFINITIONS
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Variable declaration - defined here and used outside this module
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: gainQuant_init
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- double pointer to gainQuantState
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- double ponter to gainQuantState
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    -1 if an error occurs during memory initialization
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     0 if OK
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Allocates state memory and initializes state memory
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_q.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 gainQuant_init(gainQuantState **state)
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gainQuantState* s;
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (state == (gainQuantState **) NULL)
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprintf(stderr, "gainQuant_init: invalid parameter\n"); */
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return -1;
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = NULL;
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* allocate memory */
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((s = (gainQuantState *) malloc(sizeof(gainQuantState))) == NULL)
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprintf(stderr, "gainQuant_init: can not malloc state structure\n"); */
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return -1;
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->gain_idx_ptr = NULL;
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->adaptSt = NULL;
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Init sub states */
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (gc_pred_reset(&s->gc_predSt)
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            || gc_pred_reset(&s->gc_predUnqSt)
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            || gain_adapt_init(&s->adaptSt))
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        gainQuant_exit(&s);
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return -1;
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gainQuant_reset(s);
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = s;
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return 0;
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: gainQuant_reset
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- double pointer to gainQuantState
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- double ponter to gainQuantState
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    -1 if an error occurs
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     0 if OK
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Initializes state memory to zero
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_q.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 gainQuant_reset(gainQuantState *state)
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (state == (gainQuantState *) NULL)
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprintf(stderr, "gainQuant_reset: invalid parameter\n"); */
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return -1;
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state->sf0_exp_gcode0 = 0;
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state->sf0_frac_gcode0 = 0;
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state->sf0_exp_target_en = 0;
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state->sf0_frac_target_en = 0;
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Set_zero(state->sf0_exp_coeff, 5);
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Set_zero(state->sf0_frac_coeff, 5);
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state->gain_idx_ptr = NULL;
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gc_pred_reset(&(state->gc_predSt));
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gc_pred_reset(&(state->gc_predUnqSt));
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gain_adapt_reset(state->adaptSt);
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return 0;
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: gainQuant_exit
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- double pointer to gainQuantState
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The memory used for state memory is freed
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_q.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid gainQuant_exit(gainQuantState **state)
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (state == NULL || *state == NULL)
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gain_adapt_exit(&(*state)->adaptSt);
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* deallocate memory */
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    free(*state);
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = NULL;
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return;
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: gainQuant
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st   -- pointer to gainQuantState
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    mode -- enum Mode -- coder mode
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    res  -- Word16 array -- LP residual,                 Q0
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    exc  -- Word16 array -- LTP excitation (unfiltered), Q0
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    code -- Word16 array -- CB innovation (unfiltered),  Q13
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            (unsharpened for MR475)
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    xn  -- Word16 array -- Target vector.
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    xn2 -- Word16 array -- Target vector.
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    y1  -- Word16 array -- Adaptive codebook.
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Y2  -- Word16 array -- Filtered innovative vector.
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    g_coeff -- Word16 array -- Correlations <xn y1> <y1 y1>
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                               Compute in G_pitch().
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    even_subframe -- Word16 -- even subframe indicator flag
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gp_limit -- Word16 -- pitch gain limit
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gain_pit -- Word16 Pointer -- Pitch gain.
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st -- pointer to gainQuantState
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sf0_gain_pit -- Word16 Pointer -- Pitch gain sf 0.   MR475
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sf0_gain_cod -- Word16 Pointer -- Code gain sf 0.    MR475
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gain_pit -- Word16 Pointer -- Pitch gain.
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gain_cod -- Word16 Pointer -- Code gain.
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                  MR475: gain_* unquantized in even
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                  subframes, quantized otherwise
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    anap -- Word16 Double Pointer -- Index of quantization
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pOverflow -- Flag Pointer -- overflow indicator
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Zero
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Quantazation of gains
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber gain_q.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid gainQuant(
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gainQuantState *st,   /* i/o : State struct                      */
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode mode,       /* i   : coder mode                        */
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 res[],         /* i   : LP residual,                 Q0   */
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 exc[],         /* i   : LTP excitation (unfiltered), Q0   */
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code[],        /* i   : CB innovation (unfiltered),  Q13  */
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*       (unsharpened for MR475)           */
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 xn[],          /* i   : Target vector.                    */
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 xn2[],         /* i   : Target vector.                    */
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y1[],          /* i   : Adaptive codebook.                */
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 Y2[],          /* i   : Filtered innovative vector.       */
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 g_coeff[],     /* i   : Correlations <xn y1> <y1 y1>      */
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*       Compute in G_pitch().             */
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 even_subframe, /* i   : even subframe indicator flag      */
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gp_limit,      /* i   : pitch gain limit                  */
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *sf0_gain_pit, /* o   : Pitch gain sf 0.   MR475          */
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *sf0_gain_cod, /* o   : Code gain sf 0.    MR475          */
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *gain_pit,     /* i/o : Pitch gain.                       */
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *gain_cod,     /* o   : Code gain.                        */
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*       MR475: gain_* unquantized in even */
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*       subframes, quantized otherwise    */
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 **anap,        /* o   : Index of quantization             */
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Flag   *pOverflow     /* o   : overflow indicator                */
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 exp_gcode0;
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 frac_gcode0;
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 qua_ener_MR122;
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 qua_ener;
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 frac_coeff[5];
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 exp_coeff[5];
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 exp_en;
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 frac_en;
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 cod_gain_exp;
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 cod_gain_frac;
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 temp;
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (mode == MR475)
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (even_subframe != 0)
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* save position in output parameter stream and current
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               state of codebook gain predictor */
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->gain_idx_ptr = (*anap)++;
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber//            gc_pred_copy(&(st->gc_predSt), &(st->gc_predUnqSt));
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            memcpy(st->gc_predUnqSt.past_qua_en,
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        st->gc_predSt.past_qua_en,
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        NPRED*sizeof(Word16));
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            memcpy(st->gc_predUnqSt.past_qua_en_MR122,
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        st->gc_predSt.past_qua_en_MR122,
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        NPRED*sizeof(Word16));
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* predict codebook gain (using "unquantized" predictor)*/
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* (note that code[] is unsharpened in MR475)           */
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            gc_pred(
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &(st->gc_predUnqSt),
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode,
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                code,
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &st->sf0_exp_gcode0,
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &st->sf0_frac_gcode0,
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &exp_en,
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &frac_en,
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* calculate energy coefficients for quantization
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               and store them in state structure (will be used
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               in next subframe when real quantizer is run) */
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            calc_filt_energies(
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode,
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn,
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn2,
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y1,
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Y2,
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                g_coeff,
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->sf0_frac_coeff,
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->sf0_exp_coeff,
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_frac,
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_exp,
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* store optimum codebook gain (Q1) */
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            temp =
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                add(
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    cod_gain_exp,
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    1,
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *gain_cod =
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                shl(
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    cod_gain_frac,
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    temp,
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            calc_target_energy(
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn,
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &st->sf0_exp_target_en,
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &st->sf0_frac_target_en,
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* calculate optimum codebook gain and update
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               "unquantized" predictor                    */
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            MR475_update_unq_pred(
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &(st->gc_predUnqSt),
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->sf0_exp_gcode0,
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->sf0_frac_gcode0,
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                cod_gain_exp,
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                cod_gain_frac,
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* the real quantizer is not run here... */
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* predict codebook gain (using "unquantized" predictor) */
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* (note that code[] is unsharpened in MR475)            */
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            gc_pred(
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &(st->gc_predUnqSt),
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode,
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                code,
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &exp_gcode0,
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &frac_gcode0,
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &exp_en,
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &frac_en,
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* calculate energy coefficients for quantization */
596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            calc_filt_energies(
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode,
598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn,
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn2,
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y1,
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Y2,
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                g_coeff,
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                frac_coeff,
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                exp_coeff,
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_frac,
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_exp,
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            calc_target_energy(
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn,
611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &exp_en,
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &frac_en,
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* run real (4-dim) quantizer and update real gain predictor */
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *st->gain_idx_ptr =
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                MR475_gain_quant(
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    &(st->gc_predSt),
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_exp_gcode0,
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_frac_gcode0,
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_exp_coeff,
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_frac_coeff,
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_exp_target_en,
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->sf0_frac_target_en,
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    code,
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_gcode0,
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_gcode0,
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_coeff,
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_coeff,
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_en,
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_en,
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gp_limit,
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    sf0_gain_pit,
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    sf0_gain_cod,
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gain_pit,
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gain_cod,
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-------------------------------------------------------------------*
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *  predict codebook gain and quantize                               *
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *  (also compute normalized CB innovation energy for MR795)         *
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *-------------------------------------------------------------------*/
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        gc_pred(
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &(st->gc_predSt),
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            mode,
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            code,
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &exp_gcode0,
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &frac_gcode0,
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &exp_en,
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &frac_en,
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            pOverflow);
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (mode == MR122)
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *gain_cod =
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                G_code(
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    xn2,
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    Y2,
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(*anap)++ =
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                q_gain_code(
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    mode,
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_gcode0,
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_gcode0,
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gain_cod,
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    &qua_ener_MR122,
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    &qua_ener,
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* calculate energy coefficients for quantization */
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            calc_filt_energies(
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode,
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn,
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn2,
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y1,
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Y2,
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                g_coeff,
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                frac_coeff,
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                exp_coeff,
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_frac,
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &cod_gain_exp,
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                pOverflow);
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (mode == MR795)
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                MR795_gain_quant(
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    st->adaptSt,
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    res,
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exc,
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    code,
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_coeff,
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_coeff,
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_en,
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_en,
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    exp_gcode0,
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    frac_gcode0,
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    L_SUBFR,
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    cod_gain_frac,
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    cod_gain_exp,
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gp_limit,
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gain_pit,
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    gain_cod,
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    &qua_ener_MR122,
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    &qua_ener,
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    anap,
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    pOverflow);
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *(*anap)++ =
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    Qua_gain(
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        mode,
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        exp_gcode0,
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        frac_gcode0,
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        frac_coeff,
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        exp_coeff,
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        gp_limit,
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        gain_pit,
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        gain_cod,
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        &qua_ener_MR122,
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        &qua_ener,
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*------------------------------------------------------------------*
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *  update table of past quantized energies                         *
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                         *
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *  st->past_qua_en(Q10) = 20 * Log10(qua_gain_code) / constant     *
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *                       = Log2(qua_gain_code)                      *
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *                       = qua_ener                                 *
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *                                           constant = 20*Log10(2) *
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *------------------------------------------------------------------*/
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        gc_pred_update(
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            &(st->gc_predSt),
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            qua_ener_MR122,
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            qua_ener);
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return;
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
748