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/d4_17pf.c 35 Functions: decode_4i40_17bits 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. 44 45 Description: An incorrect comment in the original source lead me to implement 46 the calculation of pos[2] incorrectly. The correct formula is pos2 =i*5+2, 47 not pos2 = i*5 + 1. 48 49 Description: Replaced "int" and/or "char" with OSCL defined types. 50 51 Description: Added #ifdef __cplusplus around extern'ed table. 52 53 Description: 54 55 ------------------------------------------------------------------------------ 56 MODULE DESCRIPTION 57 58 59 FUNCTION: decode_4i40_17bits (decod_ACELP()) 60 61 PURPOSE: Algebraic codebook decoder. For details about the encoding see 62 c4_17pf.c 63 */ 64 65 /*---------------------------------------------------------------------------- 66 ; INCLUDES 67 ----------------------------------------------------------------------------*/ 68 #include "typedef.h" 69 #include "basic_op.h" 70 #include "cnst.h" 71 #include "d4_17pf.h" 72 73 /*--------------------------------------------------------------------------*/ 74 #ifdef __cplusplus 75 extern "C" 76 { 77 #endif 78 79 /*---------------------------------------------------------------------------- 80 ; MACROS 81 ; Define module specific macros here 82 ----------------------------------------------------------------------------*/ 83 84 /*---------------------------------------------------------------------------- 85 ; DEFINES 86 ; Include all pre-processor statements here. Include conditional 87 ; compile variables also. 88 ----------------------------------------------------------------------------*/ 89 #define NB_PULSE 4 /* number of pulses */ 90 91 92 /*---------------------------------------------------------------------------- 93 ; LOCAL FUNCTION DEFINITIONS 94 ; Function Prototype declaration 95 ----------------------------------------------------------------------------*/ 96 97 /*---------------------------------------------------------------------------- 98 ; LOCAL VARIABLE DEFINITIONS 99 ; Variable declaration - defined here and used outside this module 100 ----------------------------------------------------------------------------*/ 101 102 /*---------------------------------------------------------------------------- 103 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 104 ; Declare variables used in this module but defined elsewhere 105 ----------------------------------------------------------------------------*/ 106 extern const Word16 dgray[]; 107 108 /*--------------------------------------------------------------------------*/ 109 #ifdef __cplusplus 110 } 111 #endif 112 113 /* 114 ------------------------------------------------------------------------------ 115 FUNCTION NAME: decode_4i40_17bits 116 ------------------------------------------------------------------------------ 117 INPUT AND OUTPUT DEFINITIONS 118 119 Inputs: 120 sign -- Word16 -- signs of 3 pulses. 121 index -- Word16 -- Positions of the 3 pulses. 122 123 Outputs: 124 cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation 125 126 Returns: 127 None 128 129 Global Variables Used: 130 None 131 132 Local Variables Needed: 133 None 134 135 ------------------------------------------------------------------------------ 136 FUNCTION DESCRIPTION 137 138 139 ------------------------------------------------------------------------------ 140 REQUIREMENTS 141 142 None 143 144 ------------------------------------------------------------------------------ 145 REFERENCES 146 147 d4_17pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 148 149 ------------------------------------------------------------------------------ 150 PSEUDO-CODE 151 152 153 ------------------------------------------------------------------------------ 154 RESOURCES USED [optional] 155 156 When the code is written for a specific target processor the 157 the resources used should be documented below. 158 159 HEAP MEMORY USED: x bytes 160 161 STACK MEMORY USED: x bytes 162 163 CLOCK CYCLES: (cycle count equation for this function) + (variable 164 used to represent cycle count for each subroutine 165 called) 166 where: (cycle count variable) = cycle count for [subroutine 167 name] 168 169 ------------------------------------------------------------------------------ 170 CAUTION [optional] 171 [State any special notes, constraints or cautions for users of this function] 172 173 ------------------------------------------------------------------------------ 174 */ 175 176 void decode_4i40_17bits( 177 Word16 sign, /* i : signs of 4 pulses. */ 178 Word16 index, /* i : Positions of the 4 pulses. */ 179 Word16 cod[] /* o : algebraic (fixed) codebook excitation */ 180 ) 181 { 182 Word16 i; 183 Word16 j; 184 185 Word16 pos[NB_PULSE]; 186 187 /* Index is a 13-bit value. 3 bits each correspond to the 188 * positions 0-2, with 4 bits allocated for position 3. 189 * 190 * 191 * [][][][] [][][] [][][] [][][] 192 * | | | | 193 * | | | | 194 * pos3 pos2 pos1 pos0 195 */ 196 197 /* Decode the positions */ 198 199 i = index & 0x7; 200 201 i = dgray[i]; 202 203 pos[0] = i * 5; /* pos0 =i*5 */ 204 205 206 index >>= 3; 207 208 i = index & 0x7; 209 210 i = dgray[i]; 211 212 pos[1] = i * 5 + 1; /* pos1 =i*5+1 */ 213 214 215 216 index >>= 3; 217 218 i = index & 0x7; 219 220 i = dgray[i]; 221 222 pos[2] = i * 5 + 2; /* pos2 =i*5+2 */ 223 224 225 226 227 228 index >>= 3; 229 230 j = index & 0x1; 231 232 index >>= 1; 233 234 i = index & 0x7; 235 236 i = dgray[i]; 237 238 pos[3] = i * 5 + 3 + j; /* pos3 =i*5+3+j */ 239 240 241 /* decode the signs and build the codeword */ 242 243 for (i = 0; i < L_SUBFR; i++) 244 { 245 cod[i] = 0; 246 } 247 248 for (j = 0; j < NB_PULSE; j++) 249 { 250 i = sign & 0x1; 251 252 /* This line is equivalent to... 253 * 254 * 255 * if (i == 1) 256 * { 257 * cod[pos[j]] = 8191; 258 * } 259 * if (i == 0) 260 * { 261 * cod[pos[j]] = -8192; 262 * } 263 */ 264 265 cod[pos[j]] = i * 16383 - 8192; 266 267 sign >>= 1; 268 } 269 270 return; 271 } 272