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/d8_31pf.c 35 Functions: 36 37 38 Date: 01/28/2002 39 40 ------------------------------------------------------------------------------ 41 REVISION HISTORY 42 43 Description: Modified to pass overflow flag through to basic math function. 44 The flag is passed back to the calling function by pointer reference. 45 46 Description: Per review comments... 47 (1) Removed include of "count.h" and "basic_op.h" 48 (2) Added includes of mult.h, shl.h, shr.h, add.h, sub.h, negate.h, 49 L_mult.h, and L_shr.h 50 51 Description: Replaced "int" and/or "char" with OSCL defined types. 52 53 Description: 54 55 ------------------------------------------------------------------------------ 56 MODULE DESCRIPTION 57 */ 58 59 /*---------------------------------------------------------------------------- 60 ; INCLUDES 61 ----------------------------------------------------------------------------*/ 62 #include "d8_31pf.h" 63 #include "typedef.h" 64 #include "basic_op.h" 65 #include "cnst.h" 66 67 68 /*---------------------------------------------------------------------------- 69 ; MACROS 70 ; Define module specific macros here 71 ----------------------------------------------------------------------------*/ 72 73 /*---------------------------------------------------------------------------- 74 ; DEFINES 75 ; Include all pre-processor statements here. Include conditional 76 ; compile variables also. 77 ----------------------------------------------------------------------------*/ 78 #define NB_PULSE 8 /* number of pulses */ 79 80 /* define values/representation for output codevector and sign */ 81 #define POS_CODE 8191 82 #define NEG_CODE 8191 83 84 85 /*---------------------------------------------------------------------------- 86 ; LOCAL FUNCTION DEFINITIONS 87 ; Function Prototype declaration 88 ----------------------------------------------------------------------------*/ 89 90 /*---------------------------------------------------------------------------- 91 ; LOCAL VARIABLE DEFINITIONS 92 ; Variable declaration - defined here and used outside this module 93 ----------------------------------------------------------------------------*/ 94 95 /* 96 ------------------------------------------------------------------------------ 97 FUNCTION NAME: decompress10 98 ------------------------------------------------------------------------------ 99 INPUT AND OUTPUT DEFINITIONS 100 101 Inputs: 102 MSBs -- Word16 -- MSB part of the index 103 LSBs -- Word16 -- LSB part of the index 104 index1 -- Word16 -- index for first pos in pos_index[] 105 index2 -- Word16 -- index for second pos in pos_index[] 106 index3 -- Word16 -- index for third pos in pos_index[] 107 108 Outputs: 109 pos_indx[] -- array of type Word16 -- position of 3 pulses (decompressed) 110 111 pOverflow Flag set when overflow occurs, pointer of type Flag * 112 113 Returns: 114 None 115 116 Global Variables Used: 117 None 118 119 Local Variables Needed: 120 None 121 122 ------------------------------------------------------------------------------ 123 FUNCTION DESCRIPTION 124 125 126 ------------------------------------------------------------------------------ 127 REQUIREMENTS 128 129 None 130 131 ------------------------------------------------------------------------------ 132 REFERENCES 133 134 d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 135 136 ------------------------------------------------------------------------------ 137 PSEUDO-CODE 138 139 140 ------------------------------------------------------------------------------ 141 RESOURCES USED [optional] 142 143 When the code is written for a specific target processor the 144 the resources used should be documented below. 145 146 HEAP MEMORY USED: x bytes 147 148 STACK MEMORY USED: x bytes 149 150 CLOCK CYCLES: (cycle count equation for this function) + (variable 151 used to represent cycle count for each subroutine 152 called) 153 where: (cycle count variable) = cycle count for [subroutine 154 name] 155 156 ------------------------------------------------------------------------------ 157 CAUTION [optional] 158 [State any special notes, constraints or cautions for users of this function] 159 160 ------------------------------------------------------------------------------ 161 */ 162 163 static void decompress10( 164 Word16 MSBs, /* i : MSB part of the index */ 165 Word16 LSBs, /* i : LSB part of the index */ 166 Word16 index1, /* i : index for first pos in pos_index[] */ 167 Word16 index2, /* i : index for second pos in pos_index[] */ 168 Word16 index3, /* i : index for third pos in pos_index[] */ 169 Word16 pos_indx[], /* o : position of 3 pulses (decompressed) */ 170 Flag *pOverflow) /* o : Flag set when overflow occurs */ 171 { 172 Word16 ia; 173 Word16 ib; 174 Word16 ic; 175 Word32 tempWord32; 176 177 /* 178 pos_indx[index1] = ((MSBs-25*(MSBs/25))%5)*2 + (LSBs-4*(LSBs/4))%2; 179 pos_indx[index2] = ((MSBs-25*(MSBs/25))/5)*2 + (LSBs-4*(LSBs/4))/2; 180 pos_indx[index3] = (MSBs/25)*2 + LSBs/4; 181 */ 182 183 if (MSBs > 124) 184 { 185 MSBs = 124; 186 } 187 188 ia = 189 mult( 190 MSBs, 191 1311, 192 pOverflow); 193 194 tempWord32 = 195 L_mult( 196 ia, 197 25, 198 pOverflow); 199 200 201 ia = (Word16)(MSBs - (tempWord32 >> 1)); 202 ib = 203 mult( 204 ia, 205 6554, 206 pOverflow); 207 208 tempWord32 = 209 L_mult( 210 ib, 211 5, 212 pOverflow); 213 214 ib = ia - (Word16)(tempWord32 >> 1); 215 216 ib = 217 shl( 218 ib, 219 1, 220 pOverflow); 221 222 223 ic = LSBs - ((LSBs >> 2) << 2); 224 225 226 pos_indx[index1] = ib + (ic & 1); 227 228 229 ib = 230 mult( 231 ia, 232 6554, 233 pOverflow); 234 235 ib = 236 shl( 237 ib, 238 1, 239 pOverflow); 240 241 242 pos_indx[index2] = ib + (ic >> 1); 243 244 245 ib = LSBs >> 2; 246 247 ic = 248 mult( 249 MSBs, 250 1311, 251 pOverflow); 252 253 ic = 254 shl( 255 ic, 256 1, 257 pOverflow); 258 259 pos_indx[index3] = 260 add( 261 ib, 262 ic, 263 pOverflow); 264 265 return; 266 } 267 268 269 /* 270 ------------------------------------------------------------------------------ 271 FUNCTION NAME: decompress_code 272 ------------------------------------------------------------------------------ 273 INPUT AND OUTPUT DEFINITIONS 274 275 Inputs: 276 indx[] -- array of type Word16 -- position and sign of 277 8 pulses (compressed) 278 279 Outputs: 280 sign_indx[] -- array of type Word16 -- signs of 4 pulses (signs only) 281 pos_indx[] -- array of type Word16 -- position index of 8 pulses 282 (position only) 283 pOverflow pointer to type Flag -- Flag set when overflow occurs 284 285 Returns: 286 None 287 288 Global Variables Used: 289 None 290 291 Local Variables Needed: 292 None 293 294 ------------------------------------------------------------------------------ 295 FUNCTION DESCRIPTION 296 297 PURPOSE: decompression of the linear codewords to 4+three indeces 298 one bit from each pulse is made robust to errors by 299 minimizing the phase shift of a bit error. 300 4 signs (one for each track) 301 i0,i4,i1 => one index (7+3) bits, 3 LSBs more robust 302 i2,i6,i5 => one index (7+3) bits, 3 LSBs more robust 303 i3,i7 => one index (5+2) bits, 2-3 LSbs more robust 304 305 ------------------------------------------------------------------------------ 306 REQUIREMENTS 307 308 None 309 310 ------------------------------------------------------------------------------ 311 REFERENCES 312 313 d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 314 315 ------------------------------------------------------------------------------ 316 PSEUDO-CODE 317 318 319 ------------------------------------------------------------------------------ 320 RESOURCES USED [optional] 321 322 When the code is written for a specific target processor the 323 the resources used should be documented below. 324 325 HEAP MEMORY USED: x bytes 326 327 STACK MEMORY USED: x bytes 328 329 CLOCK CYCLES: (cycle count equation for this function) + (variable 330 used to represent cycle count for each subroutine 331 called) 332 where: (cycle count variable) = cycle count for [subroutine 333 name] 334 335 ------------------------------------------------------------------------------ 336 CAUTION [optional] 337 [State any special notes, constraints or cautions for users of this function] 338 339 ------------------------------------------------------------------------------ 340 */ 341 342 static void decompress_code( 343 Word16 indx[], /* i : position and sign of 8 pulses (compressed) */ 344 Word16 sign_indx[], /* o : signs of 4 pulses (signs only) */ 345 Word16 pos_indx[], /* o : position index of 8 pulses (position only) */ 346 Flag *pOverflow /* o : Flag set when overflow occurs */ 347 ) 348 { 349 Word16 i; 350 Word16 ia; 351 Word16 ib; 352 Word16 MSBs; 353 Word16 LSBs; 354 Word16 MSBs0_24; 355 Word32 tempWord32; 356 357 for (i = 0; i < NB_TRACK_MR102; i++) 358 { 359 sign_indx[i] = indx[i]; 360 } 361 362 /* 363 First index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits 364 MSBs = indx[NB_TRACK]/8; 365 LSBs = indx[NB_TRACK]%8; 366 */ 367 MSBs = indx[NB_TRACK_MR102] >> 3; 368 369 LSBs = indx[NB_TRACK_MR102] & 0x7; 370 371 decompress10( 372 MSBs, 373 LSBs, 374 0, 375 4, 376 1, 377 pos_indx, 378 pOverflow); 379 380 /* 381 Second index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits 382 MSBs = indx[NB_TRACK+1]/8; 383 LSBs = indx[NB_TRACK+1]%8; 384 */ 385 MSBs = indx[NB_TRACK_MR102+1] >> 3; 386 387 LSBs = indx[NB_TRACK_MR102+1] & 0x7; 388 389 decompress10( 390 MSBs, 391 LSBs, 392 2, 393 6, 394 5, 395 pos_indx, 396 pOverflow); 397 398 /* 399 Third index: 10x10 -> 2x5x2x5-> 25x2x2 -> 5+1x2 bits 400 MSBs = indx[NB_TRACK+2]/4; 401 LSBs = indx[NB_TRACK+2]%4; 402 MSBs0_24 = (MSBs*25+12)/32; 403 if ((MSBs0_24/5)%2==1) 404 pos_indx[3] = (4-(MSBs0_24%5))*2 + LSBs%2; 405 else 406 pos_indx[3] = (MSBs0_24%5)*2 + LSBs%2; 407 pos_indx[7] = (MSBs0_24/5)*2 + LSBs/2; 408 */ 409 410 MSBs = indx[NB_TRACK_MR102+2] >> 2; 411 412 LSBs = indx[NB_TRACK_MR102+2] & 0x3; 413 414 tempWord32 = 415 L_mult( 416 MSBs, 417 25, 418 pOverflow); 419 420 ia = 421 (Word16) 422 L_shr( 423 tempWord32, 424 1, 425 pOverflow); 426 427 ia += 12; 428 429 MSBs0_24 = ia >> 5; 430 431 432 ia = 433 mult( 434 MSBs0_24, 435 6554, 436 pOverflow); 437 438 ia &= 1; 439 440 441 ib = 442 mult( 443 MSBs0_24, 444 6554, 445 pOverflow); 446 447 tempWord32 = 448 L_mult( 449 ib, 450 5, 451 pOverflow); 452 453 454 ib = MSBs0_24 - (Word16)(tempWord32 >> 1); 455 456 if (ia == 1) 457 { 458 ib = 4 - ib; 459 460 } 461 462 463 ib = 464 shl( 465 ib, 466 1, 467 pOverflow); 468 469 ia = LSBs & 0x1; 470 471 pos_indx[3] = 472 add( 473 ib, 474 ia, 475 pOverflow); 476 477 ia = 478 mult( 479 MSBs0_24, 480 6554, 481 pOverflow); 482 483 ia = 484 shl( 485 ia, 486 1, 487 pOverflow); 488 489 pos_indx[7] = ia + (LSBs >> 1); 490 491 } 492 493 /* 494 ------------------------------------------------------------------------------ 495 FUNCTION NAME: dec_8i40_31bits 496 ------------------------------------------------------------------------------ 497 INPUT AND OUTPUT DEFINITIONS 498 499 Inputs: 500 index array of type Word16 -- index of 8 pulses (sign+position) 501 502 Outputs: 503 cod array of type Word16 -- algebraic (fixed) codebook excitation 504 pOverflow pointer to type Flag -- Flag set when overflow occurs 505 506 Returns: 507 None 508 509 Global Variables Used: 510 None 511 512 Local Variables Needed: 513 None 514 515 ------------------------------------------------------------------------------ 516 FUNCTION DESCRIPTION 517 518 PURPOSE: Builds the innovative codevector from the received 519 index of algebraic codebook. 520 521 ------------------------------------------------------------------------------ 522 REQUIREMENTS 523 524 None 525 526 ------------------------------------------------------------------------------ 527 REFERENCES 528 529 d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 530 531 ------------------------------------------------------------------------------ 532 PSEUDO-CODE 533 534 535 ------------------------------------------------------------------------------ 536 RESOURCES USED [optional] 537 538 When the code is written for a specific target processor the 539 the resources used should be documented below. 540 541 HEAP MEMORY USED: x bytes 542 543 STACK MEMORY USED: x bytes 544 545 CLOCK CYCLES: (cycle count equation for this function) + (variable 546 used to represent cycle count for each subroutine 547 called) 548 where: (cycle count variable) = cycle count for [subroutine 549 name] 550 551 ------------------------------------------------------------------------------ 552 CAUTION [optional] 553 [State any special notes, constraints or cautions for users of this function] 554 555 ------------------------------------------------------------------------------ 556 */ 557 558 void dec_8i40_31bits( 559 Word16 index[], /* i : index of 8 pulses (sign+position) */ 560 Word16 cod[], /* o : algebraic (fixed) codebook excitation */ 561 Flag *pOverflow /* o : Flag set when overflow occurs */ 562 ) 563 { 564 Word16 i; 565 Word16 j; 566 Word16 pos1; 567 Word16 pos2; 568 Word16 sign; 569 570 Word16 linear_signs[NB_TRACK_MR102]; 571 Word16 linear_codewords[NB_PULSE]; 572 573 for (i = 0; i < L_CODE; i++) 574 { 575 cod[i] = 0; 576 } 577 578 decompress_code( 579 index, 580 linear_signs, 581 linear_codewords, 582 pOverflow); 583 584 /* decode the positions and signs of pulses and build the codeword */ 585 for (j = 0; j < NB_TRACK_MR102; j++) /* NB_TRACK_MR102 = 4 */ 586 { 587 /* position of pulse "j" */ 588 589 pos1 = (linear_codewords[j] << 2) + j; 590 591 592 if (linear_signs[j] == 0) 593 { 594 sign = POS_CODE; /* +1.0 */ 595 } 596 else 597 { 598 sign = -NEG_CODE; /* -1.0 */ 599 } 600 601 if (pos1 < L_SUBFR) 602 { 603 cod[pos1] = sign; /* avoid buffer overflow */ 604 } 605 606 /* compute index i */ 607 /* position of pulse "j+4" */ 608 609 pos2 = (linear_codewords[j + 4] << 2) + j; 610 611 612 if (pos2 < pos1) 613 { 614 sign = negate(sign); 615 } 616 617 if (pos2 < L_SUBFR) 618 { 619 cod[pos2] += sign; /* avoid buffer overflow */ 620 } 621 622 623 } /* for (j = 0; j < NB_TRACK_MR102; j++) */ 624 625 return; 626 } 627