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 /**************************************************************************************** 19 Portions 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) 26 Permission to distribute, modify and use this file under the standard license 27 terms 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 181 void 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