1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /* 12 * entropy_coding.c 13 * 14 * This header file defines all of the functions used to arithmetically 15 * encode the iSAC bistream 16 * 17 */ 18 19 20 #include "entropy_coding.h" 21 #include "settings.h" 22 #include "arith_routines.h" 23 #include "signal_processing_library.h" 24 #include "spectrum_ar_model_tables.h" 25 #include "lpc_tables.h" 26 #include "pitch_gain_tables.h" 27 #include "pitch_lag_tables.h" 28 #include "encode_lpc_swb.h" 29 #include "lpc_shape_swb12_tables.h" 30 #include "lpc_shape_swb16_tables.h" 31 #include "lpc_gain_swb_tables.h" 32 #include "os_specific_inline.h" 33 34 #include <math.h> 35 #include <string.h> 36 37 static const uint16_t kLpcVecPerSegmentUb12 = 5; 38 static const uint16_t kLpcVecPerSegmentUb16 = 4; 39 40 /* CDF array for encoder bandwidth (12 vs 16 kHz) indicator. */ 41 static const uint16_t kOneBitEqualProbCdf[3] = { 42 0, 32768, 65535 }; 43 44 /* Pointer to cdf array for encoder bandwidth (12 vs 16 kHz) indicator. */ 45 static const uint16_t* kOneBitEqualProbCdf_ptr[1] = { 46 kOneBitEqualProbCdf }; 47 48 /* 49 * Initial cdf index for decoder of encoded bandwidth 50 * (12 vs 16 kHz) indicator. 51 */ 52 static const uint16_t kOneBitEqualProbInitIndex[1] = { 1 }; 53 54 55 static const int kIsSWB12 = 1; 56 57 /* compute correlation from power spectrum */ 58 static void FindCorrelation(int32_t* PSpecQ12, int32_t* CorrQ7) { 59 int32_t summ[FRAMESAMPLES / 8]; 60 int32_t diff[FRAMESAMPLES / 8]; 61 const int16_t* CS_ptrQ9; 62 int32_t sum; 63 int k, n; 64 65 for (k = 0; k < FRAMESAMPLES / 8; k++) { 66 summ[k] = (PSpecQ12[k] + PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5; 67 diff[k] = (PSpecQ12[k] - PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5; 68 } 69 70 sum = 2; 71 for (n = 0; n < FRAMESAMPLES / 8; n++) { 72 sum += summ[n]; 73 } 74 CorrQ7[0] = sum; 75 76 for (k = 0; k < AR_ORDER; k += 2) { 77 sum = 0; 78 CS_ptrQ9 = WebRtcIsac_kCos[k]; 79 for (n = 0; n < FRAMESAMPLES / 8; n++) 80 sum += (CS_ptrQ9[n] * diff[n] + 256) >> 9; 81 CorrQ7[k + 1] = sum; 82 } 83 84 for (k = 1; k < AR_ORDER; k += 2) { 85 sum = 0; 86 CS_ptrQ9 = WebRtcIsac_kCos[k]; 87 for (n = 0; n < FRAMESAMPLES / 8; n++) 88 sum += (CS_ptrQ9[n] * summ[n] + 256) >> 9; 89 CorrQ7[k + 1] = sum; 90 } 91 } 92 93 /* compute inverse AR power spectrum */ 94 /* Changed to the function used in iSAC FIX for compatibility reasons */ 95 static void FindInvArSpec(const int16_t* ARCoefQ12, 96 const int32_t gainQ10, 97 int32_t* CurveQ16) { 98 int32_t CorrQ11[AR_ORDER + 1]; 99 int32_t sum, tmpGain; 100 int32_t diffQ16[FRAMESAMPLES / 8]; 101 const int16_t* CS_ptrQ9; 102 int k, n; 103 int16_t round, shftVal = 0, sh; 104 105 sum = 0; 106 for (n = 0; n < AR_ORDER + 1; n++) { 107 sum += WEBRTC_SPL_MUL(ARCoefQ12[n], ARCoefQ12[n]); /* Q24 */ 108 } 109 sum = ((sum >> 6) * 65 + 32768) >> 16; /* Q8 */ 110 CorrQ11[0] = (sum * gainQ10 + 256) >> 9; 111 112 /* To avoid overflow, we shift down gainQ10 if it is large. 113 * We will not lose any precision */ 114 if (gainQ10 > 400000) { 115 tmpGain = gainQ10 >> 3; 116 round = 32; 117 shftVal = 6; 118 } else { 119 tmpGain = gainQ10; 120 round = 256; 121 shftVal = 9; 122 } 123 124 for (k = 1; k < AR_ORDER + 1; k++) { 125 sum = 16384; 126 for (n = k; n < AR_ORDER + 1; n++) 127 sum += WEBRTC_SPL_MUL(ARCoefQ12[n - k], ARCoefQ12[n]); /* Q24 */ 128 sum >>= 15; 129 CorrQ11[k] = (sum * tmpGain + round) >> shftVal; 130 } 131 sum = CorrQ11[0] << 7; 132 for (n = 0; n < FRAMESAMPLES / 8; n++) { 133 CurveQ16[n] = sum; 134 } 135 for (k = 1; k < AR_ORDER; k += 2) { 136 for (n = 0; n < FRAMESAMPLES / 8; n++) { 137 CurveQ16[n] += (WebRtcIsac_kCos[k][n] * CorrQ11[k + 1] + 2) >> 2; 138 } 139 } 140 141 CS_ptrQ9 = WebRtcIsac_kCos[0]; 142 143 /* If CorrQ11[1] too large we avoid getting overflow in the 144 * calculation by shifting */ 145 sh = WebRtcSpl_NormW32(CorrQ11[1]); 146 if (CorrQ11[1] == 0) { /* Use next correlation */ 147 sh = WebRtcSpl_NormW32(CorrQ11[2]); 148 } 149 if (sh < 9) { 150 shftVal = 9 - sh; 151 } else { 152 shftVal = 0; 153 } 154 for (n = 0; n < FRAMESAMPLES / 8; n++) { 155 diffQ16[n] = (CS_ptrQ9[n] * (CorrQ11[1] >> shftVal) + 2) >> 2; 156 } 157 for (k = 2; k < AR_ORDER; k += 2) { 158 CS_ptrQ9 = WebRtcIsac_kCos[k]; 159 for (n = 0; n < FRAMESAMPLES / 8; n++) { 160 diffQ16[n] += (CS_ptrQ9[n] * (CorrQ11[k + 1] >> shftVal) + 2) >> 2; 161 } 162 } 163 164 for (k = 0; k < FRAMESAMPLES / 8; k++) { 165 CurveQ16[FRAMESAMPLES_QUARTER - 1 - k] = CurveQ16[k] - 166 (diffQ16[k] << shftVal); 167 CurveQ16[k] += diffQ16[k] << shftVal; 168 } 169 } 170 171 /* Generate array of dither samples in Q7. */ 172 static void GenerateDitherQ7Lb(int16_t* bufQ7, uint32_t seed, 173 int length, int16_t AvgPitchGain_Q12) { 174 int k, shft; 175 int16_t dither1_Q7, dither2_Q7, dither_gain_Q14; 176 177 /* This threshold should be equal to that in decode_spec(). */ 178 if (AvgPitchGain_Q12 < 614) { 179 for (k = 0; k < length - 2; k += 3) { 180 /* New random unsigned int. */ 181 seed = (seed * 196314165) + 907633515; 182 183 /* Fixed-point dither sample between -64 and 64 (Q7). */ 184 /* dither = seed * 128 / 4294967295 */ 185 dither1_Q7 = (int16_t)(((int)seed + 16777216) >> 25); 186 187 /* New random unsigned int. */ 188 seed = (seed * 196314165) + 907633515; 189 190 /* Fixed-point dither sample between -64 and 64. */ 191 dither2_Q7 = (int16_t)(((int)seed + 16777216) >> 25); 192 193 shft = (seed >> 25) & 15; 194 if (shft < 5) { 195 bufQ7[k] = dither1_Q7; 196 bufQ7[k + 1] = dither2_Q7; 197 bufQ7[k + 2] = 0; 198 } else if (shft < 10) { 199 bufQ7[k] = dither1_Q7; 200 bufQ7[k + 1] = 0; 201 bufQ7[k + 2] = dither2_Q7; 202 } else { 203 bufQ7[k] = 0; 204 bufQ7[k + 1] = dither1_Q7; 205 bufQ7[k + 2] = dither2_Q7; 206 } 207 } 208 } else { 209 dither_gain_Q14 = (int16_t)(22528 - 10 * AvgPitchGain_Q12); 210 211 /* Dither on half of the coefficients. */ 212 for (k = 0; k < length - 1; k += 2) { 213 /* New random unsigned int */ 214 seed = (seed * 196314165) + 907633515; 215 216 /* Fixed-point dither sample between -64 and 64. */ 217 dither1_Q7 = (int16_t)(((int)seed + 16777216) >> 25); 218 219 /* Dither sample is placed in either even or odd index. */ 220 shft = (seed >> 25) & 1; /* Either 0 or 1 */ 221 222 bufQ7[k + shft] = (((dither_gain_Q14 * dither1_Q7) + 8192) >> 14); 223 bufQ7[k + 1 - shft] = 0; 224 } 225 } 226 } 227 228 229 230 /****************************************************************************** 231 * GenerateDitherQ7LbUB() 232 * 233 * generate array of dither samples in Q7 There are less zeros in dither 234 * vector compared to GenerateDitherQ7Lb. 235 * 236 * A uniform random number generator with the range of [-64 64] is employed 237 * but the generated dithers are scaled by 0.35, a heuristic scaling. 238 * 239 * Input: 240 * -seed : the initial seed for the random number generator. 241 * -length : the number of dither values to be generated. 242 * 243 * Output: 244 * -bufQ7 : pointer to a buffer where dithers are written to. 245 */ 246 static void GenerateDitherQ7LbUB( 247 int16_t* bufQ7, 248 uint32_t seed, 249 int length) { 250 int k; 251 for (k = 0; k < length; k++) { 252 /* new random unsigned int */ 253 seed = (seed * 196314165) + 907633515; 254 255 /* Fixed-point dither sample between -64 and 64 (Q7). */ 256 /* bufQ7 = seed * 128 / 4294967295 */ 257 bufQ7[k] = (int16_t)(((int)seed + 16777216) >> 25); 258 259 /* Scale by 0.35. */ 260 bufQ7[k] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(bufQ7[k], 2048, 13); 261 } 262 } 263 264 /* 265 * Function to decode the complex spectrum from the bit stream 266 * returns the total number of bytes in the stream. 267 */ 268 int WebRtcIsac_DecodeSpec(Bitstr* streamdata, int16_t AvgPitchGain_Q12, 269 enum ISACBand band, double* fr, double* fi) { 270 int16_t DitherQ7[FRAMESAMPLES]; 271 int16_t data[FRAMESAMPLES]; 272 int32_t invARSpec2_Q16[FRAMESAMPLES_QUARTER]; 273 uint16_t invARSpecQ8[FRAMESAMPLES_QUARTER]; 274 int16_t ARCoefQ12[AR_ORDER + 1]; 275 int16_t RCQ15[AR_ORDER]; 276 int16_t gainQ10; 277 int32_t gain2_Q10, res; 278 int32_t in_sqrt; 279 int32_t newRes; 280 int k, len, i; 281 int is_12khz = !kIsSWB12; 282 int num_dft_coeff = FRAMESAMPLES; 283 /* Create dither signal. */ 284 if (band == kIsacLowerBand) { 285 GenerateDitherQ7Lb(DitherQ7, streamdata->W_upper, FRAMESAMPLES, 286 AvgPitchGain_Q12); 287 } else { 288 GenerateDitherQ7LbUB(DitherQ7, streamdata->W_upper, FRAMESAMPLES); 289 if (band == kIsacUpperBand12) { 290 is_12khz = kIsSWB12; 291 num_dft_coeff = FRAMESAMPLES_HALF; 292 } 293 } 294 295 /* Decode model parameters. */ 296 if (WebRtcIsac_DecodeRc(streamdata, RCQ15) < 0) 297 return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 298 299 WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12); 300 301 if (WebRtcIsac_DecodeGain2(streamdata, &gain2_Q10) < 0) 302 return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 303 304 /* Compute inverse AR power spectrum. */ 305 FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16); 306 307 /* Convert to magnitude spectrum, 308 * by doing square-roots (modified from SPLIB). */ 309 res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1); 310 for (k = 0; k < FRAMESAMPLES_QUARTER; k++) { 311 in_sqrt = invARSpec2_Q16[k]; 312 i = 10; 313 314 /* Negative values make no sense for a real sqrt-function. */ 315 if (in_sqrt < 0) 316 in_sqrt = -in_sqrt; 317 318 newRes = (in_sqrt / res + res) >> 1; 319 do { 320 res = newRes; 321 newRes = (in_sqrt / res + res) >> 1; 322 } while (newRes != res && i-- > 0); 323 324 invARSpecQ8[k] = (int16_t)newRes; 325 } 326 327 len = WebRtcIsac_DecLogisticMulti2(data, streamdata, invARSpecQ8, DitherQ7, 328 num_dft_coeff, is_12khz); 329 /* Arithmetic decoding of spectrum. */ 330 if (len < 1) { 331 return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 332 } 333 334 switch (band) { 335 case kIsacLowerBand: { 336 /* Scale down spectral samples with low SNR. */ 337 int32_t p1; 338 int32_t p2; 339 if (AvgPitchGain_Q12 <= 614) { 340 p1 = 30 << 10; 341 p2 = 32768 + (33 << 16); 342 } else { 343 p1 = 36 << 10; 344 p2 = 32768 + (40 << 16); 345 } 346 for (k = 0; k < FRAMESAMPLES; k += 4) { 347 gainQ10 = WebRtcSpl_DivW32W16ResW16(p1, (int16_t)( 348 (invARSpec2_Q16[k >> 2] + p2) >> 16)); 349 *fr++ = (double)((data[ k ] * gainQ10 + 512) >> 10) / 128.0; 350 *fi++ = (double)((data[k + 1] * gainQ10 + 512) >> 10) / 128.0; 351 *fr++ = (double)((data[k + 2] * gainQ10 + 512) >> 10) / 128.0; 352 *fi++ = (double)((data[k + 3] * gainQ10 + 512) >> 10) / 128.0; 353 } 354 break; 355 } 356 case kIsacUpperBand12: { 357 for (k = 0, i = 0; k < FRAMESAMPLES_HALF; k += 4) { 358 fr[i] = (double)data[ k ] / 128.0; 359 fi[i] = (double)data[k + 1] / 128.0; 360 i++; 361 fr[i] = (double)data[k + 2] / 128.0; 362 fi[i] = (double)data[k + 3] / 128.0; 363 i++; 364 } 365 /* The second half of real and imaginary coefficients is zero. This is 366 * due to using the old FFT module which requires two signals as input 367 * while in 0-12 kHz mode we only have 8-12 kHz band, and the second 368 * signal is set to zero. */ 369 memset(&fr[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER * 370 sizeof(double)); 371 memset(&fi[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER * 372 sizeof(double)); 373 break; 374 } 375 case kIsacUpperBand16: { 376 for (i = 0, k = 0; k < FRAMESAMPLES; k += 4, i++) { 377 fr[i] = (double)data[ k ] / 128.0; 378 fi[i] = (double)data[k + 1] / 128.0; 379 fr[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 2] / 128.0; 380 fi[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 3] / 128.0; 381 } 382 break; 383 } 384 } 385 return len; 386 } 387 388 389 int WebRtcIsac_EncodeSpec(const int16_t* fr, const int16_t* fi, 390 int16_t AvgPitchGain_Q12, enum ISACBand band, 391 Bitstr* streamdata) { 392 int16_t ditherQ7[FRAMESAMPLES]; 393 int16_t dataQ7[FRAMESAMPLES]; 394 int32_t PSpec[FRAMESAMPLES_QUARTER]; 395 int32_t invARSpec2_Q16[FRAMESAMPLES_QUARTER]; 396 uint16_t invARSpecQ8[FRAMESAMPLES_QUARTER]; 397 int32_t CorrQ7[AR_ORDER + 1]; 398 int32_t CorrQ7_norm[AR_ORDER + 1]; 399 int16_t RCQ15[AR_ORDER]; 400 int16_t ARCoefQ12[AR_ORDER + 1]; 401 int32_t gain2_Q10; 402 int16_t val; 403 int32_t nrg, res; 404 uint32_t sum; 405 int32_t in_sqrt; 406 int32_t newRes; 407 int16_t err; 408 uint32_t nrg_u32; 409 int shift_var; 410 int k, n, j, i; 411 int is_12khz = !kIsSWB12; 412 int num_dft_coeff = FRAMESAMPLES; 413 414 /* Create dither signal. */ 415 if (band == kIsacLowerBand) { 416 GenerateDitherQ7Lb(ditherQ7, streamdata->W_upper, FRAMESAMPLES, 417 AvgPitchGain_Q12); 418 } else { 419 GenerateDitherQ7LbUB(ditherQ7, streamdata->W_upper, FRAMESAMPLES); 420 if (band == kIsacUpperBand12) { 421 is_12khz = kIsSWB12; 422 num_dft_coeff = FRAMESAMPLES_HALF; 423 } 424 } 425 426 /* add dither and quantize, and compute power spectrum */ 427 switch (band) { 428 case kIsacLowerBand: { 429 for (k = 0; k < FRAMESAMPLES; k += 4) { 430 val = ((*fr++ + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 431 dataQ7[k] = val; 432 sum = val * val; 433 434 val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 435 dataQ7[k + 1] = val; 436 sum += val * val; 437 438 val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2]; 439 dataQ7[k + 2] = val; 440 sum += val * val; 441 442 val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3]; 443 dataQ7[k + 3] = val; 444 sum += val * val; 445 446 PSpec[k >> 2] = sum >> 2; 447 } 448 break; 449 } 450 case kIsacUpperBand12: { 451 for (k = 0, j = 0; k < FRAMESAMPLES_HALF; k += 4) { 452 val = ((*fr++ + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 453 dataQ7[k] = val; 454 sum = val * val; 455 456 val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 457 dataQ7[k + 1] = val; 458 sum += val * val; 459 460 PSpec[j++] = sum >> 1; 461 462 val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2]; 463 dataQ7[k + 2] = val; 464 sum = val * val; 465 466 val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3]; 467 dataQ7[k + 3] = val; 468 sum += val * val; 469 470 PSpec[j++] = sum >> 1; 471 } 472 break; 473 } 474 case kIsacUpperBand16: { 475 for (j = 0, k = 0; k < FRAMESAMPLES; k += 4, j++) { 476 val = ((fr[j] + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 477 dataQ7[k] = val; 478 sum = val * val; 479 480 val = ((fi[j] + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 481 dataQ7[k + 1] = val; 482 sum += val * val; 483 484 val = ((fr[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 2] + 64) & 485 0xFF80) - ditherQ7[k + 2]; 486 dataQ7[k + 2] = val; 487 sum += val * val; 488 489 val = ((fi[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 3] + 64) & 490 0xFF80) - ditherQ7[k + 3]; 491 dataQ7[k + 3] = val; 492 sum += val * val; 493 494 PSpec[k >> 2] = sum >> 2; 495 } 496 break; 497 } 498 } 499 500 /* compute correlation from power spectrum */ 501 FindCorrelation(PSpec, CorrQ7); 502 503 /* Find AR coefficients */ 504 /* Aumber of bit shifts to 14-bit normalize CorrQ7[0] 505 * (leaving room for sign) */ 506 shift_var = WebRtcSpl_NormW32(CorrQ7[0]) - 18; 507 508 if (shift_var > 0) { 509 for (k = 0; k < AR_ORDER + 1; k++) { 510 CorrQ7_norm[k] = CorrQ7[k] << shift_var; 511 } 512 } else { 513 for (k = 0; k < AR_ORDER + 1; k++) { 514 CorrQ7_norm[k] = CorrQ7[k] >> (-shift_var); 515 } 516 } 517 518 /* Find RC coefficients. */ 519 WebRtcSpl_AutoCorrToReflCoef(CorrQ7_norm, AR_ORDER, RCQ15); 520 521 /* Quantize & code RC Coefficient. */ 522 WebRtcIsac_EncodeRc(RCQ15, streamdata); 523 524 /* RC -> AR coefficients */ 525 WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12); 526 527 /* Compute ARCoef' * Corr * ARCoef in Q19. */ 528 nrg = 0; 529 for (j = 0; j <= AR_ORDER; j++) { 530 for (n = 0; n <= j; n++) { 531 nrg += (ARCoefQ12[j] * ((CorrQ7_norm[j - n] * ARCoefQ12[n] + 256) >> 9) + 532 4) >> 3; 533 } 534 for (n = j + 1; n <= AR_ORDER; n++) { 535 nrg += (ARCoefQ12[j] * ((CorrQ7_norm[n - j] * ARCoefQ12[n] + 256) >> 9) + 536 4) >> 3; 537 } 538 } 539 540 nrg_u32 = (uint32_t)nrg; 541 if (shift_var > 0) { 542 nrg_u32 = nrg_u32 >> shift_var; 543 } else { 544 nrg_u32 = nrg_u32 << (-shift_var); 545 } 546 if (nrg_u32 > 0x7FFFFFFF) { 547 nrg = 0x7FFFFFFF; 548 } else { 549 nrg = (int32_t)nrg_u32; 550 } 551 /* Also shifts 31 bits to the left! */ 552 gain2_Q10 = WebRtcSpl_DivResultInQ31(FRAMESAMPLES_QUARTER, nrg); 553 554 /* Quantize & code gain2_Q10. */ 555 if (WebRtcIsac_EncodeGain2(&gain2_Q10, streamdata)) { 556 return -1; 557 } 558 559 /* Compute inverse AR power spectrum. */ 560 FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16); 561 /* Convert to magnitude spectrum, by doing square-roots 562 * (modified from SPLIB). */ 563 res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1); 564 for (k = 0; k < FRAMESAMPLES_QUARTER; k++) { 565 in_sqrt = invARSpec2_Q16[k]; 566 i = 10; 567 /* Negative values make no sense for a real sqrt-function. */ 568 if (in_sqrt < 0) { 569 in_sqrt = -in_sqrt; 570 } 571 newRes = (in_sqrt / res + res) >> 1; 572 do { 573 res = newRes; 574 newRes = (in_sqrt / res + res) >> 1; 575 } while (newRes != res && i-- > 0); 576 577 invARSpecQ8[k] = (int16_t)newRes; 578 } 579 /* arithmetic coding of spectrum */ 580 err = WebRtcIsac_EncLogisticMulti2(streamdata, dataQ7, invARSpecQ8, 581 num_dft_coeff, is_12khz); 582 if (err < 0) { 583 return (err); 584 } 585 return 0; 586 } 587 588 589 /* step-up */ 590 void WebRtcIsac_Rc2Poly(double* RC, int N, double* a) { 591 int m, k; 592 double tmp[MAX_AR_MODEL_ORDER]; 593 594 a[0] = 1.0; 595 tmp[0] = 1.0; 596 for (m = 1; m <= N; m++) { 597 /* copy */ 598 memcpy(&tmp[1], &a[1], (m - 1) * sizeof(double)); 599 a[m] = RC[m - 1]; 600 for (k = 1; k < m; k++) { 601 a[k] += RC[m - 1] * tmp[m - k]; 602 } 603 } 604 return; 605 } 606 607 /* step-down */ 608 void WebRtcIsac_Poly2Rc(double* a, int N, double* RC) { 609 int m, k; 610 double tmp[MAX_AR_MODEL_ORDER]; 611 double tmp_inv; 612 613 RC[N - 1] = a[N]; 614 for (m = N - 1; m > 0; m--) { 615 tmp_inv = 1.0 / (1.0 - RC[m] * RC[m]); 616 for (k = 1; k <= m; k++) { 617 tmp[k] = (a[k] - RC[m] * a[m - k + 1]) * tmp_inv; 618 } 619 620 memcpy(&a[1], &tmp[1], (m - 1) * sizeof(double)); 621 RC[m - 1] = tmp[m]; 622 } 623 return; 624 } 625 626 627 #define MAX_ORDER 100 628 629 /* Matlab's LAR definition */ 630 void WebRtcIsac_Rc2Lar(const double* refc, double* lar, int order) { 631 int k; 632 for (k = 0; k < order; k++) { 633 lar[k] = log((1 + refc[k]) / (1 - refc[k])); 634 } 635 } 636 637 638 void WebRtcIsac_Lar2Rc(const double* lar, double* refc, int order) { 639 int k; 640 double tmp; 641 642 for (k = 0; k < order; k++) { 643 tmp = exp(lar[k]); 644 refc[k] = (tmp - 1) / (tmp + 1); 645 } 646 } 647 648 void WebRtcIsac_Poly2Lar(double* lowband, int orderLo, double* hiband, 649 int orderHi, int Nsub, double* lars) { 650 int k; 651 double rc[MAX_ORDER], *inpl, *inph, *outp; 652 653 inpl = lowband; 654 inph = hiband; 655 outp = lars; 656 for (k = 0; k < Nsub; k++) { 657 /* gains */ 658 outp[0] = inpl[0]; 659 outp[1] = inph[0]; 660 outp += 2; 661 662 /* Low band */ 663 inpl[0] = 1.0; 664 WebRtcIsac_Poly2Rc(inpl, orderLo, rc); 665 WebRtcIsac_Rc2Lar(rc, outp, orderLo); 666 outp += orderLo; 667 668 /* High band */ 669 inph[0] = 1.0; 670 WebRtcIsac_Poly2Rc(inph, orderHi, rc); 671 WebRtcIsac_Rc2Lar(rc, outp, orderHi); 672 outp += orderHi; 673 674 inpl += orderLo + 1; 675 inph += orderHi + 1; 676 } 677 } 678 679 680 int16_t WebRtcIsac_Poly2LarUB(double* lpcVecs, int16_t bandwidth) { 681 double poly[MAX_ORDER]; 682 double rc[MAX_ORDER]; 683 double* ptrIO; 684 int16_t vecCntr; 685 int16_t vecSize; 686 int16_t numVec; 687 688 vecSize = UB_LPC_ORDER; 689 switch (bandwidth) { 690 case isac12kHz: { 691 numVec = UB_LPC_VEC_PER_FRAME; 692 break; 693 } 694 case isac16kHz: { 695 numVec = UB16_LPC_VEC_PER_FRAME; 696 break; 697 } 698 default: 699 return -1; 700 } 701 702 ptrIO = lpcVecs; 703 poly[0] = 1.0; 704 for (vecCntr = 0; vecCntr < numVec; vecCntr++) { 705 memcpy(&poly[1], ptrIO, sizeof(double) * vecSize); 706 WebRtcIsac_Poly2Rc(poly, vecSize, rc); 707 WebRtcIsac_Rc2Lar(rc, ptrIO, vecSize); 708 ptrIO += vecSize; 709 } 710 return 0; 711 } 712 713 714 void WebRtcIsac_Lar2Poly(double* lars, double* lowband, int orderLo, 715 double* hiband, int orderHi, int Nsub) { 716 int k, orderTot; 717 double rc[MAX_ORDER], *outpl, *outph, *inp; 718 719 orderTot = (orderLo + orderHi + 2); 720 outpl = lowband; 721 outph = hiband; 722 /* First two elements of 'inp' store gains*/ 723 inp = lars; 724 for (k = 0; k < Nsub; k++) { 725 /* Low band */ 726 WebRtcIsac_Lar2Rc(&inp[2], rc, orderLo); 727 WebRtcIsac_Rc2Poly(rc, orderLo, outpl); 728 729 /* High band */ 730 WebRtcIsac_Lar2Rc(&inp[orderLo + 2], rc, orderHi); 731 WebRtcIsac_Rc2Poly(rc, orderHi, outph); 732 733 /* gains */ 734 outpl[0] = inp[0]; 735 outph[0] = inp[1]; 736 737 outpl += orderLo + 1; 738 outph += orderHi + 1; 739 inp += orderTot; 740 } 741 } 742 743 /* 744 * assumes 2 LAR vectors interpolates to 'numPolyVec' A-polynomials 745 * Note: 'numPolyVecs' includes the first and the last point of the interval 746 */ 747 void WebRtcIsac_Lar2PolyInterpolUB(double* larVecs, double* percepFilterParams, 748 int numPolyVecs) { 749 int polyCntr, coeffCntr; 750 double larInterpol[UB_LPC_ORDER]; 751 double rc[UB_LPC_ORDER]; 752 double delta[UB_LPC_ORDER]; 753 754 /* calculate the step-size for linear interpolation coefficients */ 755 for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) { 756 delta[coeffCntr] = (larVecs[UB_LPC_ORDER + coeffCntr] - 757 larVecs[coeffCntr]) / (numPolyVecs - 1); 758 } 759 760 for (polyCntr = 0; polyCntr < numPolyVecs; polyCntr++) { 761 for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) { 762 larInterpol[coeffCntr] = larVecs[coeffCntr] + 763 delta[coeffCntr] * polyCntr; 764 } 765 WebRtcIsac_Lar2Rc(larInterpol, rc, UB_LPC_ORDER); 766 767 /* convert to A-polynomial, the following function returns A[0] = 1; 768 * which is written where gains had to be written. Then we write the 769 * gain (outside this function). This way we say a memcpy. */ 770 WebRtcIsac_Rc2Poly(rc, UB_LPC_ORDER, percepFilterParams); 771 percepFilterParams += (UB_LPC_ORDER + 1); 772 } 773 } 774 775 int WebRtcIsac_DecodeLpc(Bitstr* streamdata, double* LPCCoef_lo, 776 double* LPCCoef_hi) { 777 double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE]; 778 int err; 779 780 err = WebRtcIsac_DecodeLpcCoef(streamdata, lars); 781 if (err < 0) { 782 return -ISAC_RANGE_ERROR_DECODE_LPC; 783 } 784 WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, 785 SUBFRAMES); 786 return 0; 787 } 788 789 int16_t WebRtcIsac_DecodeInterpolLpcUb(Bitstr* streamdata, 790 double* percepFilterParams, 791 int16_t bandwidth) { 792 double lpcCoeff[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 793 int err; 794 int interpolCntr; 795 int subframeCntr; 796 int16_t numSegments; 797 int16_t numVecPerSegment; 798 int16_t numGains; 799 800 double percepFilterGains[SUBFRAMES << 1]; 801 double* ptrOutParam = percepFilterParams; 802 803 err = WebRtcIsac_DecodeLpcCoefUB(streamdata, lpcCoeff, percepFilterGains, 804 bandwidth); 805 if (err < 0) { 806 return -ISAC_RANGE_ERROR_DECODE_LPC; 807 } 808 809 switch (bandwidth) { 810 case isac12kHz: { 811 numGains = SUBFRAMES; 812 numSegments = UB_LPC_VEC_PER_FRAME - 1; 813 numVecPerSegment = kLpcVecPerSegmentUb12; 814 break; 815 } 816 case isac16kHz: { 817 numGains = SUBFRAMES << 1; 818 numSegments = UB16_LPC_VEC_PER_FRAME - 1; 819 numVecPerSegment = kLpcVecPerSegmentUb16; 820 break; 821 } 822 default: 823 return -1; 824 } 825 826 for (interpolCntr = 0; interpolCntr < numSegments; interpolCntr++) { 827 WebRtcIsac_Lar2PolyInterpolUB(&lpcCoeff[interpolCntr * UB_LPC_ORDER], 828 ptrOutParam, numVecPerSegment + 1); 829 ptrOutParam += (numVecPerSegment * (UB_LPC_ORDER + 1)); 830 } 831 832 ptrOutParam = percepFilterParams; 833 834 if (bandwidth == isac16kHz) { 835 ptrOutParam += (1 + UB_LPC_ORDER); 836 } 837 838 for (subframeCntr = 0; subframeCntr < numGains; subframeCntr++) { 839 *ptrOutParam = percepFilterGains[subframeCntr]; 840 ptrOutParam += (1 + UB_LPC_ORDER); 841 } 842 return 0; 843 } 844 845 846 /* decode & dequantize LPC Coef */ 847 int WebRtcIsac_DecodeLpcCoef(Bitstr* streamdata, double* LPCCoef) { 848 int j, k, n, pos, pos2, posg, poss, offsg, offss, offs2; 849 int index_g[KLT_ORDER_GAIN], index_s[KLT_ORDER_SHAPE]; 850 double tmpcoeffs_g[KLT_ORDER_GAIN], tmpcoeffs_s[KLT_ORDER_SHAPE]; 851 double tmpcoeffs2_g[KLT_ORDER_GAIN], tmpcoeffs2_s[KLT_ORDER_SHAPE]; 852 double sum; 853 int err; 854 int model = 1; 855 856 /* entropy decoding of model number */ 857 /* We are keeping this for backward compatibility of bit-streams. */ 858 err = WebRtcIsac_DecHistOneStepMulti(&model, streamdata, 859 WebRtcIsac_kQKltModelCdfPtr, 860 WebRtcIsac_kQKltModelInitIndex, 1); 861 if (err < 0) { 862 return err; 863 } 864 /* Only accepted value of model is 0. It is kept in bit-stream for backward 865 * compatibility. */ 866 if (model != 0) { 867 return -ISAC_DISALLOWED_LPC_MODEL; 868 } 869 870 /* entropy decoding of quantization indices */ 871 err = WebRtcIsac_DecHistOneStepMulti( 872 index_s, streamdata, WebRtcIsac_kQKltCdfPtrShape, 873 WebRtcIsac_kQKltInitIndexShape, KLT_ORDER_SHAPE); 874 if (err < 0) { 875 return err; 876 } 877 err = WebRtcIsac_DecHistOneStepMulti( 878 index_g, streamdata, WebRtcIsac_kQKltCdfPtrGain, 879 WebRtcIsac_kQKltInitIndexGain, KLT_ORDER_GAIN); 880 if (err < 0) { 881 return err; 882 } 883 884 /* find quantization levels for coefficients */ 885 for (k = 0; k < KLT_ORDER_SHAPE; k++) { 886 tmpcoeffs_s[k] = 887 WebRtcIsac_kQKltLevelsShape[WebRtcIsac_kQKltOffsetShape[k] + 888 index_s[k]]; 889 } 890 for (k = 0; k < KLT_ORDER_GAIN; k++) { 891 tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[WebRtcIsac_kQKltOffsetGain[k] + 892 index_g[k]]; 893 } 894 895 /* Inverse KLT */ 896 897 /* Left transform, transpose matrix! */ 898 offsg = 0; 899 offss = 0; 900 posg = 0; 901 poss = 0; 902 for (j = 0; j < SUBFRAMES; j++) { 903 offs2 = 0; 904 for (k = 0; k < LPC_GAIN_ORDER; k++) { 905 sum = 0; 906 pos = offsg; 907 pos2 = offs2; 908 for (n = 0; n < LPC_GAIN_ORDER; n++) { 909 sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++]; 910 } 911 tmpcoeffs2_g[posg++] = sum; 912 offs2 += LPC_GAIN_ORDER; 913 } 914 offs2 = 0; 915 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 916 sum = 0; 917 pos = offss; 918 pos2 = offs2; 919 for (n = 0; n < LPC_SHAPE_ORDER; n++) { 920 sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++]; 921 } 922 tmpcoeffs2_s[poss++] = sum; 923 offs2 += LPC_SHAPE_ORDER; 924 } 925 offsg += LPC_GAIN_ORDER; 926 offss += LPC_SHAPE_ORDER; 927 } 928 929 /* Right transform, transpose matrix */ 930 offsg = 0; 931 offss = 0; 932 posg = 0; 933 poss = 0; 934 for (j = 0; j < SUBFRAMES; j++) { 935 posg = offsg; 936 for (k = 0; k < LPC_GAIN_ORDER; k++) { 937 sum = 0; 938 pos = k; 939 pos2 = j; 940 for (n = 0; n < SUBFRAMES; n++) { 941 sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2]; 942 pos += LPC_GAIN_ORDER; 943 pos2 += SUBFRAMES; 944 945 } 946 tmpcoeffs_g[posg++] = sum; 947 } 948 poss = offss; 949 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 950 sum = 0; 951 pos = k; 952 pos2 = j; 953 for (n = 0; n < SUBFRAMES; n++) { 954 sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2]; 955 pos += LPC_SHAPE_ORDER; 956 pos2 += SUBFRAMES; 957 } 958 tmpcoeffs_s[poss++] = sum; 959 } 960 offsg += LPC_GAIN_ORDER; 961 offss += LPC_SHAPE_ORDER; 962 } 963 964 /* scaling, mean addition, and gain restoration */ 965 posg = 0; 966 poss = 0; 967 pos = 0; 968 for (k = 0; k < SUBFRAMES; k++) { 969 /* log gains */ 970 LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 971 LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg]; 972 LPCCoef[pos] = exp(LPCCoef[pos]); 973 pos++; 974 posg++; 975 LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 976 LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg]; 977 LPCCoef[pos] = exp(LPCCoef[pos]); 978 pos++; 979 posg++; 980 981 /* Low-band LAR coefficients. */ 982 for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) { 983 LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE; 984 LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 985 } 986 987 /* High-band LAR coefficients. */ 988 for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) { 989 LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE; 990 LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 991 } 992 } 993 return 0; 994 } 995 996 /* Encode LPC in LAR domain. */ 997 void WebRtcIsac_EncodeLar(double* LPCCoef, Bitstr* streamdata, 998 IsacSaveEncoderData* encData) { 999 int j, k, n, pos, pos2, poss, offss, offs2; 1000 int index_s[KLT_ORDER_SHAPE]; 1001 int index_ovr_s[KLT_ORDER_SHAPE]; 1002 double tmpcoeffs_s[KLT_ORDER_SHAPE]; 1003 double tmpcoeffs2_s[KLT_ORDER_SHAPE]; 1004 double sum; 1005 const int kModel = 0; 1006 1007 /* Mean removal and scaling. */ 1008 poss = 0; 1009 pos = 0; 1010 for (k = 0; k < SUBFRAMES; k++) { 1011 /* First two element are gains, move over them. */ 1012 pos += 2; 1013 1014 /* Low-band LAR coefficients. */ 1015 for (n = 0; n < LPC_LOBAND_ORDER; n++, poss++, pos++) { 1016 tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss]; 1017 tmpcoeffs_s[poss] *= LPC_LOBAND_SCALE; 1018 } 1019 1020 /* High-band LAR coefficients. */ 1021 for (n = 0; n < LPC_HIBAND_ORDER; n++, poss++, pos++) { 1022 tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss]; 1023 tmpcoeffs_s[poss] *= LPC_HIBAND_SCALE; 1024 } 1025 } 1026 1027 /* KLT */ 1028 1029 /* Left transform. */ 1030 offss = 0; 1031 for (j = 0; j < SUBFRAMES; j++) { 1032 poss = offss; 1033 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 1034 sum = 0; 1035 pos = offss; 1036 pos2 = k; 1037 for (n = 0; n < LPC_SHAPE_ORDER; n++) { 1038 sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2]; 1039 pos2 += LPC_SHAPE_ORDER; 1040 } 1041 tmpcoeffs2_s[poss++] = sum; 1042 } 1043 offss += LPC_SHAPE_ORDER; 1044 } 1045 1046 /* Right transform. */ 1047 offss = 0; 1048 offs2 = 0; 1049 for (j = 0; j < SUBFRAMES; j++) { 1050 poss = offss; 1051 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 1052 sum = 0; 1053 pos = k; 1054 pos2 = offs2; 1055 for (n = 0; n < SUBFRAMES; n++) { 1056 sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2++]; 1057 pos += LPC_SHAPE_ORDER; 1058 } 1059 tmpcoeffs_s[poss++] = sum; 1060 } 1061 offs2 += SUBFRAMES; 1062 offss += LPC_SHAPE_ORDER; 1063 } 1064 1065 /* Quantize coefficients. */ 1066 for (k = 0; k < KLT_ORDER_SHAPE; k++) { 1067 index_s[k] = (WebRtcIsac_lrint(tmpcoeffs_s[k] / KLT_STEPSIZE)) + 1068 WebRtcIsac_kQKltQuantMinShape[k]; 1069 if (index_s[k] < 0) { 1070 index_s[k] = 0; 1071 } else if (index_s[k] > WebRtcIsac_kQKltMaxIndShape[k]) { 1072 index_s[k] = WebRtcIsac_kQKltMaxIndShape[k]; 1073 } 1074 index_ovr_s[k] = WebRtcIsac_kQKltOffsetShape[k] + index_s[k]; 1075 } 1076 1077 1078 /* Only one model remains in this version of the code, kModel = 0. We 1079 * are keeping for bit-streams to be backward compatible. */ 1080 /* entropy coding of model number */ 1081 WebRtcIsac_EncHistMulti(streamdata, &kModel, WebRtcIsac_kQKltModelCdfPtr, 1); 1082 1083 /* Save data for creation of multiple bit streams */ 1084 /* Entropy coding of quantization indices - shape only. */ 1085 WebRtcIsac_EncHistMulti(streamdata, index_s, WebRtcIsac_kQKltCdfPtrShape, 1086 KLT_ORDER_SHAPE); 1087 1088 /* Save data for creation of multiple bit streams. */ 1089 for (k = 0; k < KLT_ORDER_SHAPE; k++) { 1090 encData->LPCindex_s[KLT_ORDER_SHAPE * encData->startIdx + k] = index_s[k]; 1091 } 1092 1093 /* Find quantization levels for shape coefficients. */ 1094 for (k = 0; k < KLT_ORDER_SHAPE; k++) { 1095 tmpcoeffs_s[k] = WebRtcIsac_kQKltLevelsShape[index_ovr_s[k]]; 1096 } 1097 /* Inverse KLT. */ 1098 /* Left transform, transpose matrix.! */ 1099 offss = 0; 1100 poss = 0; 1101 for (j = 0; j < SUBFRAMES; j++) { 1102 offs2 = 0; 1103 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 1104 sum = 0; 1105 pos = offss; 1106 pos2 = offs2; 1107 for (n = 0; n < LPC_SHAPE_ORDER; n++) { 1108 sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++]; 1109 } 1110 tmpcoeffs2_s[poss++] = sum; 1111 offs2 += LPC_SHAPE_ORDER; 1112 } 1113 offss += LPC_SHAPE_ORDER; 1114 } 1115 1116 /* Right transform, Transpose matrix */ 1117 offss = 0; 1118 poss = 0; 1119 for (j = 0; j < SUBFRAMES; j++) { 1120 poss = offss; 1121 for (k = 0; k < LPC_SHAPE_ORDER; k++) { 1122 sum = 0; 1123 pos = k; 1124 pos2 = j; 1125 for (n = 0; n < SUBFRAMES; n++) { 1126 sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2]; 1127 pos += LPC_SHAPE_ORDER; 1128 pos2 += SUBFRAMES; 1129 } 1130 tmpcoeffs_s[poss++] = sum; 1131 } 1132 offss += LPC_SHAPE_ORDER; 1133 } 1134 1135 /* Scaling, mean addition, and gain restoration. */ 1136 poss = 0; 1137 pos = 0; 1138 for (k = 0; k < SUBFRAMES; k++) { 1139 /* Ignore gains. */ 1140 pos += 2; 1141 1142 /* Low band LAR coefficients. */ 1143 for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) { 1144 LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE; 1145 LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 1146 } 1147 1148 /* High band LAR coefficients. */ 1149 for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) { 1150 LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE; 1151 LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 1152 } 1153 } 1154 } 1155 1156 1157 void WebRtcIsac_EncodeLpcLb(double* LPCCoef_lo, double* LPCCoef_hi, 1158 Bitstr* streamdata, IsacSaveEncoderData* encData) { 1159 double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE]; 1160 int k; 1161 1162 WebRtcIsac_Poly2Lar(LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, SUBFRAMES, 1163 lars); 1164 WebRtcIsac_EncodeLar(lars, streamdata, encData); 1165 WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, 1166 SUBFRAMES); 1167 /* Save data for creation of multiple bit streams (and transcoding). */ 1168 for (k = 0; k < (ORDERLO + 1)*SUBFRAMES; k++) { 1169 encData->LPCcoeffs_lo[(ORDERLO + 1)*SUBFRAMES * encData->startIdx + k] = 1170 LPCCoef_lo[k]; 1171 } 1172 for (k = 0; k < (ORDERHI + 1)*SUBFRAMES; k++) { 1173 encData->LPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * encData->startIdx + k] = 1174 LPCCoef_hi[k]; 1175 } 1176 } 1177 1178 1179 int16_t WebRtcIsac_EncodeLpcUB(double* lpcVecs, Bitstr* streamdata, 1180 double* interpolLPCCoeff, 1181 int16_t bandwidth, 1182 ISACUBSaveEncDataStruct* encData) { 1183 double U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 1184 int idx[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 1185 int interpolCntr; 1186 1187 WebRtcIsac_Poly2LarUB(lpcVecs, bandwidth); 1188 WebRtcIsac_RemoveLarMean(lpcVecs, bandwidth); 1189 WebRtcIsac_DecorrelateIntraVec(lpcVecs, U, bandwidth); 1190 WebRtcIsac_DecorrelateInterVec(U, lpcVecs, bandwidth); 1191 WebRtcIsac_QuantizeUncorrLar(lpcVecs, idx, bandwidth); 1192 1193 WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth); 1194 WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth); 1195 WebRtcIsac_AddLarMean(lpcVecs, bandwidth); 1196 1197 switch (bandwidth) { 1198 case isac12kHz: { 1199 /* Store the indices to be used for multiple encoding. */ 1200 memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER * 1201 UB_LPC_VEC_PER_FRAME * sizeof(int)); 1202 WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb12, 1203 UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME); 1204 for (interpolCntr = 0; interpolCntr < UB_INTERPOL_SEGMENTS; 1205 interpolCntr++) { 1206 WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff, 1207 kLpcVecPerSegmentUb12 + 1); 1208 lpcVecs += UB_LPC_ORDER; 1209 interpolLPCCoeff += (kLpcVecPerSegmentUb12 * (UB_LPC_ORDER + 1)); 1210 } 1211 break; 1212 } 1213 case isac16kHz: { 1214 /* Store the indices to be used for multiple encoding. */ 1215 memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER * 1216 UB16_LPC_VEC_PER_FRAME * sizeof(int)); 1217 WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb16, 1218 UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME); 1219 for (interpolCntr = 0; interpolCntr < UB16_INTERPOL_SEGMENTS; 1220 interpolCntr++) { 1221 WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff, 1222 kLpcVecPerSegmentUb16 + 1); 1223 lpcVecs += UB_LPC_ORDER; 1224 interpolLPCCoeff += (kLpcVecPerSegmentUb16 * (UB_LPC_ORDER + 1)); 1225 } 1226 break; 1227 } 1228 default: 1229 return -1; 1230 } 1231 return 0; 1232 } 1233 1234 void WebRtcIsac_EncodeLpcGainLb(double* LPCCoef_lo, double* LPCCoef_hi, 1235 Bitstr* streamdata, 1236 IsacSaveEncoderData* encData) { 1237 int j, k, n, pos, pos2, posg, offsg, offs2; 1238 int index_g[KLT_ORDER_GAIN]; 1239 int index_ovr_g[KLT_ORDER_GAIN]; 1240 double tmpcoeffs_g[KLT_ORDER_GAIN]; 1241 double tmpcoeffs2_g[KLT_ORDER_GAIN]; 1242 double sum; 1243 /* log gains, mean removal and scaling */ 1244 posg = 0; 1245 for (k = 0; k < SUBFRAMES; k++) { 1246 tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]); 1247 tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 1248 tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 1249 posg++; 1250 tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]); 1251 tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 1252 tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 1253 posg++; 1254 } 1255 1256 /* KLT */ 1257 1258 /* Left transform. */ 1259 offsg = 0; 1260 for (j = 0; j < SUBFRAMES; j++) { 1261 posg = offsg; 1262 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1263 sum = 0; 1264 pos = offsg; 1265 pos2 = k; 1266 for (n = 0; n < LPC_GAIN_ORDER; n++) { 1267 sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2]; 1268 pos2 += LPC_GAIN_ORDER; 1269 } 1270 tmpcoeffs2_g[posg++] = sum; 1271 } 1272 offsg += LPC_GAIN_ORDER; 1273 } 1274 1275 /* Right transform. */ 1276 offsg = 0; 1277 offs2 = 0; 1278 for (j = 0; j < SUBFRAMES; j++) { 1279 posg = offsg; 1280 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1281 sum = 0; 1282 pos = k; 1283 pos2 = offs2; 1284 for (n = 0; n < SUBFRAMES; n++) { 1285 sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++]; 1286 pos += LPC_GAIN_ORDER; 1287 } 1288 tmpcoeffs_g[posg++] = sum; 1289 } 1290 offs2 += SUBFRAMES; 1291 offsg += LPC_GAIN_ORDER; 1292 } 1293 1294 /* Quantize coefficients. */ 1295 for (k = 0; k < KLT_ORDER_GAIN; k++) { 1296 /* Get index. */ 1297 pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE); 1298 index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k]; 1299 if (index_g[k] < 0) { 1300 index_g[k] = 0; 1301 } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) { 1302 index_g[k] = WebRtcIsac_kQKltMaxIndGain[k]; 1303 } 1304 index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k]; 1305 1306 /* Find quantization levels for coefficients. */ 1307 tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]]; 1308 1309 /* Save data for creation of multiple bit streams. */ 1310 encData->LPCindex_g[KLT_ORDER_GAIN * encData->startIdx + k] = index_g[k]; 1311 } 1312 1313 /* Entropy coding of quantization indices - gain. */ 1314 WebRtcIsac_EncHistMulti(streamdata, index_g, WebRtcIsac_kQKltCdfPtrGain, 1315 KLT_ORDER_GAIN); 1316 1317 /* Find quantization levels for coefficients. */ 1318 /* Left transform. */ 1319 offsg = 0; 1320 posg = 0; 1321 for (j = 0; j < SUBFRAMES; j++) { 1322 offs2 = 0; 1323 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1324 sum = 0; 1325 pos = offsg; 1326 pos2 = offs2; 1327 for (n = 0; n < LPC_GAIN_ORDER; n++) 1328 sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++]; 1329 tmpcoeffs2_g[posg++] = sum; 1330 offs2 += LPC_GAIN_ORDER; 1331 } 1332 offsg += LPC_GAIN_ORDER; 1333 } 1334 1335 /* Right transform, transpose matrix. */ 1336 offsg = 0; 1337 posg = 0; 1338 for (j = 0; j < SUBFRAMES; j++) { 1339 posg = offsg; 1340 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1341 sum = 0; 1342 pos = k; 1343 pos2 = j; 1344 for (n = 0; n < SUBFRAMES; n++) { 1345 sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2]; 1346 pos += LPC_GAIN_ORDER; 1347 pos2 += SUBFRAMES; 1348 } 1349 tmpcoeffs_g[posg++] = sum; 1350 } 1351 offsg += LPC_GAIN_ORDER; 1352 } 1353 1354 1355 /* Scaling, mean addition, and gain restoration. */ 1356 posg = 0; 1357 for (k = 0; k < SUBFRAMES; k++) { 1358 sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 1359 sum += WebRtcIsac_kLpcMeansGain[posg]; 1360 LPCCoef_lo[k * (LPC_LOBAND_ORDER + 1)] = exp(sum); 1361 pos++; 1362 posg++; 1363 sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 1364 sum += WebRtcIsac_kLpcMeansGain[posg]; 1365 LPCCoef_hi[k * (LPC_HIBAND_ORDER + 1)] = exp(sum); 1366 pos++; 1367 posg++; 1368 } 1369 1370 } 1371 1372 void WebRtcIsac_EncodeLpcGainUb(double* lpGains, Bitstr* streamdata, 1373 int* lpcGainIndex) { 1374 double U[UB_LPC_GAIN_DIM]; 1375 int idx[UB_LPC_GAIN_DIM]; 1376 WebRtcIsac_ToLogDomainRemoveMean(lpGains); 1377 WebRtcIsac_DecorrelateLPGain(lpGains, U); 1378 WebRtcIsac_QuantizeLpcGain(U, idx); 1379 /* Store the index for re-encoding for FEC. */ 1380 memcpy(lpcGainIndex, idx, UB_LPC_GAIN_DIM * sizeof(int)); 1381 WebRtcIsac_CorrelateLpcGain(U, lpGains); 1382 WebRtcIsac_AddMeanToLinearDomain(lpGains); 1383 WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat, 1384 UB_LPC_GAIN_DIM); 1385 } 1386 1387 1388 void WebRtcIsac_StoreLpcGainUb(double* lpGains, Bitstr* streamdata) { 1389 double U[UB_LPC_GAIN_DIM]; 1390 int idx[UB_LPC_GAIN_DIM]; 1391 WebRtcIsac_ToLogDomainRemoveMean(lpGains); 1392 WebRtcIsac_DecorrelateLPGain(lpGains, U); 1393 WebRtcIsac_QuantizeLpcGain(U, idx); 1394 WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat, 1395 UB_LPC_GAIN_DIM); 1396 } 1397 1398 1399 1400 int16_t WebRtcIsac_DecodeLpcGainUb(double* lpGains, Bitstr* streamdata) { 1401 double U[UB_LPC_GAIN_DIM]; 1402 int idx[UB_LPC_GAIN_DIM]; 1403 int err; 1404 err = WebRtcIsac_DecHistOneStepMulti(idx, streamdata, 1405 WebRtcIsac_kLpcGainCdfMat, 1406 WebRtcIsac_kLpcGainEntropySearch, 1407 UB_LPC_GAIN_DIM); 1408 if (err < 0) { 1409 return -1; 1410 } 1411 WebRtcIsac_DequantizeLpcGain(idx, U); 1412 WebRtcIsac_CorrelateLpcGain(U, lpGains); 1413 WebRtcIsac_AddMeanToLinearDomain(lpGains); 1414 return 0; 1415 } 1416 1417 1418 1419 /* decode & dequantize RC */ 1420 int WebRtcIsac_DecodeRc(Bitstr* streamdata, int16_t* RCQ15) { 1421 int k, err; 1422 int index[AR_ORDER]; 1423 1424 /* entropy decoding of quantization indices */ 1425 err = WebRtcIsac_DecHistOneStepMulti(index, streamdata, 1426 WebRtcIsac_kQArRcCdfPtr, 1427 WebRtcIsac_kQArRcInitIndex, AR_ORDER); 1428 if (err < 0) 1429 return err; 1430 1431 /* find quantization levels for reflection coefficients */ 1432 for (k = 0; k < AR_ORDER; k++) { 1433 RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]); 1434 } 1435 return 0; 1436 } 1437 1438 1439 /* quantize & code RC */ 1440 void WebRtcIsac_EncodeRc(int16_t* RCQ15, Bitstr* streamdata) { 1441 int k; 1442 int index[AR_ORDER]; 1443 1444 /* quantize reflection coefficients (add noise feedback?) */ 1445 for (k = 0; k < AR_ORDER; k++) { 1446 index[k] = WebRtcIsac_kQArRcInitIndex[k]; 1447 // The safe-guards in following while conditions are to suppress gcc 4.8.3 1448 // warnings, Issue 2888. Otherwise, first and last elements of 1449 // |WebRtcIsac_kQArBoundaryLevels| are such that the following search 1450 // *never* cause an out-of-boundary read. 1451 if (RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k]]) { 1452 while (index[k] + 1 < NUM_AR_RC_QUANT_BAUNDARY && 1453 RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k] + 1]) { 1454 index[k]++; 1455 } 1456 } else { 1457 while (index[k] > 0 && 1458 RCQ15[k] < WebRtcIsac_kQArBoundaryLevels[--index[k]]) ; 1459 } 1460 RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]); 1461 } 1462 1463 /* entropy coding of quantization indices */ 1464 WebRtcIsac_EncHistMulti(streamdata, index, WebRtcIsac_kQArRcCdfPtr, AR_ORDER); 1465 } 1466 1467 1468 /* decode & dequantize squared Gain */ 1469 int WebRtcIsac_DecodeGain2(Bitstr* streamdata, int32_t* gainQ10) { 1470 int index, err; 1471 1472 /* entropy decoding of quantization index */ 1473 err = WebRtcIsac_DecHistOneStepMulti(&index, streamdata, 1474 WebRtcIsac_kQGainCdf_ptr, 1475 WebRtcIsac_kQGainInitIndex, 1); 1476 if (err < 0) { 1477 return err; 1478 } 1479 /* find quantization level */ 1480 *gainQ10 = WebRtcIsac_kQGain2Levels[index]; 1481 return 0; 1482 } 1483 1484 1485 /* quantize & code squared Gain */ 1486 int WebRtcIsac_EncodeGain2(int32_t* gainQ10, Bitstr* streamdata) { 1487 int index; 1488 1489 /* find quantization index */ 1490 index = WebRtcIsac_kQGainInitIndex[0]; 1491 if (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index]) { 1492 while (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index + 1]) { 1493 index++; 1494 } 1495 } else { 1496 while (*gainQ10 < WebRtcIsac_kQGain2BoundaryLevels[--index]) ; 1497 } 1498 /* De-quantize */ 1499 *gainQ10 = WebRtcIsac_kQGain2Levels[index]; 1500 1501 /* entropy coding of quantization index */ 1502 WebRtcIsac_EncHistMulti(streamdata, &index, WebRtcIsac_kQGainCdf_ptr, 1); 1503 return 0; 1504 } 1505 1506 1507 /* code and decode Pitch Gains and Lags functions */ 1508 1509 /* decode & dequantize Pitch Gains */ 1510 int WebRtcIsac_DecodePitchGain(Bitstr* streamdata, 1511 int16_t* PitchGains_Q12) { 1512 int index_comb, err; 1513 const uint16_t* WebRtcIsac_kQPitchGainCdf_ptr[1]; 1514 1515 /* Entropy decoding of quantization indices */ 1516 *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf; 1517 err = WebRtcIsac_DecHistBisectMulti(&index_comb, streamdata, 1518 WebRtcIsac_kQPitchGainCdf_ptr, 1519 WebRtcIsac_kQCdfTableSizeGain, 1); 1520 /* Error check, Q_mean_Gain.. tables are of size 144 */ 1521 if ((err < 0) || (index_comb < 0) || (index_comb >= 144)) { 1522 return -ISAC_RANGE_ERROR_DECODE_PITCH_GAIN; 1523 } 1524 /* De-quantize back to pitch gains by table look-up. */ 1525 PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb]; 1526 PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb]; 1527 PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb]; 1528 PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb]; 1529 return 0; 1530 } 1531 1532 1533 /* Quantize & code Pitch Gains. */ 1534 void WebRtcIsac_EncodePitchGain(int16_t* PitchGains_Q12, 1535 Bitstr* streamdata, 1536 IsacSaveEncoderData* encData) { 1537 int k, j; 1538 double C; 1539 double S[PITCH_SUBFRAMES]; 1540 int index[3]; 1541 int index_comb; 1542 const uint16_t* WebRtcIsac_kQPitchGainCdf_ptr[1]; 1543 double PitchGains[PITCH_SUBFRAMES] = {0, 0, 0, 0}; 1544 1545 /* Take the asin. */ 1546 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1547 PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096; 1548 S[k] = asin(PitchGains[k]); 1549 } 1550 1551 /* Find quantization index; only for the first three 1552 * transform coefficients. */ 1553 for (k = 0; k < 3; k++) { 1554 /* transform */ 1555 C = 0.0; 1556 for (j = 0; j < PITCH_SUBFRAMES; j++) { 1557 C += WebRtcIsac_kTransform[k][j] * S[j]; 1558 } 1559 /* Quantize */ 1560 index[k] = WebRtcIsac_lrint(C / PITCH_GAIN_STEPSIZE); 1561 1562 /* Check that the index is not outside the boundaries of the table. */ 1563 if (index[k] < WebRtcIsac_kIndexLowerLimitGain[k]) { 1564 index[k] = WebRtcIsac_kIndexLowerLimitGain[k]; 1565 } else if (index[k] > WebRtcIsac_kIndexUpperLimitGain[k]) { 1566 index[k] = WebRtcIsac_kIndexUpperLimitGain[k]; 1567 } 1568 index[k] -= WebRtcIsac_kIndexLowerLimitGain[k]; 1569 } 1570 1571 /* Calculate unique overall index. */ 1572 index_comb = WebRtcIsac_kIndexMultsGain[0] * index[0] + 1573 WebRtcIsac_kIndexMultsGain[1] * index[1] + index[2]; 1574 1575 /* unquantize back to pitch gains by table look-up */ 1576 PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb]; 1577 PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb]; 1578 PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb]; 1579 PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb]; 1580 1581 /* entropy coding of quantization pitch gains */ 1582 *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf; 1583 WebRtcIsac_EncHistMulti(streamdata, &index_comb, 1584 WebRtcIsac_kQPitchGainCdf_ptr, 1); 1585 encData->pitchGain_index[encData->startIdx] = index_comb; 1586 } 1587 1588 1589 1590 /* Pitch LAG */ 1591 /* Decode & de-quantize Pitch Lags. */ 1592 int WebRtcIsac_DecodePitchLag(Bitstr* streamdata, int16_t* PitchGain_Q12, 1593 double* PitchLags) { 1594 int k, err; 1595 double StepSize; 1596 double C; 1597 int index[PITCH_SUBFRAMES]; 1598 double mean_gain; 1599 const double* mean_val2, *mean_val3, *mean_val4; 1600 const int16_t* lower_limit; 1601 const uint16_t* init_index; 1602 const uint16_t* cdf_size; 1603 const uint16_t** cdf; 1604 double PitchGain[4] = {0, 0, 0, 0}; 1605 1606 /* compute mean pitch gain */ 1607 mean_gain = 0.0; 1608 for (k = 0; k < 4; k++) { 1609 PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096; 1610 mean_gain += PitchGain[k]; 1611 } 1612 mean_gain /= 4.0; 1613 1614 /* voicing classification. */ 1615 if (mean_gain < 0.2) { 1616 StepSize = WebRtcIsac_kQPitchLagStepsizeLo; 1617 cdf = WebRtcIsac_kQPitchLagCdfPtrLo; 1618 cdf_size = WebRtcIsac_kQPitchLagCdfSizeLo; 1619 mean_val2 = WebRtcIsac_kQMeanLag2Lo; 1620 mean_val3 = WebRtcIsac_kQMeanLag3Lo; 1621 mean_val4 = WebRtcIsac_kQMeanLag4Lo; 1622 lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo; 1623 init_index = WebRtcIsac_kQInitIndexLagLo; 1624 } else if (mean_gain < 0.4) { 1625 StepSize = WebRtcIsac_kQPitchLagStepsizeMid; 1626 cdf = WebRtcIsac_kQPitchLagCdfPtrMid; 1627 cdf_size = WebRtcIsac_kQPitchLagCdfSizeMid; 1628 mean_val2 = WebRtcIsac_kQMeanLag2Mid; 1629 mean_val3 = WebRtcIsac_kQMeanLag3Mid; 1630 mean_val4 = WebRtcIsac_kQMeanLag4Mid; 1631 lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid; 1632 init_index = WebRtcIsac_kQInitIndexLagMid; 1633 } else { 1634 StepSize = WebRtcIsac_kQPitchLagStepsizeHi; 1635 cdf = WebRtcIsac_kQPitchLagCdfPtrHi; 1636 cdf_size = WebRtcIsac_kQPitchLagCdfSizeHi; 1637 mean_val2 = WebRtcIsac_kQMeanLag2Hi; 1638 mean_val3 = WebRtcIsac_kQMeanLag3Hi; 1639 mean_val4 = WebRtcIsac_kQMeanLag4Hi; 1640 lower_limit = WebRtcIsac_kQindexLowerLimitLagHi; 1641 init_index = WebRtcIsac_kQInitIndexLagHi; 1642 } 1643 1644 /* Entropy decoding of quantization indices. */ 1645 err = WebRtcIsac_DecHistBisectMulti(index, streamdata, cdf, cdf_size, 1); 1646 if ((err < 0) || (index[0] < 0)) { 1647 return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG; 1648 } 1649 err = WebRtcIsac_DecHistOneStepMulti(index + 1, streamdata, cdf + 1, 1650 init_index, 3); 1651 if (err < 0) { 1652 return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG; 1653 } 1654 1655 /* Unquantize back to transform coefficients and do the inverse transform: 1656 * S = T'*C. */ 1657 C = (index[0] + lower_limit[0]) * StepSize; 1658 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1659 PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C; 1660 } 1661 C = mean_val2[index[1]]; 1662 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1663 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C; 1664 } 1665 C = mean_val3[index[2]]; 1666 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1667 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C; 1668 } 1669 C = mean_val4[index[3]]; 1670 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1671 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C; 1672 } 1673 return 0; 1674 } 1675 1676 1677 1678 /* Quantize & code pitch lags. */ 1679 void WebRtcIsac_EncodePitchLag(double* PitchLags, int16_t* PitchGain_Q12, 1680 Bitstr* streamdata, 1681 IsacSaveEncoderData* encData) { 1682 int k, j; 1683 double StepSize; 1684 double C; 1685 int index[PITCH_SUBFRAMES]; 1686 double mean_gain; 1687 const double* mean_val2, *mean_val3, *mean_val4; 1688 const int16_t* lower_limit, *upper_limit; 1689 const uint16_t** cdf; 1690 double PitchGain[4] = {0, 0, 0, 0}; 1691 1692 /* compute mean pitch gain */ 1693 mean_gain = 0.0; 1694 for (k = 0; k < 4; k++) { 1695 PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096; 1696 mean_gain += PitchGain[k]; 1697 } 1698 mean_gain /= 4.0; 1699 1700 /* Save data for creation of multiple bit streams */ 1701 encData->meanGain[encData->startIdx] = mean_gain; 1702 1703 /* Voicing classification. */ 1704 if (mean_gain < 0.2) { 1705 StepSize = WebRtcIsac_kQPitchLagStepsizeLo; 1706 cdf = WebRtcIsac_kQPitchLagCdfPtrLo; 1707 mean_val2 = WebRtcIsac_kQMeanLag2Lo; 1708 mean_val3 = WebRtcIsac_kQMeanLag3Lo; 1709 mean_val4 = WebRtcIsac_kQMeanLag4Lo; 1710 lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo; 1711 upper_limit = WebRtcIsac_kQIndexUpperLimitLagLo; 1712 } else if (mean_gain < 0.4) { 1713 StepSize = WebRtcIsac_kQPitchLagStepsizeMid; 1714 cdf = WebRtcIsac_kQPitchLagCdfPtrMid; 1715 mean_val2 = WebRtcIsac_kQMeanLag2Mid; 1716 mean_val3 = WebRtcIsac_kQMeanLag3Mid; 1717 mean_val4 = WebRtcIsac_kQMeanLag4Mid; 1718 lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid; 1719 upper_limit = WebRtcIsac_kQIndexUpperLimitLagMid; 1720 } else { 1721 StepSize = WebRtcIsac_kQPitchLagStepsizeHi; 1722 cdf = WebRtcIsac_kQPitchLagCdfPtrHi; 1723 mean_val2 = WebRtcIsac_kQMeanLag2Hi; 1724 mean_val3 = WebRtcIsac_kQMeanLag3Hi; 1725 mean_val4 = WebRtcIsac_kQMeanLag4Hi; 1726 lower_limit = WebRtcIsac_kQindexLowerLimitLagHi; 1727 upper_limit = WebRtcIsac_kQindexUpperLimitLagHi; 1728 } 1729 1730 /* find quantization index */ 1731 for (k = 0; k < 4; k++) { 1732 /* transform */ 1733 C = 0.0; 1734 for (j = 0; j < PITCH_SUBFRAMES; j++) { 1735 C += WebRtcIsac_kTransform[k][j] * PitchLags[j]; 1736 } 1737 /* quantize */ 1738 index[k] = WebRtcIsac_lrint(C / StepSize); 1739 1740 /* check that the index is not outside the boundaries of the table */ 1741 if (index[k] < lower_limit[k]) { 1742 index[k] = lower_limit[k]; 1743 } else if (index[k] > upper_limit[k]) index[k] = upper_limit[k]; { 1744 index[k] -= lower_limit[k]; 1745 } 1746 /* Save data for creation of multiple bit streams */ 1747 encData->pitchIndex[PITCH_SUBFRAMES * encData->startIdx + k] = index[k]; 1748 } 1749 1750 /* Un-quantize back to transform coefficients and do the inverse transform: 1751 * S = T'*C */ 1752 C = (index[0] + lower_limit[0]) * StepSize; 1753 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1754 PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C; 1755 } 1756 C = mean_val2[index[1]]; 1757 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1758 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C; 1759 } 1760 C = mean_val3[index[2]]; 1761 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1762 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C; 1763 } 1764 C = mean_val4[index[3]]; 1765 for (k = 0; k < PITCH_SUBFRAMES; k++) { 1766 PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C; 1767 } 1768 /* entropy coding of quantization pitch lags */ 1769 WebRtcIsac_EncHistMulti(streamdata, index, cdf, PITCH_SUBFRAMES); 1770 } 1771 1772 1773 1774 /* Routines for in-band signaling of bandwidth estimation */ 1775 /* Histograms based on uniform distribution of indices */ 1776 /* Move global variables later! */ 1777 1778 1779 /* cdf array for frame length indicator */ 1780 const uint16_t WebRtcIsac_kFrameLengthCdf[4] = { 1781 0, 21845, 43690, 65535 }; 1782 1783 /* pointer to cdf array for frame length indicator */ 1784 const uint16_t* WebRtcIsac_kFrameLengthCdf_ptr[1] = { 1785 WebRtcIsac_kFrameLengthCdf }; 1786 1787 /* initial cdf index for decoder of frame length indicator */ 1788 const uint16_t WebRtcIsac_kFrameLengthInitIndex[1] = { 1 }; 1789 1790 1791 int WebRtcIsac_DecodeFrameLen(Bitstr* streamdata, int16_t* framesamples) { 1792 int frame_mode, err; 1793 err = 0; 1794 /* entropy decoding of frame length [1:30ms,2:60ms] */ 1795 err = WebRtcIsac_DecHistOneStepMulti(&frame_mode, streamdata, 1796 WebRtcIsac_kFrameLengthCdf_ptr, 1797 WebRtcIsac_kFrameLengthInitIndex, 1); 1798 if (err < 0) 1799 return -ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH; 1800 1801 switch (frame_mode) { 1802 case 1: 1803 *framesamples = 480; /* 30ms */ 1804 break; 1805 case 2: 1806 *framesamples = 960; /* 60ms */ 1807 break; 1808 default: 1809 err = -ISAC_DISALLOWED_FRAME_MODE_DECODER; 1810 } 1811 return err; 1812 } 1813 1814 int WebRtcIsac_EncodeFrameLen(int16_t framesamples, Bitstr* streamdata) { 1815 int frame_mode, status; 1816 1817 status = 0; 1818 frame_mode = 0; 1819 /* entropy coding of frame length [1:480 samples,2:960 samples] */ 1820 switch (framesamples) { 1821 case 480: 1822 frame_mode = 1; 1823 break; 1824 case 960: 1825 frame_mode = 2; 1826 break; 1827 default: 1828 status = - ISAC_DISALLOWED_FRAME_MODE_ENCODER; 1829 } 1830 1831 if (status < 0) 1832 return status; 1833 1834 WebRtcIsac_EncHistMulti(streamdata, &frame_mode, 1835 WebRtcIsac_kFrameLengthCdf_ptr, 1); 1836 return status; 1837 } 1838 1839 /* cdf array for estimated bandwidth */ 1840 static const uint16_t kBwCdf[25] = { 1841 0, 2731, 5461, 8192, 10923, 13653, 16384, 19114, 21845, 24576, 27306, 30037, 1842 32768, 35498, 38229, 40959, 43690, 46421, 49151, 51882, 54613, 57343, 60074, 1843 62804, 65535 }; 1844 1845 /* pointer to cdf array for estimated bandwidth */ 1846 static const uint16_t* kBwCdfPtr[1] = { kBwCdf }; 1847 1848 /* initial cdf index for decoder of estimated bandwidth*/ 1849 static const uint16_t kBwInitIndex[1] = { 7 }; 1850 1851 1852 int WebRtcIsac_DecodeSendBW(Bitstr* streamdata, int16_t* BWno) { 1853 int BWno32, err; 1854 1855 /* entropy decoding of sender's BW estimation [0..23] */ 1856 err = WebRtcIsac_DecHistOneStepMulti(&BWno32, streamdata, kBwCdfPtr, 1857 kBwInitIndex, 1); 1858 if (err < 0) { 1859 return -ISAC_RANGE_ERROR_DECODE_BANDWIDTH; 1860 } 1861 *BWno = (int16_t)BWno32; 1862 return err; 1863 } 1864 1865 void WebRtcIsac_EncodeReceiveBw(int* BWno, Bitstr* streamdata) { 1866 /* entropy encoding of receiver's BW estimation [0..23] */ 1867 WebRtcIsac_EncHistMulti(streamdata, BWno, kBwCdfPtr, 1); 1868 } 1869 1870 1871 /* estimate code length of LPC Coef */ 1872 void WebRtcIsac_TranscodeLPCCoef(double* LPCCoef_lo, double* LPCCoef_hi, 1873 int* index_g) { 1874 int j, k, n, pos, pos2, posg, offsg, offs2; 1875 int index_ovr_g[KLT_ORDER_GAIN]; 1876 double tmpcoeffs_g[KLT_ORDER_GAIN]; 1877 double tmpcoeffs2_g[KLT_ORDER_GAIN]; 1878 double sum; 1879 1880 /* log gains, mean removal and scaling */ 1881 posg = 0; 1882 for (k = 0; k < SUBFRAMES; k++) { 1883 tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]); 1884 tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 1885 tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 1886 posg++; 1887 tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]); 1888 tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 1889 tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 1890 posg++; 1891 } 1892 1893 /* KLT */ 1894 1895 /* Left transform. */ 1896 offsg = 0; 1897 for (j = 0; j < SUBFRAMES; j++) { 1898 posg = offsg; 1899 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1900 sum = 0; 1901 pos = offsg; 1902 pos2 = k; 1903 for (n = 0; n < LPC_GAIN_ORDER; n++) { 1904 sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2]; 1905 pos2 += LPC_GAIN_ORDER; 1906 } 1907 tmpcoeffs2_g[posg++] = sum; 1908 } 1909 offsg += LPC_GAIN_ORDER; 1910 } 1911 1912 /* Right transform. */ 1913 offsg = 0; 1914 offs2 = 0; 1915 for (j = 0; j < SUBFRAMES; j++) { 1916 posg = offsg; 1917 for (k = 0; k < LPC_GAIN_ORDER; k++) { 1918 sum = 0; 1919 pos = k; 1920 pos2 = offs2; 1921 for (n = 0; n < SUBFRAMES; n++) { 1922 sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++]; 1923 pos += LPC_GAIN_ORDER; 1924 } 1925 tmpcoeffs_g[posg++] = sum; 1926 } 1927 offs2 += SUBFRAMES; 1928 offsg += LPC_GAIN_ORDER; 1929 } 1930 1931 1932 /* quantize coefficients */ 1933 for (k = 0; k < KLT_ORDER_GAIN; k++) { 1934 /* Get index. */ 1935 pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE); 1936 index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k]; 1937 if (index_g[k] < 0) { 1938 index_g[k] = 0; 1939 } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) { 1940 index_g[k] = WebRtcIsac_kQKltMaxIndGain[k]; 1941 } 1942 index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k]; 1943 1944 /* find quantization levels for coefficients */ 1945 tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]]; 1946 } 1947 } 1948 1949 1950 /* Decode & de-quantize LPC Coefficients. */ 1951 int WebRtcIsac_DecodeLpcCoefUB(Bitstr* streamdata, double* lpcVecs, 1952 double* percepFilterGains, 1953 int16_t bandwidth) { 1954 int index_s[KLT_ORDER_SHAPE]; 1955 1956 double U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 1957 int err; 1958 1959 /* Entropy decoding of quantization indices. */ 1960 switch (bandwidth) { 1961 case isac12kHz: { 1962 err = WebRtcIsac_DecHistOneStepMulti( 1963 index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb12, 1964 WebRtcIsac_kLpcShapeEntropySearchUb12, UB_LPC_ORDER * 1965 UB_LPC_VEC_PER_FRAME); 1966 break; 1967 } 1968 case isac16kHz: { 1969 err = WebRtcIsac_DecHistOneStepMulti( 1970 index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb16, 1971 WebRtcIsac_kLpcShapeEntropySearchUb16, UB_LPC_ORDER * 1972 UB16_LPC_VEC_PER_FRAME); 1973 break; 1974 } 1975 default: 1976 return -1; 1977 } 1978 1979 if (err < 0) { 1980 return err; 1981 } 1982 1983 WebRtcIsac_DequantizeLpcParam(index_s, lpcVecs, bandwidth); 1984 WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth); 1985 WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth); 1986 WebRtcIsac_AddLarMean(lpcVecs, bandwidth); 1987 WebRtcIsac_DecodeLpcGainUb(percepFilterGains, streamdata); 1988 1989 if (bandwidth == isac16kHz) { 1990 /* Decode another set of Gains. */ 1991 WebRtcIsac_DecodeLpcGainUb(&percepFilterGains[SUBFRAMES], streamdata); 1992 } 1993 return 0; 1994 } 1995 1996 int16_t WebRtcIsac_EncodeBandwidth(enum ISACBandwidth bandwidth, 1997 Bitstr* streamData) { 1998 int bandwidthMode; 1999 switch (bandwidth) { 2000 case isac12kHz: { 2001 bandwidthMode = 0; 2002 break; 2003 } 2004 case isac16kHz: { 2005 bandwidthMode = 1; 2006 break; 2007 } 2008 default: 2009 return -ISAC_DISALLOWED_ENCODER_BANDWIDTH; 2010 } 2011 WebRtcIsac_EncHistMulti(streamData, &bandwidthMode, kOneBitEqualProbCdf_ptr, 2012 1); 2013 return 0; 2014 } 2015 2016 int16_t WebRtcIsac_DecodeBandwidth(Bitstr* streamData, 2017 enum ISACBandwidth* bandwidth) { 2018 int bandwidthMode; 2019 if (WebRtcIsac_DecHistOneStepMulti(&bandwidthMode, streamData, 2020 kOneBitEqualProbCdf_ptr, 2021 kOneBitEqualProbInitIndex, 1) < 0) { 2022 return -ISAC_RANGE_ERROR_DECODE_BANDWITH; 2023 } 2024 switch (bandwidthMode) { 2025 case 0: { 2026 *bandwidth = isac12kHz; 2027 break; 2028 } 2029 case 1: { 2030 *bandwidth = isac16kHz; 2031 break; 2032 } 2033 default: 2034 return -ISAC_DISALLOWED_BANDWIDTH_MODE_DECODER; 2035 } 2036 return 0; 2037 } 2038 2039 int16_t WebRtcIsac_EncodeJitterInfo(int32_t jitterIndex, 2040 Bitstr* streamData) { 2041 /* This is to avoid LINUX warning until we change 'int' to 'Word32'. */ 2042 int intVar; 2043 2044 if ((jitterIndex < 0) || (jitterIndex > 1)) { 2045 return -1; 2046 } 2047 intVar = (int)(jitterIndex); 2048 /* Use the same CDF table as for bandwidth 2049 * both take two values with equal probability.*/ 2050 WebRtcIsac_EncHistMulti(streamData, &intVar, kOneBitEqualProbCdf_ptr, 1); 2051 return 0; 2052 } 2053 2054 int16_t WebRtcIsac_DecodeJitterInfo(Bitstr* streamData, 2055 int32_t* jitterInfo) { 2056 int intVar; 2057 /* Use the same CDF table as for bandwidth 2058 * both take two values with equal probability. */ 2059 if (WebRtcIsac_DecHistOneStepMulti(&intVar, streamData, 2060 kOneBitEqualProbCdf_ptr, 2061 kOneBitEqualProbInitIndex, 1) < 0) { 2062 return -ISAC_RANGE_ERROR_DECODE_BANDWITH; 2063 } 2064 *jitterInfo = (int16_t)(intVar); 2065 return 0; 2066 } 2067