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_lag3.c 35 Functions: Dec_lag3 36 37 Date: 01/31/2002 38 39 ------------------------------------------------------------------------------ 40 REVISION HISTORY 41 42 Description: 43 (1) Updated to accept new parameter, Flag *pOverflow. 44 (2) Placed file in the proper PV Software template. 45 46 Description: 47 (1) Removed "count.h" and "basic_op.h" and replaced with individual include 48 files (add.h, sub.h, etc.) 49 50 Description: 51 (1) Removed optimization -- mult(i, 3, pOverflow) is NOT the same as adding 52 i to itself 3 times. The reason is because the mult function does a 53 right shift by 15, which will obliterate smaller numbers. 54 55 Description: Replaced "int" and/or "char" with OSCL defined types. 56 57 Description: 58 59 ------------------------------------------------------------------------------ 60 INPUT AND OUTPUT DEFINITIONS 61 62 Inputs: 63 index -- Word16 -- received pitch index 64 t0_min -- Word16 -- minimum of search range 65 t0_max -- Word16 -- maximum of search range 66 i_subfr -- Word16 -- subframe flag 67 T0_prev -- Word16 -- integer pitch delay of last subframe 68 used in 2nd and 4th subframes 69 flag4 -- Word16 -- flag for encoding with 4 bits 70 71 Outputs: 72 73 T0 -- Pointer to type Word16 -- integer part of pitch lag 74 T0_frac -- Pointer to type Word16 -- fractional part of pitch lag 75 pOverflow -- Pointer to type Flag -- Flag set when overflow occurs 76 77 Returns: 78 None. 79 80 Global Variables Used: 81 None 82 83 Local Variables Needed: 84 None 85 86 87 ) 88 ------------------------------------------------------------------------------ 89 FUNCTION DESCRIPTION 90 91 PURPOSE: Decoding of fractional pitch lag with 1/3 resolution. 92 Extract the integer and fraction parts of the pitch lag from 93 the received adaptive codebook index. 94 95 See "Enc_lag3.c" for more details about the encoding procedure. 96 97 The fractional lag in 1st and 3rd subframes is encoded with 8 bits 98 while that in 2nd and 4th subframes is relatively encoded with 4, 5 99 and 6 bits depending on the mode. 100 101 ------------------------------------------------------------------------------ 102 REQUIREMENTS 103 104 105 106 ------------------------------------------------------------------------------ 107 REFERENCES 108 109 dec_lag3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 110 111 ------------------------------------------------------------------------------ 112 PSEUDO-CODE 113 114 115 116 ------------------------------------------------------------------------------ 117 RESOURCES USED 118 When the code is written for a specific target processor the 119 the resources used should be documented below. 120 121 STACK USAGE: [stack count for this module] + [variable to represent 122 stack usage for each subroutine called] 123 124 where: [stack usage variable] = stack usage for [subroutine 125 name] (see [filename].ext) 126 127 DATA MEMORY USED: x words 128 129 PROGRAM MEMORY USED: x words 130 131 CLOCK CYCLES: [cycle count equation for this module] + [variable 132 used to represent cycle count for each subroutine 133 called] 134 135 where: [cycle count variable] = cycle count for [subroutine 136 name] (see [filename].ext) 137 138 ------------------------------------------------------------------------------ 139 */ 140 141 142 /*---------------------------------------------------------------------------- 143 ; INCLUDES 144 ----------------------------------------------------------------------------*/ 145 #include "dec_lag3.h" 146 #include "typedef.h" 147 #include "basic_op.h" 148 149 /*---------------------------------------------------------------------------- 150 ; MACROS 151 ; Define module specific macros here 152 ----------------------------------------------------------------------------*/ 153 154 155 /*---------------------------------------------------------------------------- 156 ; DEFINES 157 ; Include all pre-processor statements here. Include conditional 158 ; compile variables also. 159 ----------------------------------------------------------------------------*/ 160 161 /*---------------------------------------------------------------------------- 162 ; LOCAL FUNCTION DEFINITIONS 163 ; Function Prototype declaration 164 ----------------------------------------------------------------------------*/ 165 166 167 /*---------------------------------------------------------------------------- 168 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 169 ; Variable declaration - defined here and used outside this module 170 ----------------------------------------------------------------------------*/ 171 172 /*---------------------------------------------------------------------------- 173 ; EXTERNAL FUNCTION REFERENCES 174 ; Declare functions defined elsewhere and referenced in this module 175 ----------------------------------------------------------------------------*/ 176 177 /*---------------------------------------------------------------------------- 178 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 179 ; Declare variables used in this module but defined elsewhere 180 ----------------------------------------------------------------------------*/ 181 182 /*---------------------------------------------------------------------------- 183 ; FUNCTION CODE 184 ----------------------------------------------------------------------------*/ 185 186 void Dec_lag3(Word16 index, /* i : received pitch index */ 187 Word16 t0_min, /* i : minimum of search range */ 188 Word16 t0_max, /* i : maximum of search range */ 189 Word16 i_subfr, /* i : subframe flag */ 190 Word16 T0_prev, /* i : integer pitch delay of last subframe 191 used in 2nd and 4th subframes */ 192 Word16 * T0, /* o : integer part of pitch lag */ 193 Word16 * T0_frac, /* o : fractional part of pitch lag */ 194 Word16 flag4, /* i : flag for encoding with 4 bits */ 195 Flag *pOverflow /* o : Flag set when overflow occurs */ 196 ) 197 { 198 Word16 i; 199 Word16 tmp_lag; 200 201 if (i_subfr == 0) /* if 1st or 3rd subframe */ 202 { 203 204 if (index < 197) 205 { 206 207 tmp_lag = index + 2; 208 209 tmp_lag = 210 mult( 211 tmp_lag, 212 10923, 213 pOverflow); 214 215 i = 216 add( 217 tmp_lag, 218 19, 219 pOverflow); 220 221 *T0 = i; 222 223 /* i = 3 * (*T0) */ 224 225 i = add(i, i, pOverflow); 226 i = add(i, *T0, pOverflow); 227 228 tmp_lag = 229 sub( 230 index, 231 i, 232 pOverflow); 233 234 *T0_frac = 235 add( 236 tmp_lag, 237 58, 238 pOverflow); 239 } 240 else 241 { 242 *T0 = index - 112; 243 244 *T0_frac = 0; 245 } 246 247 } 248 else 249 { /* 2nd or 4th subframe */ 250 251 if (flag4 == 0) 252 { 253 254 /* 'normal' decoding: either with 5 or 6 bit resolution */ 255 256 i = 257 add( 258 index, 259 2, 260 pOverflow); 261 262 i = 263 mult( 264 i, 265 10923, 266 pOverflow); 267 268 i = 269 sub( 270 i, 271 1, 272 pOverflow); 273 274 *T0 = 275 add( 276 i, 277 t0_min, 278 pOverflow); 279 280 /* i = 3* (*T0) */ 281 i = add(add(i, i, pOverflow), i, pOverflow); 282 283 tmp_lag = 284 sub( 285 index, 286 2, 287 pOverflow); 288 289 *T0_frac = 290 sub( 291 tmp_lag, 292 i, 293 pOverflow); 294 } 295 else 296 { 297 298 /* decoding with 4 bit resolution */ 299 300 tmp_lag = T0_prev; 301 302 i = 303 sub( 304 tmp_lag, 305 t0_min, 306 pOverflow); 307 308 if (i > 5) 309 { 310 tmp_lag = 311 add( 312 t0_min, 313 5, 314 pOverflow); 315 } 316 317 i = 318 sub( 319 t0_max, 320 tmp_lag, 321 pOverflow); 322 323 if (i > 4) 324 { 325 tmp_lag = 326 sub( 327 t0_max, 328 4, 329 pOverflow); 330 } 331 332 if (index < 4) 333 { 334 i = 335 sub( 336 tmp_lag, 337 5, 338 pOverflow); 339 340 *T0 = 341 add( 342 i, 343 index, 344 pOverflow); 345 346 *T0_frac = 0; 347 } 348 else 349 { 350 /* 4 >= index < 12 */ 351 if (index < 12) 352 { 353 i = index - 5; 354 355 i = mult( 356 i, 357 10923, 358 pOverflow); 359 360 i--; 361 362 *T0 = add( 363 i, 364 tmp_lag, 365 pOverflow); 366 367 i = add( 368 add( 369 i, 370 i, 371 pOverflow), 372 i, 373 pOverflow); 374 375 tmp_lag = index - 9; 376 377 *T0_frac = 378 sub( 379 tmp_lag, 380 i, 381 pOverflow); 382 } 383 else 384 { 385 i = index - 12; 386 387 i = 388 add( 389 i, 390 tmp_lag, 391 pOverflow); 392 393 *T0 = 394 add( 395 i, 396 1, 397 pOverflow); 398 399 *T0_frac = 0; 400 } 401 } 402 403 } /* end if (decoding with 4 bit resolution) */ 404 } 405 406 return; 407 } 408