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/d_gain_c.c 35 Functions: d_gain_c 36 37 Date: 01/29/2002 38 39 ------------------------------------------------------------------------------ 40 REVISION HISTORY 41 42 Description: Updated include files and intput/output section. Changed .tab 43 files to .c files. 44 45 Description: Replaced OSCL mem type functions and eliminated include 46 files that now are chosen by OSCL definitions 47 48 Description: Replaced "int" and/or "char" with OSCL defined types. 49 50 Description: Added #ifdef __cplusplus around extern'ed table. 51 52 Description: 53 54 ------------------------------------------------------------------------------ 55 INPUT AND OUTPUT DEFINITIONS 56 57 Inputs: 58 pred_state = pointer to sturcture type gc_predState. MA predictor state 59 mode = AMR mode (MR795 or MR122) of type enum Mode 60 index = received quantization index of type Word16 61 code[] = pointer to innovation codevector of type Word16 62 pOverflow= pointer to value indicating existence of overflow (Flag) 63 64 Outputs: 65 pred_state = pointer to sturcture type gc_predState. MA predictor state 66 gain_code = pointer to decoded innovation gain of type Word16 67 pOverflow = 1 if there is an overflow else it is zero. 68 69 Returns: 70 None. 71 72 Global Variables Used: 73 None 74 75 Local Variables Needed: 76 None 77 78 ------------------------------------------------------------------------------ 79 FUNCTION DESCRIPTION 80 81 Function : d_gain_code 82 Purpose : Decode the fixed codebook gain using the received index. 83 84 ------------------------------------------------------------------------------ 85 REQUIREMENTS 86 87 88 89 ------------------------------------------------------------------------------ 90 REFERENCES 91 92 d_gain_c.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 93 94 ------------------------------------------------------------------------------ 95 PSEUDO-CODE 96 97 98 99 ------------------------------------------------------------------------------ 100 RESOURCES USED 101 When the code is written for a specific target processor the 102 the resources used should be documented below. 103 104 STACK USAGE: [stack count for this module] + [variable to represent 105 stack usage for each subroutine called] 106 107 where: [stack usage variable] = stack usage for [subroutine 108 name] (see [filename].ext) 109 110 DATA MEMORY USED: x words 111 112 PROGRAM MEMORY USED: x words 113 114 CLOCK CYCLES: [cycle count equation for this module] + [variable 115 used to represent cycle count for each subroutine 116 called] 117 118 where: [cycle count variable] = cycle count for [subroutine 119 name] (see [filename].ext) 120 121 ------------------------------------------------------------------------------ 122 */ 123 124 125 /*---------------------------------------------------------------------------- 126 ; INCLUDES 127 ----------------------------------------------------------------------------*/ 128 #include "d_gain_c.h" 129 #include "typedef.h" 130 #include "mode.h" 131 132 #include "oper_32b.h" 133 #include "cnst.h" 134 #include "log2.h" 135 #include "pow2.h" 136 #include "gc_pred.h" 137 138 #include "basic_op.h" 139 140 /*--------------------------------------------------------------------------*/ 141 #ifdef __cplusplus 142 extern "C" 143 { 144 #endif 145 146 /*---------------------------------------------------------------------------- 147 ; MACROS 148 ; Define module specific macros here 149 ----------------------------------------------------------------------------*/ 150 151 152 /*---------------------------------------------------------------------------- 153 ; DEFINES 154 ; Include all pre-processor statements here. Include conditional 155 ; compile variables also. 156 ----------------------------------------------------------------------------*/ 157 158 /*---------------------------------------------------------------------------- 159 ; LOCAL FUNCTION DEFINITIONS 160 ; Function Prototype declaration 161 ----------------------------------------------------------------------------*/ 162 163 164 /*---------------------------------------------------------------------------- 165 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 166 ; Variable declaration - defined here and used outside this module 167 ----------------------------------------------------------------------------*/ 168 169 170 /*---------------------------------------------------------------------------- 171 ; EXTERNAL FUNCTION REFERENCES 172 ; Declare functions defined elsewhere and referenced in this module 173 ----------------------------------------------------------------------------*/ 174 175 /*---------------------------------------------------------------------------- 176 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 177 ; Declare variables used in this module but defined elsewhere 178 ----------------------------------------------------------------------------*/ 179 extern const Word16 qua_gain_code[]; 180 181 182 /*--------------------------------------------------------------------------*/ 183 #ifdef __cplusplus 184 } 185 #endif 186 187 /*---------------------------------------------------------------------------- 188 ; FUNCTION CODE 189 ----------------------------------------------------------------------------*/ 190 void d_gain_code( 191 gc_predState *pred_state, /* i/o : MA predictor state */ 192 enum Mode mode, /* i : AMR mode (MR795 or MR122) */ 193 Word16 index, /* i : received quantization index */ 194 Word16 code[], /* i : innovation codevector */ 195 Word16 *gain_code, /* o : decoded innovation gain */ 196 Flag *pOverflow 197 ) 198 { 199 Word16 gcode0, exp, frac; 200 const Word16 *p; 201 Word16 qua_ener_MR122, qua_ener; 202 Word16 exp_inn_en; 203 Word16 frac_inn_en; 204 Word32 L_tmp; 205 Word16 tbl_tmp; 206 Word16 temp; 207 /*-------------- Decode codebook gain ---------------*/ 208 209 /*-------------------------------------------------------------------* 210 * predict codebook gain * 211 * ~~~~~~~~~~~~~~~~~~~~~ * 212 * gc0 = Pow2(int(d)+frac(d)) * 213 * = 2^exp + 2^frac * 214 * * 215 *-------------------------------------------------------------------*/ 216 217 gc_pred(pred_state, mode, code, &exp, &frac, 218 &exp_inn_en, &frac_inn_en, pOverflow); 219 220 index &= 31; /* index < 32, to avoid buffer overflow */ 221 tbl_tmp = index + (index << 1); 222 223 p = &qua_gain_code[tbl_tmp]; 224 225 /* Different scalings between MR122 and the other modes */ 226 temp = sub((Word16)mode, (Word16)MR122, pOverflow); 227 if (temp == 0) 228 { 229 gcode0 = (Word16)(Pow2(exp, frac, pOverflow)); /* predicted gain */ 230 gcode0 = shl(gcode0, 4, pOverflow); 231 *gain_code = shl(mult(gcode0, *p++, pOverflow), 1, pOverflow); 232 } 233 else 234 { 235 gcode0 = (Word16)(Pow2(14, frac, pOverflow)); 236 L_tmp = L_mult(*p++, gcode0, pOverflow); 237 L_tmp = L_shr(L_tmp, sub(9, exp, pOverflow), pOverflow); 238 *gain_code = extract_h(L_tmp); /* Q1 */ 239 } 240 241 /*-------------------------------------------------------------------* 242 * update table of past quantized energies * 243 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 244 *-------------------------------------------------------------------*/ 245 qua_ener_MR122 = *p++; 246 qua_ener = *p++; 247 gc_pred_update(pred_state, qua_ener_MR122, qua_ener); 248 249 return; 250 } 251 252 253 254 255