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.173 22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2007, 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 Filename: pvamrwbdecoder.cpp 35 36 Date: 05/08/2004 37 38 ------------------------------------------------------------------------------ 39 REVISION HISTORY 40 41 42 Description: 43 44 ------------------------------------------------------------------------------ 45 INPUT AND OUTPUT DEFINITIONS 46 47 int16 mode, input : used mode 48 int16 prms[], input : parameter vector 49 int16 synth16k[], output: synthesis speech 50 int16 * frame_length, output: lenght of the frame 51 void *spd_state, i/o : State structure 52 int16 frame_type, input : received frame type 53 int16 ScratchMem[] 54 55 ------------------------------------------------------------------------------ 56 FUNCTION DESCRIPTION 57 58 Performs the main decoder routine AMR WB ACELP coding algorithm with 20 ms 59 speech frames for wideband speech signals. 60 61 62 ------------------------------------------------------------------------------ 63 REQUIREMENTS 64 65 66 ------------------------------------------------------------------------------ 67 REFERENCES 68 69 ------------------------------------------------------------------------------ 70 PSEUDO-CODE 71 72 ------------------------------------------------------------------------------ 73 */ 74 75 76 /*---------------------------------------------------------------------------- 77 ; INCLUDES 78 ----------------------------------------------------------------------------*/ 79 80 #include "pv_amr_wb_type_defs.h" 81 #include "pvamrwbdecoder_mem_funcs.h" 82 #include "pvamrwbdecoder_basic_op.h" 83 #include "pvamrwbdecoder_cnst.h" 84 #include "pvamrwbdecoder_acelp.h" 85 #include "e_pv_amrwbdec.h" 86 #include "get_amr_wb_bits.h" 87 #include "pvamrwb_math_op.h" 88 #include "pvamrwbdecoder_api.h" 89 #include "pvamrwbdecoder.h" 90 #include "synthesis_amr_wb.h" 91 92 93 /*---------------------------------------------------------------------------- 94 ; MACROS 95 ; Define module specific macros here 96 ----------------------------------------------------------------------------*/ 97 98 99 /*---------------------------------------------------------------------------- 100 ; DEFINES 101 ; Include all pre-processor statements here. Include conditional 102 ; compile variables also. 103 ----------------------------------------------------------------------------*/ 104 105 /*---------------------------------------------------------------------------- 106 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 107 ; Variable declaration - defined here and used outside this module 108 ----------------------------------------------------------------------------*/ 109 110 /* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */ 111 static const int16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767}; 112 113 114 /* isp tables for initialization */ 115 116 static const int16 isp_init[M] = 117 { 118 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0, 119 -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475 120 }; 121 122 static const int16 isf_init[M] = 123 { 124 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 125 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840 126 }; 127 128 /*---------------------------------------------------------------------------- 129 ; EXTERNAL FUNCTION REFERENCES 130 ; Declare functions defined elsewhere and referenced in this module 131 ----------------------------------------------------------------------------*/ 132 133 /*---------------------------------------------------------------------------- 134 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 135 ; Declare variables used in this module but defined elsewhere 136 ----------------------------------------------------------------------------*/ 137 138 /*---------------------------------------------------------------------------- 139 ; FUNCTION CODE 140 ----------------------------------------------------------------------------*/ 141 142 /*---------------------------------------------------------------------------- 143 FUNCTION DESCRIPTION pvDecoder_AmrWb_Init 144 145 Initialization of variables for the decoder section. 146 147 ----------------------------------------------------------------------------*/ 148 149 150 151 152 void pvDecoder_AmrWb_Init(void **spd_state, void *pt_st, int16 **ScratchMem) 153 { 154 /* Decoder states */ 155 Decoder_State *st = &(((PV_AmrWbDec *)pt_st)->state); 156 157 *ScratchMem = ((PV_AmrWbDec *)pt_st)->ScratchMem; 158 /* 159 * Init dtx decoding 160 */ 161 dtx_dec_amr_wb_reset(&(st->dtx_decSt), isf_init); 162 163 pvDecoder_AmrWb_Reset((void *) st, 1); 164 165 *spd_state = (void *) st; 166 167 return; 168 } 169 170 /*---------------------------------------------------------------------------- 171 ; FUNCTION CODE 172 ----------------------------------------------------------------------------*/ 173 174 void pvDecoder_AmrWb_Reset(void *st, int16 reset_all) 175 { 176 int16 i; 177 178 Decoder_State *dec_state; 179 180 dec_state = (Decoder_State *) st; 181 182 pv_memset((void *)dec_state->old_exc, 183 0, 184 (PIT_MAX + L_INTERPOL)*sizeof(*dec_state->old_exc)); 185 186 pv_memset((void *)dec_state->past_isfq, 187 0, 188 M*sizeof(*dec_state->past_isfq)); 189 190 191 dec_state->old_T0_frac = 0; /* old pitch value = 64.0 */ 192 dec_state->old_T0 = 64; 193 dec_state->first_frame = 1; 194 dec_state->L_gc_thres = 0; 195 dec_state->tilt_code = 0; 196 197 pv_memset((void *)dec_state->disp_mem, 198 0, 199 8*sizeof(*dec_state->disp_mem)); 200 201 202 /* scaling memories for excitation */ 203 dec_state->Q_old = Q_MAX; 204 dec_state->Qsubfr[3] = Q_MAX; 205 dec_state->Qsubfr[2] = Q_MAX; 206 dec_state->Qsubfr[1] = Q_MAX; 207 dec_state->Qsubfr[0] = Q_MAX; 208 209 if (reset_all != 0) 210 { 211 /* routines initialization */ 212 213 dec_gain2_amr_wb_init(dec_state->dec_gain); 214 oversamp_12k8_to_16k_init(dec_state->mem_oversamp); 215 band_pass_6k_7k_init(dec_state->mem_hf); 216 low_pass_filt_7k_init(dec_state->mem_hf3); 217 highpass_50Hz_at_12k8_init(dec_state->mem_sig_out); 218 highpass_400Hz_at_12k8_init(dec_state->mem_hp400); 219 Init_Lagconc(dec_state->lag_hist); 220 221 /* isp initialization */ 222 223 pv_memcpy((void *)dec_state->ispold, (void *)isp_init, M*sizeof(*isp_init)); 224 225 pv_memcpy((void *)dec_state->isfold, (void *)isf_init, M*sizeof(*isf_init)); 226 for (i = 0; i < L_MEANBUF; i++) 227 { 228 pv_memcpy((void *)&dec_state->isf_buf[i * M], 229 (void *)isf_init, 230 M*sizeof(*isf_init)); 231 } 232 /* variable initialization */ 233 234 dec_state->mem_deemph = 0; 235 236 dec_state->seed = 21845; /* init random with 21845 */ 237 dec_state->seed2 = 21845; 238 dec_state->seed3 = 21845; 239 240 dec_state->state = 0; 241 dec_state->prev_bfi = 0; 242 243 /* Static vectors to zero */ 244 245 pv_memset((void *)dec_state->mem_syn_hf, 246 0, 247 M16k*sizeof(*dec_state->mem_syn_hf)); 248 249 pv_memset((void *)dec_state->mem_syn_hi, 250 0, 251 M*sizeof(*dec_state->mem_syn_hi)); 252 253 pv_memset((void *)dec_state->mem_syn_lo, 254 0, 255 M*sizeof(*dec_state->mem_syn_lo)); 256 257 258 dtx_dec_amr_wb_reset(&(dec_state->dtx_decSt), isf_init); 259 dec_state->vad_hist = 0; 260 261 } 262 return; 263 } 264 265 /*---------------------------------------------------------------------------- 266 ; FUNCTION CODE 267 ----------------------------------------------------------------------------*/ 268 269 int32 pvDecoder_AmrWbMemRequirements() 270 { 271 return(sizeof(PV_AmrWbDec)); 272 } 273 274 275 /*---------------------------------------------------------------------------- 276 ; FUNCTION CODE 277 ----------------------------------------------------------------------------*/ 278 279 /* Main decoder routine. */ 280 281 int32 pvDecoder_AmrWb( 282 int16 mode, /* input : used mode */ 283 int16 prms[], /* input : parameter vector */ 284 int16 synth16k[], /* output: synthesis speech */ 285 int16 * frame_length, /* output: lenght of the frame */ 286 void *spd_state, /* i/o : State structure */ 287 int16 frame_type, /* input : received frame type */ 288 int16 ScratchMem[] 289 ) 290 { 291 292 /* Decoder states */ 293 Decoder_State *st; 294 295 int16 *ScratchMem2 = &ScratchMem[ L_SUBFR + L_SUBFR16k + ((L_SUBFR + M + M16k +1)<<1)]; 296 297 298 /* Excitation vector */ 299 300 301 int16 *old_exc = ScratchMem2; 302 303 int16 *Aq = &old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];/* A(z) quantized for the 4 subframes */ 304 305 int16 *ispnew = &Aq[NB_SUBFR * (M + 1)];/* immittance spectral pairs at 4nd sfr */ 306 int16 *isf = &ispnew[M]; /* ISF (frequency domain) at 4nd sfr */ 307 int16 *isf_tmp = &isf[M]; 308 int16 *code = &isf_tmp[M]; /* algebraic codevector */ 309 int16 *excp = &code[L_SUBFR]; 310 int16 *exc2 = &excp[L_SUBFR]; /* excitation vector */ 311 int16 *HfIsf = &exc2[L_FRAME]; 312 313 314 int16 *exc; 315 316 /* LPC coefficients */ 317 318 int16 *p_Aq; /* ptr to A(z) for the 4 subframes */ 319 320 321 322 int16 fac, stab_fac, voice_fac, Q_new = 0; 323 int32 L_tmp, L_gain_code; 324 325 /* Scalars */ 326 327 int16 i, j, i_subfr, index, ind[8], tmp; 328 int32 max; 329 int16 T0, T0_frac, pit_flag, T0_max, select, T0_min = 0; 330 int16 gain_pit, gain_code; 331 int16 newDTXState, bfi, unusable_frame, nb_bits; 332 int16 vad_flag; 333 int16 pit_sharp; 334 335 int16 corr_gain = 0; 336 337 st = (Decoder_State *) spd_state; 338 339 /* mode verification */ 340 341 nb_bits = AMR_WB_COMPRESSED[mode]; 342 343 *frame_length = AMR_WB_PCM_FRAME; 344 345 /* find the new DTX state SPEECH OR DTX */ 346 newDTXState = rx_amr_wb_dtx_handler(&(st->dtx_decSt), frame_type); 347 348 349 if (newDTXState != SPEECH) 350 { 351 dtx_dec_amr_wb(&(st->dtx_decSt), exc2, newDTXState, isf, &prms); 352 } 353 /* SPEECH action state machine */ 354 355 if ((frame_type == RX_SPEECH_BAD) || 356 (frame_type == RX_SPEECH_PROBABLY_DEGRADED)) 357 { 358 /* bfi for all index, bits are not usable */ 359 bfi = 1; 360 unusable_frame = 0; 361 } 362 else if ((frame_type == RX_NO_DATA) || 363 (frame_type == RX_SPEECH_LOST)) 364 { 365 /* bfi only for lsf, gains and pitch period */ 366 bfi = 1; 367 unusable_frame = 1; 368 } 369 else 370 { 371 bfi = 0; 372 unusable_frame = 0; 373 } 374 375 if (bfi != 0) 376 { 377 st->state += 1; 378 379 if (st->state > 6) 380 { 381 st->state = 6; 382 } 383 } 384 else 385 { 386 st->state >>= 1; 387 } 388 389 /* If this frame is the first speech frame after CNI period, 390 * set the BFH state machine to an appropriate state depending 391 * on whether there was DTX muting before start of speech or not 392 * If there was DTX muting, the first speech frame is muted. 393 * If there was no DTX muting, the first speech frame is not 394 * muted. The BFH state machine starts from state 5, however, to 395 * keep the audible noise resulting from a SID frame which is 396 * erroneously interpreted as a good speech frame as small as 397 * possible (the decoder output in this case is quickly muted) 398 */ 399 400 if (st->dtx_decSt.dtxGlobalState == DTX) 401 { 402 st->state = 5; 403 st->prev_bfi = 0; 404 } 405 else if (st->dtx_decSt.dtxGlobalState == DTX_MUTE) 406 { 407 st->state = 5; 408 st->prev_bfi = 1; 409 } 410 411 if (newDTXState == SPEECH) 412 { 413 vad_flag = Serial_parm_1bit(&prms); 414 415 if (bfi == 0) 416 { 417 if (vad_flag == 0) 418 { 419 st->vad_hist = add_int16(st->vad_hist, 1); 420 } 421 else 422 { 423 st->vad_hist = 0; 424 } 425 } 426 } 427 /* 428 * DTX-CNG 429 */ 430 431 if (newDTXState != SPEECH) /* CNG mode */ 432 { 433 /* increase slightly energy of noise below 200 Hz */ 434 435 /* Convert ISFs to the cosine domain */ 436 Isf_isp(isf, ispnew, M); 437 438 Isp_Az(ispnew, Aq, M, 1); 439 440 pv_memcpy((void *)isf_tmp, (void *)st->isfold, M*sizeof(*isf_tmp)); 441 442 443 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 444 { 445 j = i_subfr >> 6; 446 447 for (i = 0; i < M; i++) 448 { 449 L_tmp = mul_16by16_to_int32(isf_tmp[i], sub_int16(32767, interpol_frac[j])); 450 L_tmp = mac_16by16_to_int32(L_tmp, isf[i], interpol_frac[j]); 451 HfIsf[i] = amr_wb_round(L_tmp); 452 } 453 454 synthesis_amr_wb(Aq, 455 &exc2[i_subfr], 456 0, 457 &synth16k[i_subfr *5/4], 458 (short) 1, 459 HfIsf, 460 nb_bits, 461 newDTXState, 462 st, 463 bfi, 464 ScratchMem); 465 } 466 467 /* reset speech coder memories */ 468 pvDecoder_AmrWb_Reset(st, 0); 469 470 pv_memcpy((void *)st->isfold, (void *)isf, M*sizeof(*isf)); 471 472 st->prev_bfi = bfi; 473 st->dtx_decSt.dtxGlobalState = newDTXState; 474 475 return 0; 476 } 477 /* 478 * ACELP 479 */ 480 481 /* copy coder memory state into working space (internal memory for DSP) */ 482 483 pv_memcpy((void *)old_exc, (void *)st->old_exc, (PIT_MAX + L_INTERPOL)*sizeof(*old_exc)); 484 485 exc = old_exc + PIT_MAX + L_INTERPOL; 486 487 /* Decode the ISFs */ 488 489 if (nb_bits > NBBITS_7k) /* all rates but 6.6 Kbps */ 490 { 491 ind[0] = Serial_parm(8, &prms); /* index of 1st ISP subvector */ 492 ind[1] = Serial_parm(8, &prms); /* index of 2nd ISP subvector */ 493 ind[2] = Serial_parm(6, &prms); /* index of 3rd ISP subvector */ 494 ind[3] = Serial_parm(7, &prms); /* index of 4th ISP subvector */ 495 ind[4] = Serial_parm(7, &prms); /* index of 5th ISP subvector */ 496 ind[5] = Serial_parm(5, &prms); /* index of 6th ISP subvector */ 497 ind[6] = Serial_parm(5, &prms); /* index of 7th ISP subvector */ 498 499 Dpisf_2s_46b(ind, isf, st->past_isfq, st->isfold, st->isf_buf, bfi, 1); 500 } 501 else 502 { 503 ind[0] = Serial_parm(8, &prms); 504 ind[1] = Serial_parm(8, &prms); 505 ind[2] = Serial_parm(14, &prms); 506 ind[3] = ind[2] & 0x007F; 507 ind[2] >>= 7; 508 ind[4] = Serial_parm(6, &prms); 509 510 Dpisf_2s_36b(ind, isf, st->past_isfq, st->isfold, st->isf_buf, bfi, 1); 511 } 512 513 /* Convert ISFs to the cosine domain */ 514 515 Isf_isp(isf, ispnew, M); 516 517 if (st->first_frame != 0) 518 { 519 st->first_frame = 0; 520 pv_memcpy((void *)st->ispold, (void *)ispnew, M*sizeof(*ispnew)); 521 522 } 523 /* Find the interpolated ISPs and convert to a[] for all subframes */ 524 interpolate_isp(st->ispold, ispnew, interpol_frac, Aq); 525 526 /* update ispold[] for the next frame */ 527 pv_memcpy((void *)st->ispold, (void *)ispnew, M*sizeof(*ispnew)); 528 529 /* Check stability on isf : distance between old isf and current isf */ 530 531 L_tmp = 0; 532 for (i = 0; i < M - 1; i++) 533 { 534 tmp = sub_int16(isf[i], st->isfold[i]); 535 L_tmp = mac_16by16_to_int32(L_tmp, tmp, tmp); 536 } 537 tmp = extract_h(shl_int32(L_tmp, 8)); 538 tmp = mult_int16(tmp, 26214); /* tmp = L_tmp*0.8/256 */ 539 540 tmp = 20480 - tmp; /* 1.25 - tmp */ 541 stab_fac = shl_int16(tmp, 1); /* Q14 -> Q15 with saturation */ 542 543 if (stab_fac < 0) 544 { 545 stab_fac = 0; 546 } 547 pv_memcpy((void *)isf_tmp, (void *)st->isfold, M*sizeof(*isf_tmp)); 548 549 pv_memcpy((void *)st->isfold, (void *)isf, M*sizeof(*isf)); 550 551 /* 552 * Loop for every subframe in the analysis frame 553 * 554 * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR 555 * times 556 * - decode the pitch delay and filter mode 557 * - decode algebraic code 558 * - decode pitch and codebook gains 559 * - find voicing factor and tilt of code for next subframe. 560 * - find the excitation and compute synthesis speech 561 */ 562 563 p_Aq = Aq; /* pointer to interpolated LPC parameters */ 564 565 566 /* 567 * Sub process next 3 subframes 568 */ 569 570 571 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) 572 { 573 pit_flag = i_subfr; 574 575 576 if ((i_subfr == 2*L_SUBFR) && (nb_bits > NBBITS_7k)) 577 { 578 pit_flag = 0; /* set to 0 for 3rd subframe, <=> is not 6.6 kbps */ 579 } 580 /*-------------------------------------------------* 581 * - Decode pitch lag * 582 * Lag indeces received also in case of BFI, * 583 * so that the parameter pointer stays in sync. * 584 *-------------------------------------------------*/ 585 586 if (pit_flag == 0) 587 { 588 589 if (nb_bits <= NBBITS_9k) 590 { 591 index = Serial_parm(8, &prms); 592 593 if (index < (PIT_FR1_8b - PIT_MIN) * 2) 594 { 595 T0 = PIT_MIN + (index >> 1); 596 T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_MIN), 1)); 597 T0_frac = shl_int16(T0_frac, 1); 598 } 599 else 600 { 601 T0 = add_int16(index, PIT_FR1_8b - ((PIT_FR1_8b - PIT_MIN) * 2)); 602 T0_frac = 0; 603 } 604 } 605 else 606 { 607 index = Serial_parm(9, &prms); 608 609 if (index < (PIT_FR2 - PIT_MIN) * 4) 610 { 611 T0 = PIT_MIN + (index >> 2); 612 T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_MIN), 2)); 613 } 614 else if (index < (((PIT_FR2 - PIT_MIN) << 2) + ((PIT_FR1_9b - PIT_FR2) << 1))) 615 { 616 index -= (PIT_FR2 - PIT_MIN) << 2; 617 T0 = PIT_FR2 + (index >> 1); 618 T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_FR2), 1)); 619 T0_frac = shl_int16(T0_frac, 1); 620 } 621 else 622 { 623 T0 = add_int16(index, (PIT_FR1_9b - ((PIT_FR2 - PIT_MIN) * 4) - ((PIT_FR1_9b - PIT_FR2) * 2))); 624 T0_frac = 0; 625 } 626 } 627 628 /* find T0_min and T0_max for subframe 2 and 4 */ 629 630 T0_min = T0 - 8; 631 632 if (T0_min < PIT_MIN) 633 { 634 T0_min = PIT_MIN; 635 } 636 T0_max = T0_min + 15; 637 638 if (T0_max > PIT_MAX) 639 { 640 T0_max = PIT_MAX; 641 T0_min = PIT_MAX - 15; 642 } 643 } 644 else 645 { /* if subframe 2 or 4 */ 646 647 if (nb_bits <= NBBITS_9k) 648 { 649 index = Serial_parm(5, &prms); 650 651 T0 = T0_min + (index >> 1); 652 T0_frac = sub_int16(index, shl_int16(T0 - T0_min, 1)); 653 T0_frac = shl_int16(T0_frac, 1); 654 } 655 else 656 { 657 index = Serial_parm(6, &prms); 658 659 T0 = T0_min + (index >> 2); 660 T0_frac = sub_int16(index, shl_int16(T0 - T0_min, 2)); 661 } 662 } 663 664 /* check BFI after pitch lag decoding */ 665 666 if (bfi != 0) /* if frame erasure */ 667 { 668 lagconceal(&(st->dec_gain[17]), st->lag_hist, &T0, &(st->old_T0), &(st->seed3), unusable_frame); 669 T0_frac = 0; 670 } 671 /* 672 * Find the pitch gain, the interpolation filter 673 * and the adaptive codebook vector. 674 */ 675 676 Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1); 677 678 679 if (unusable_frame) 680 { 681 select = 1; 682 } 683 else 684 { 685 686 if (nb_bits <= NBBITS_9k) 687 { 688 select = 0; 689 } 690 else 691 { 692 select = Serial_parm_1bit(&prms); 693 } 694 } 695 696 697 if (select == 0) 698 { 699 /* find pitch excitation with lp filter */ 700 for (i = 0; i < L_SUBFR; i++) 701 { 702 L_tmp = ((int32) exc[i-1+i_subfr] + exc[i+1+i_subfr]); 703 L_tmp *= 5898; 704 L_tmp += ((int32) exc[i+i_subfr] * 20972); 705 706 code[i] = amr_wb_round(L_tmp << 1); 707 } 708 pv_memcpy((void *)&exc[i_subfr], (void *)code, L_SUBFR*sizeof(*code)); 709 710 } 711 /* 712 * Decode innovative codebook. 713 * Add the fixed-gain pitch contribution to code[]. 714 */ 715 716 if (unusable_frame != 0) 717 { 718 /* the innovative code doesn't need to be scaled (see Q_gain2) */ 719 for (i = 0; i < L_SUBFR; i++) 720 { 721 code[i] = noise_gen_amrwb(&(st->seed)) >> 3; 722 } 723 } 724 else if (nb_bits <= NBBITS_7k) 725 { 726 ind[0] = Serial_parm(12, &prms); 727 dec_acelp_2p_in_64(ind[0], code); 728 } 729 else if (nb_bits <= NBBITS_9k) 730 { 731 for (i = 0; i < 4; i++) 732 { 733 ind[i] = Serial_parm(5, &prms); 734 } 735 dec_acelp_4p_in_64(ind, 20, code); 736 } 737 else if (nb_bits <= NBBITS_12k) 738 { 739 for (i = 0; i < 4; i++) 740 { 741 ind[i] = Serial_parm(9, &prms); 742 } 743 dec_acelp_4p_in_64(ind, 36, code); 744 } 745 else if (nb_bits <= NBBITS_14k) 746 { 747 ind[0] = Serial_parm(13, &prms); 748 ind[1] = Serial_parm(13, &prms); 749 ind[2] = Serial_parm(9, &prms); 750 ind[3] = Serial_parm(9, &prms); 751 dec_acelp_4p_in_64(ind, 44, code); 752 } 753 else if (nb_bits <= NBBITS_16k) 754 { 755 for (i = 0; i < 4; i++) 756 { 757 ind[i] = Serial_parm(13, &prms); 758 } 759 dec_acelp_4p_in_64(ind, 52, code); 760 } 761 else if (nb_bits <= NBBITS_18k) 762 { 763 for (i = 0; i < 4; i++) 764 { 765 ind[i] = Serial_parm(2, &prms); 766 } 767 for (i = 4; i < 8; i++) 768 { 769 ind[i] = Serial_parm(14, &prms); 770 } 771 dec_acelp_4p_in_64(ind, 64, code); 772 } 773 else if (nb_bits <= NBBITS_20k) 774 { 775 ind[0] = Serial_parm(10, &prms); 776 ind[1] = Serial_parm(10, &prms); 777 ind[2] = Serial_parm(2, &prms); 778 ind[3] = Serial_parm(2, &prms); 779 ind[4] = Serial_parm(10, &prms); 780 ind[5] = Serial_parm(10, &prms); 781 ind[6] = Serial_parm(14, &prms); 782 ind[7] = Serial_parm(14, &prms); 783 dec_acelp_4p_in_64(ind, 72, code); 784 } 785 else 786 { 787 for (i = 0; i < 8; i++) 788 { 789 ind[i] = Serial_parm(11, &prms); 790 } 791 792 dec_acelp_4p_in_64(ind, 88, code); 793 } 794 795 preemph_amrwb_dec(code, st->tilt_code, L_SUBFR); 796 797 tmp = T0; 798 799 if (T0_frac > 2) 800 { 801 tmp++; 802 } 803 Pit_shrp(code, tmp, PIT_SHARP, L_SUBFR); 804 805 /* 806 * Decode codebooks gains. 807 */ 808 809 if (nb_bits <= NBBITS_9k) 810 { 811 index = Serial_parm(6, &prms); /* codebook gain index */ 812 813 dec_gain2_amr_wb(index, 814 6, 815 code, 816 L_SUBFR, 817 &gain_pit, 818 &L_gain_code, 819 bfi, 820 st->prev_bfi, 821 st->state, 822 unusable_frame, 823 st->vad_hist, 824 st->dec_gain); 825 } 826 else 827 { 828 index = Serial_parm(7, &prms); /* codebook gain index */ 829 830 dec_gain2_amr_wb(index, 831 7, 832 code, 833 L_SUBFR, 834 &gain_pit, 835 &L_gain_code, 836 bfi, 837 st->prev_bfi, 838 st->state, 839 unusable_frame, 840 st->vad_hist, 841 st->dec_gain); 842 } 843 844 /* find best scaling to perform on excitation (Q_new) */ 845 846 tmp = st->Qsubfr[0]; 847 for (i = 1; i < 4; i++) 848 { 849 if (st->Qsubfr[i] < tmp) 850 { 851 tmp = st->Qsubfr[i]; 852 } 853 } 854 855 /* limit scaling (Q_new) to Q_MAX: see pv_amr_wb_cnst.h and syn_filt_32() */ 856 857 if (tmp > Q_MAX) 858 { 859 tmp = Q_MAX; 860 } 861 Q_new = 0; 862 L_tmp = L_gain_code; /* L_gain_code in Q16 */ 863 864 865 while ((L_tmp < 0x08000000L) && (Q_new < tmp)) 866 { 867 L_tmp <<= 1; 868 Q_new += 1; 869 870 } 871 gain_code = amr_wb_round(L_tmp); /* scaled gain_code with Qnew */ 872 873 scale_signal(exc + i_subfr - (PIT_MAX + L_INTERPOL), 874 PIT_MAX + L_INTERPOL + L_SUBFR, 875 (int16)(Q_new - st->Q_old)); 876 877 st->Q_old = Q_new; 878 879 880 /* 881 * Update parameters for the next subframe. 882 * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) 883 */ 884 885 886 if (bfi == 0) 887 { 888 /* LTP-Lag history update */ 889 for (i = 4; i > 0; i--) 890 { 891 st->lag_hist[i] = st->lag_hist[i - 1]; 892 } 893 st->lag_hist[0] = T0; 894 895 st->old_T0 = T0; 896 st->old_T0_frac = 0; /* Remove fraction in case of BFI */ 897 } 898 /* find voice factor in Q15 (1=voiced, -1=unvoiced) */ 899 900 /* 901 * Scale down by 1/8 902 */ 903 for (i = L_SUBFR - 1; i >= 0; i--) 904 { 905 exc2[i] = (exc[i_subfr + i] + (0x0004 * (exc[i_subfr + i] != MAX_16))) >> 3; 906 } 907 908 909 /* post processing of excitation elements */ 910 911 if (nb_bits <= NBBITS_9k) 912 { 913 pit_sharp = shl_int16(gain_pit, 1); 914 915 if (pit_sharp > 16384) 916 { 917 for (i = 0; i < L_SUBFR; i++) 918 { 919 tmp = mult_int16(exc2[i], pit_sharp); 920 L_tmp = mul_16by16_to_int32(tmp, gain_pit); 921 L_tmp >>= 1; 922 excp[i] = amr_wb_round(L_tmp); 923 } 924 } 925 } 926 else 927 { 928 pit_sharp = 0; 929 } 930 931 voice_fac = voice_factor(exc2, -3, gain_pit, code, gain_code, L_SUBFR); 932 933 /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */ 934 935 st->tilt_code = (voice_fac >> 2) + 8192; 936 937 /* 938 * - Find the total excitation. 939 * - Find synthesis speech corresponding to exc[]. 940 * - Find maximum value of excitation for next scaling 941 */ 942 943 pv_memcpy((void *)exc2, (void *)&exc[i_subfr], L_SUBFR*sizeof(*exc2)); 944 max = 1; 945 946 for (i = 0; i < L_SUBFR; i++) 947 { 948 L_tmp = mul_16by16_to_int32(code[i], gain_code); 949 L_tmp = shl_int32(L_tmp, 5); 950 L_tmp = mac_16by16_to_int32(L_tmp, exc[i + i_subfr], gain_pit); 951 L_tmp = shl_int32(L_tmp, 1); 952 tmp = amr_wb_round(L_tmp); 953 exc[i + i_subfr] = tmp; 954 tmp = tmp - (tmp < 0); 955 max |= tmp ^(tmp >> 15); /* |= tmp ^sign(tmp) */ 956 } 957 958 959 /* tmp = scaling possible according to max value of excitation */ 960 tmp = add_int16(norm_s(max), Q_new) - 1; 961 962 st->Qsubfr[3] = st->Qsubfr[2]; 963 st->Qsubfr[2] = st->Qsubfr[1]; 964 st->Qsubfr[1] = st->Qsubfr[0]; 965 st->Qsubfr[0] = tmp; 966 967 /* 968 * phase dispersion to enhance noise in low bit rate 969 */ 970 971 972 if (nb_bits <= NBBITS_7k) 973 { 974 j = 0; /* high dispersion for rate <= 7.5 kbit/s */ 975 } 976 else if (nb_bits <= NBBITS_9k) 977 { 978 j = 1; /* low dispersion for rate <= 9.6 kbit/s */ 979 } 980 else 981 { 982 j = 2; /* no dispersion for rate > 9.6 kbit/s */ 983 } 984 985 /* L_gain_code in Q16 */ 986 987 phase_dispersion((int16)(L_gain_code >> 16), 988 gain_pit, 989 code, 990 j, 991 st->disp_mem, 992 ScratchMem); 993 994 /* 995 * noise enhancer 996 * - Enhance excitation on noise. (modify gain of code) 997 * If signal is noisy and LPC filter is stable, move gain 998 * of code 1.5 dB toward gain of code threshold. 999 * This decrease by 3 dB noise energy variation. 1000 */ 1001 1002 tmp = 16384 - (voice_fac >> 1); /* 1=unvoiced, 0=voiced */ 1003 fac = mult_int16(stab_fac, tmp); 1004 1005 L_tmp = L_gain_code; 1006 1007 if (L_tmp < st->L_gc_thres) 1008 { 1009 L_tmp += fxp_mul32_by_16b(L_gain_code, 6226) << 1; 1010 1011 if (L_tmp > st->L_gc_thres) 1012 { 1013 L_tmp = st->L_gc_thres; 1014 } 1015 } 1016 else 1017 { 1018 L_tmp = fxp_mul32_by_16b(L_gain_code, 27536) << 1; 1019 1020 if (L_tmp < st->L_gc_thres) 1021 { 1022 L_tmp = st->L_gc_thres; 1023 } 1024 } 1025 st->L_gc_thres = L_tmp; 1026 1027 L_gain_code = fxp_mul32_by_16b(L_gain_code, (32767 - fac)) << 1; 1028 1029 1030 L_gain_code = add_int32(L_gain_code, fxp_mul32_by_16b(L_tmp, fac) << 1); 1031 1032 /* 1033 * pitch enhancer 1034 * - Enhance excitation on voice. (HP filtering of code) 1035 * On voiced signal, filtering of code by a smooth fir HP 1036 * filter to decrease energy of code in low frequency. 1037 */ 1038 1039 tmp = (voice_fac >> 3) + 4096;/* 0.25=voiced, 0=unvoiced */ 1040 1041 /* build excitation */ 1042 1043 gain_code = amr_wb_round(shl_int32(L_gain_code, Q_new)); 1044 1045 L_tmp = (int32)(code[0] << 16); 1046 L_tmp = msu_16by16_from_int32(L_tmp, code[1], tmp); 1047 L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code); 1048 L_tmp = shl_int32(L_tmp, 5); 1049 L_tmp = mac_16by16_to_int32(L_tmp, exc2[0], gain_pit); 1050 L_tmp = shl_int32(L_tmp, 1); /* saturation can occur here */ 1051 exc2[0] = amr_wb_round(L_tmp); 1052 1053 1054 for (i = 1; i < L_SUBFR - 1; i++) 1055 { 1056 L_tmp = (int32)(code[i] << 16); 1057 L_tmp = msu_16by16_from_int32(L_tmp, (code[i + 1] + code[i - 1]), tmp); 1058 L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code); 1059 L_tmp = shl_int32(L_tmp, 5); 1060 L_tmp = mac_16by16_to_int32(L_tmp, exc2[i], gain_pit); 1061 L_tmp = shl_int32(L_tmp, 1); /* saturation can occur here */ 1062 exc2[i] = amr_wb_round(L_tmp); 1063 } 1064 1065 L_tmp = (int32)(code[L_SUBFR - 1] << 16); 1066 L_tmp = msu_16by16_from_int32(L_tmp, code[L_SUBFR - 2], tmp); 1067 L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code); 1068 L_tmp = shl_int32(L_tmp, 5); 1069 L_tmp = mac_16by16_to_int32(L_tmp, exc2[L_SUBFR - 1], gain_pit); 1070 L_tmp = shl_int32(L_tmp, 1); /* saturation can occur here */ 1071 exc2[L_SUBFR - 1] = amr_wb_round(L_tmp); 1072 1073 1074 1075 if (nb_bits <= NBBITS_9k) 1076 { 1077 if (pit_sharp > 16384) 1078 { 1079 for (i = 0; i < L_SUBFR; i++) 1080 { 1081 excp[i] = add_int16(excp[i], exc2[i]); 1082 } 1083 agc2_amr_wb(exc2, excp, L_SUBFR); 1084 pv_memcpy((void *)exc2, (void *)excp, L_SUBFR*sizeof(*exc2)); 1085 1086 } 1087 } 1088 if (nb_bits <= NBBITS_7k) 1089 { 1090 j = i_subfr >> 6; 1091 for (i = 0; i < M; i++) 1092 { 1093 L_tmp = mul_16by16_to_int32(isf_tmp[i], sub_int16(32767, interpol_frac[j])); 1094 L_tmp = mac_16by16_to_int32(L_tmp, isf[i], interpol_frac[j]); 1095 HfIsf[i] = amr_wb_round(L_tmp); 1096 } 1097 } 1098 else 1099 { 1100 pv_memset((void *)st->mem_syn_hf, 1101 0, 1102 (M16k - M)*sizeof(*st->mem_syn_hf)); 1103 } 1104 1105 if (nb_bits >= NBBITS_24k) 1106 { 1107 corr_gain = Serial_parm(4, &prms); 1108 } 1109 else 1110 { 1111 corr_gain = 0; 1112 } 1113 1114 synthesis_amr_wb(p_Aq, 1115 exc2, 1116 Q_new, 1117 &synth16k[i_subfr + (i_subfr>>2)], 1118 corr_gain, 1119 HfIsf, 1120 nb_bits, 1121 newDTXState, 1122 st, 1123 bfi, 1124 ScratchMem); 1125 1126 p_Aq += (M + 1); /* interpolated LPC parameters for next subframe */ 1127 } 1128 1129 /* 1130 * Update signal for next frame. 1131 * -> save past of exc[] 1132 * -> save pitch parameters 1133 */ 1134 1135 pv_memcpy((void *)st->old_exc, 1136 (void *)&old_exc[L_FRAME], 1137 (PIT_MAX + L_INTERPOL)*sizeof(*old_exc)); 1138 1139 scale_signal(exc, L_FRAME, (int16)(-Q_new)); 1140 1141 dtx_dec_amr_wb_activity_update(&(st->dtx_decSt), isf, exc); 1142 1143 st->dtx_decSt.dtxGlobalState = newDTXState; 1144 1145 st->prev_bfi = bfi; 1146 1147 return 0; 1148 } 1149 1150