dec_gain.cpp revision 4f1efc098cb5791c3e9f483f2af84aef70d2d0a0
1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/****************************************************************************************
19Portions of this file are derived from the following 3GPP standard:
20
21    3GPP TS 26.073
22    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23    Available from http://www.3gpp.org
24
25(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26Permission to distribute, modify and use this file under the standard license
27terms listed above has been obtained from the copyright holder.
28****************************************************************************************/
29/*
30------------------------------------------------------------------------------
31
32
33
34 Pathname: ./audio/gsm-amr/c/src/dec_gain.c
35 Funtions: dec_gain
36
37     Date: 01/31/2002
38
39------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description: Updating include file lists, and other things as per review
43              comments.
44
45 Description: Added fixes to the code as per review comments. Removed nested
46              function calls and declared temp2 as a variable.
47
48 Description: A Word32 was being stored improperly in a Word16.
49
50 Description: Removed qua_gain.tab and qgain475.tab from Include section and
51              added qua_gain_tbl.h and qgain475_tab.h to Include section.
52
53 Description: Changed round function name to pv_round to avoid conflict with
54              round function in C standard library.
55
56 Description:  Added casting to eliminate warnings
57
58 Description:  Replaced "int" and/or "char" with OSCL defined types.
59
60 Description:
61
62------------------------------------------------------------------------------
63*/
64
65
66/*----------------------------------------------------------------------------
67; INCLUDES
68----------------------------------------------------------------------------*/
69
70#include "dec_gain.h"
71#include "typedef.h"
72#include "mode.h"
73#include "cnst.h"
74#include "pow2.h"
75#include "log2.h"
76#include "gc_pred.h"
77#include "basic_op.h"
78#include "qua_gain_tbl.h"
79#include "qgain475_tab.h"
80
81/*----------------------------------------------------------------------------
82; MACROS
83; Define module specific macros here
84----------------------------------------------------------------------------*/
85
86
87/*----------------------------------------------------------------------------
88; DEFINES
89; Include all pre-processor statements here. Include conditional
90; compile variables also.
91----------------------------------------------------------------------------*/
92
93/*----------------------------------------------------------------------------
94; LOCAL FUNCTION DEFINITIONS
95; Function Prototype declaration
96----------------------------------------------------------------------------*/
97
98/*----------------------------------------------------------------------------
99; LOCAL VARIABLE DEFINITIONS
100; Variable declaration - defined here and used outside this module
101----------------------------------------------------------------------------*/
102
103/*
104------------------------------------------------------------------------------
105 FUNCTION NAME: dec_gain
106------------------------------------------------------------------------------
107 INPUT AND OUTPUT DEFINITIONS
108
109 Inputs:
110    pred_state = pointer to MA predictor state of type gc_predState
111    index = AMR mode of type enum Mode
112    code[] = pointer to innovative vector of type Word16
113    evenSubfr = Flag for even subframes of type Word16
114    pOverflow = pointer to overflow flag
115
116
117 Outputs:
118    pred_state = pointer to MA predictor state of type gc_predState
119    gain_pit = pointer to pitch gain of type Word16
120    gain_cod = pointer to code gain of type Word16
121
122 Returns:
123    None.
124
125 Global Variables Used:
126    None.
127
128 Local Variables Needed:
129    None.
130
131------------------------------------------------------------------------------
132 FUNCTION DESCRIPTION
133
134      File             : dec_gain.c
135      Purpose          : Decode the pitch and codebook gains
136
137------------------------------------------------------------------------------
138 REQUIREMENTS
139
140 None.
141
142------------------------------------------------------------------------------
143 REFERENCES
144
145 agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
146
147------------------------------------------------------------------------------
148 PSEUDO-CODE
149
150
151
152
153
154
155
156
157------------------------------------------------------------------------------
158 RESOURCES USED [optional]
159
160 When the code is written for a specific target processor the
161 the resources used should be documented below.
162
163 HEAP MEMORY USED: x bytes
164
165 STACK MEMORY USED: x bytes
166
167 CLOCK CYCLES: (cycle count equation for this function) + (variable
168                used to represent cycle count for each subroutine
169                called)
170     where: (cycle count variable) = cycle count for [subroutine
171                                     name]
172
173------------------------------------------------------------------------------
174 CAUTION [optional]
175 [State any special notes, constraints or cautions for users of this function]
176
177------------------------------------------------------------------------------
178*/
179
180
181void Dec_gain(
182    gc_predState *pred_state, /* i/o: MA predictor state           */
183    enum Mode mode,           /* i  : AMR mode                     */
184    Word16 index,             /* i  : index of quantization.       */
185    Word16 code[],            /* i  : Innovative vector.           */
186    Word16 evenSubfr,         /* i  : Flag for even subframes      */
187    Word16 * gain_pit,        /* o  : Pitch gain.                  */
188    Word16 * gain_cod,        /* o  : Code gain.                   */
189    Flag   * pOverflow
190)
191{
192    const Word16 *p;
193    Word16 frac;
194    Word16 gcode0;
195    Word16 exp;
196    Word16 qua_ener;
197    Word16 qua_ener_MR122;
198    Word16 g_code;
199    Word32 L_tmp;
200    Word16 temp1;
201    Word16 temp2;
202
203    /* Read the quantized gains (table depends on mode) */
204    index = shl(index, 2, pOverflow);
205
206    if (mode == MR102 || mode == MR74 || mode == MR67)
207    {
208        p = &table_gain_highrates[index];
209
210        *gain_pit = *p++;
211        g_code = *p++;
212        qua_ener_MR122 = *p++;
213        qua_ener = *p;
214    }
215    else
216    {
217        if (mode == MR475)
218        {
219            index += (1 ^ evenSubfr) << 1; /* evenSubfr is 0 or 1 */
220
221            if (index > (MR475_VQ_SIZE*4 - 2))
222            {
223                index = (MR475_VQ_SIZE * 4 - 2); /* avoid possible buffer overflow */
224            }
225
226            p = &table_gain_MR475[index];
227
228            *gain_pit = *p++;
229            g_code = *p++;
230
231            /*---------------------------------------------------------*
232             *  calculate predictor update values (not stored in 4.75  *
233             *  quantizer table to save space):                        *
234             *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
235             *                                                         *
236             *   qua_ener       = log2(g)                              *
237             *   qua_ener_MR122 = 20*log10(g)                          *
238             *---------------------------------------------------------*/
239
240            /* Log2(x Q12) = log2(x) + 12 */
241            temp1 = (Word16) L_deposit_l(g_code);
242            Log2(temp1, &exp, &frac, pOverflow);
243            exp = sub(exp, 12, pOverflow);
244
245            temp1 = shr_r(frac, 5, pOverflow);
246            temp2 = shl(exp, 10, pOverflow);
247            qua_ener_MR122 = add(temp1, temp2, pOverflow);
248
249            /* 24660 Q12 ~= 6.0206 = 20*log10(2) */
250            L_tmp = Mpy_32_16(exp, frac, 24660, pOverflow);
251            L_tmp = L_shl(L_tmp, 13, pOverflow);
252            qua_ener = pv_round(L_tmp, pOverflow);
253            /* Q12 * Q0 = Q13 -> Q10 */
254        }
255        else
256        {
257            p = &table_gain_lowrates[index];
258
259            *gain_pit = *p++;
260            g_code = *p++;
261            qua_ener_MR122 = *p++;
262            qua_ener = *p;
263        }
264    }
265
266    /*-------------------------------------------------------------------*
267     *  predict codebook gain                                            *
268     *  ~~~~~~~~~~~~~~~~~~~~~                                            *
269     *  gc0     = Pow2(int(d)+frac(d))                                   *
270     *          = 2^exp + 2^frac                                         *
271     *                                                                   *
272     *  gcode0 (Q14) = 2^14*2^frac = gc0 * 2^(14-exp)                    *
273     *-------------------------------------------------------------------*/
274
275    gc_pred(pred_state, mode, code, &exp, &frac, NULL, NULL, pOverflow);
276
277    gcode0 = (Word16) Pow2(14, frac, pOverflow);
278
279    /*------------------------------------------------------------------*
280     *  read quantized gains, update table of past quantized energies   *
281     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   *
282     *  st->past_qua_en(Q10) = 20 * Log10(g_fac) / constant             *
283     *                       = Log2(g_fac)                              *
284     *                       = qua_ener                                 *
285     *                                           constant = 20*Log10(2) *
286     *------------------------------------------------------------------*/
287
288    L_tmp = L_mult(g_code, gcode0, pOverflow);
289    temp1 = sub(10, exp, pOverflow);
290    L_tmp = L_shr(L_tmp, temp1, pOverflow);
291    *gain_cod = extract_h(L_tmp);
292
293    /* update table of past quantized energies */
294
295    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
296
297    return;
298}
299
300
301
302
303
304
305
306