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/d2_9pf.c 35 Functions: decode_2i40_9bits 36 37 Date: 01/28/2002 38 39 ------------------------------------------------------------------------------ 40 REVISION HISTORY 41 42 Description: Modified to place file in the correct template format. Eliminated 43 use of special functions to perform simple mathematical operations, where 44 possible. Added the parameter pOverflow for the basic math operations. 45 46 Description: Per review comments... 47 (1) Removed include of basic_op.h, replaced with shl.h 48 (2) Added pOverflow to the output section of the template 49 50 Description: Replaced "int" and/or "char" with OSCL defined types. 51 52 Description: Added #ifdef __cplusplus around extern'ed table. 53 54 Description: 55 56 ------------------------------------------------------------------------------ 57 MODULE DESCRIPTION 58 59 60 FUNCTION: decode_2i40_9bits (decod_ACELP()) 61 62 PURPOSE: Algebraic codebook decoder. For details about the encoding see 63 c2_9pf.c 64 */ 65 66 /*---------------------------------------------------------------------------- 67 ; INCLUDES 68 ----------------------------------------------------------------------------*/ 69 #include "d2_9pf.h" 70 #include "typedef.h" 71 #include "basic_op.h" 72 #include "cnst.h" 73 74 75 /*--------------------------------------------------------------------------*/ 76 #ifdef __cplusplus 77 extern "C" 78 { 79 #endif 80 81 /*---------------------------------------------------------------------------- 82 ; MACROS 83 ; Define module specific macros here 84 ----------------------------------------------------------------------------*/ 85 86 /*---------------------------------------------------------------------------- 87 ; DEFINES 88 ; Include all pre-processor statements here. Include conditional 89 ; compile variables also. 90 ----------------------------------------------------------------------------*/ 91 #define NB_PULSE 2 92 93 94 /*---------------------------------------------------------------------------- 95 ; LOCAL FUNCTION DEFINITIONS 96 ; Function Prototype declaration 97 ----------------------------------------------------------------------------*/ 98 99 /*---------------------------------------------------------------------------- 100 ; LOCAL VARIABLE DEFINITIONS 101 ; Variable declaration - defined here and used outside this module 102 ----------------------------------------------------------------------------*/ 103 104 extern const Word16 startPos[]; 105 106 /*--------------------------------------------------------------------------*/ 107 #ifdef __cplusplus 108 } 109 #endif 110 111 /* 112 ------------------------------------------------------------------------------ 113 FUNCTION NAME: decode_2i40_11bits 114 ------------------------------------------------------------------------------ 115 INPUT AND OUTPUT DEFINITIONS 116 117 Inputs: 118 sign -- Word16 -- signs of 2 pulses. 119 index -- Word16 -- Positions of the 2 pulses. 120 121 Outputs: 122 cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation 123 pOverflow = pointer to overflow flag 124 125 Returns: 126 None 127 128 Global Variables Used: 129 None 130 131 Local Variables Needed: 132 None 133 134 ------------------------------------------------------------------------------ 135 FUNCTION DESCRIPTION 136 137 138 ------------------------------------------------------------------------------ 139 REQUIREMENTS 140 141 None 142 143 ------------------------------------------------------------------------------ 144 REFERENCES 145 146 d2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 147 148 ------------------------------------------------------------------------------ 149 PSEUDO-CODE 150 151 152 ------------------------------------------------------------------------------ 153 RESOURCES USED [optional] 154 155 When the code is written for a specific target processor the 156 the resources used should be documented below. 157 158 HEAP MEMORY USED: x bytes 159 160 STACK MEMORY USED: x bytes 161 162 CLOCK CYCLES: (cycle count equation for this function) + (variable 163 used to represent cycle count for each subroutine 164 called) 165 where: (cycle count variable) = cycle count for [subroutine 166 name] 167 168 ------------------------------------------------------------------------------ 169 CAUTION [optional] 170 [State any special notes, constraints or cautions for users of this function] 171 172 ------------------------------------------------------------------------------ 173 */ 174 175 void decode_2i40_9bits( 176 Word16 subNr, /* i : subframe number */ 177 Word16 sign, /* i : signs of 2 pulses. */ 178 Word16 index, /* i : Positions of the 2 pulses. */ 179 Word16 cod[], /* o : algebraic (fixed) codebook excitation */ 180 Flag *pOverflow /* o : Flag set when overflow occurs */ 181 ) 182 { 183 Word16 i; 184 Word16 j; 185 Word16 k; 186 187 Word16 pos[NB_PULSE]; 188 189 /* Decode the positions */ 190 /* table bit is the MSB */ 191 192 j = (Word16)(index & 64); 193 194 j >>= 3; 195 196 i = index & 7; 197 198 k = 199 shl( 200 subNr, 201 1, 202 pOverflow); 203 204 k += j; 205 206 /* pos0 =i*5+startPos[j*8+subNr*2] */ 207 pos[0] = i * 5 + startPos[k++]; 208 209 210 index >>= 3; 211 212 i = index & 7; 213 214 /* pos1 =i*5+startPos[j*8+subNr*2 + 1] */ 215 pos[1] = i * 5 + startPos[k]; 216 217 218 /* decode the signs and build the codeword */ 219 220 for (i = L_SUBFR - 1; i >= 0; i--) 221 { 222 cod[i] = 0; 223 } 224 225 for (j = 0; j < NB_PULSE; j++) 226 { 227 i = sign & 0x1; 228 229 /* This line is equivalent to... 230 * 231 * 232 * if (i == 1) 233 * { 234 * cod[pos[j]] = 8191; 235 * } 236 * if (i == 0) 237 * { 238 * cod[pos[j]] = -8192; 239 * } 240 */ 241 242 cod[pos[j]] = i * 16383 - 8192; 243 244 sign >>= 1; 245 } 246 247 return; 248 } 249