16f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 26f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 36f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 46f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Use of this source code is governed by a BSD-style license 56f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * that can be found in the LICENSE file in the root of the source 66f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * tree. An additional intellectual property rights grant can be found 76f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * in the file PATENTS. All contributing project authors may 86f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * be found in the AUTHORS file in the root of the source tree. 96f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * entropy_coding.c 136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This header file defines all of the functions used to arithmetically 156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encode the iSAC bistream 166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "entropy_coding.h" 216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "settings.h" 226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "arith_routines.h" 236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "signal_processing_library.h" 246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "spectrum_ar_model_tables.h" 256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_tables.h" 266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "pitch_gain_tables.h" 276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "pitch_lag_tables.h" 286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "encode_lpc_swb.h" 296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb12_tables.h" 306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb16_tables.h" 316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_gain_swb_tables.h" 326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "os_specific_inline.h" 336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <math.h> 356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <string.h> 366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kLpcVecPerSegmentUb12 = 5; 386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kLpcVecPerSegmentUb16 = 4; 396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* CDF array for encoder bandwidth (12 vs 16 kHz) indicator. */ 416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kOneBitEqualProbCdf[3] = { 426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0, 32768, 65535 }; 436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Pointer to cdf array for encoder bandwidth (12 vs 16 kHz) indicator. */ 456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16* kOneBitEqualProbCdf_ptr[1] = { 466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kOneBitEqualProbCdf }; 476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Initial cdf index for decoder of encoded bandwidth 506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * (12 vs 16 kHz) indicator. 516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kOneBitEqualProbInitIndex[1] = { 1 }; 536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const int kIsSWB12 = 1; 566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* compute correlation from power spectrum */ 586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void FindCorrelation(WebRtc_Word32* PSpecQ12, WebRtc_Word32* CorrQ7) { 596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 summ[FRAMESAMPLES / 8]; 606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 diff[FRAMESAMPLES / 8]; 616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* CS_ptrQ9; 626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 sum; 636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, n; 646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES / 8; k++) { 666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin summ[k] = (PSpecQ12[k] + PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5; 676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin diff[k] = (PSpecQ12[k] - PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5; 686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 2; 716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) { 726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += summ[n]; 736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ7[0] = sum; 756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < AR_ORDER; k += 2) { 776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9 = WebRtcIsac_kCos[k]; 796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) 806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += (CS_ptrQ9[n] * diff[n] + 256) >> 9; 816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ7[k + 1] = sum; 826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 1; k < AR_ORDER; k += 2) { 856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9 = WebRtcIsac_kCos[k]; 876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) 886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += (CS_ptrQ9[n] * summ[n] + 256) >> 9; 896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ7[k + 1] = sum; 906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* compute inverse AR power spectrum */ 946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Changed to the function used in iSAC FIX for compatibility reasons */ 956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void FindInvArSpec(const WebRtc_Word16* ARCoefQ12, 966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word32 gainQ10, 976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32* CurveQ16) { 986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 CorrQ11[AR_ORDER + 1]; 996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 sum, tmpGain; 1006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 diffQ16[FRAMESAMPLES / 8]; 1016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* CS_ptrQ9; 1026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, n; 1036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 round, shftVal = 0, sh; 1046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 1066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < AR_ORDER + 1; n++) { 1076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += WEBRTC_SPL_MUL(ARCoefQ12[n], ARCoefQ12[n]); /* Q24 */ 1086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(WEBRTC_SPL_RSHIFT_W32(sum, 6), 1106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 65) + 32768, 16); /* Q8 */ 1116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ11[0] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(sum, gainQ10) + 256, 9); 1126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* To avoid overflow, we shift down gainQ10 if it is large. 1146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * We will not lose any precision */ 1156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (gainQ10 > 400000) { 1166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpGain = WEBRTC_SPL_RSHIFT_W32(gainQ10, 3); 1176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin round = 32; 1186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shftVal = 6; 1196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 1206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpGain = gainQ10; 1216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin round = 256; 1226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shftVal = 9; 1236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 1; k < AR_ORDER + 1; k++) { 1266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 16384; 1276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = k; n < AR_ORDER + 1; n++) 1286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += WEBRTC_SPL_MUL(ARCoefQ12[n - k], ARCoefQ12[n]); /* Q24 */ 1296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = WEBRTC_SPL_RSHIFT_W32(sum, 15); 1306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ11[k] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL(sum, tmpGain) + round, 1316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shftVal); 1326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = WEBRTC_SPL_LSHIFT_W32(CorrQ11[0], 7); 1346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) { 1356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CurveQ16[n] = sum; 1366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 1; k < AR_ORDER; k += 2) { 1386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) { 1396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CurveQ16[n] += WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL( 1406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kCos[k][n], CorrQ11[k + 1]) + 2, 2); 1416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9 = WebRtcIsac_kCos[0]; 1456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* If CorrQ11[1] too large we avoid getting overflow in the 1476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * calculation by shifting */ 1486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sh = WebRtcSpl_NormW32(CorrQ11[1]); 1496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (CorrQ11[1] == 0) { /* Use next correlation */ 1506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sh = WebRtcSpl_NormW32(CorrQ11[2]); 1516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (sh < 9) { 1536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shftVal = 9 - sh; 1546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 1556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shftVal = 0; 1566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) { 1586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin diffQ16[n] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL( 1596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9[n], WEBRTC_SPL_RSHIFT_W32(CorrQ11[1], shftVal)) + 2, 2); 1606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 2; k < AR_ORDER; k += 2) { 1626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9 = WebRtcIsac_kCos[k]; 1636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < FRAMESAMPLES / 8; n++) { 1646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin diffQ16[n] += WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL( 1656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CS_ptrQ9[n], WEBRTC_SPL_RSHIFT_W32(CorrQ11[k + 1], shftVal)) + 2, 2); 1666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES / 8; k++) { 1706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CurveQ16[FRAMESAMPLES_QUARTER - 1 - k] = CurveQ16[k] - 1716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WEBRTC_SPL_LSHIFT_W32(diffQ16[k], shftVal); 1726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CurveQ16[k] += WEBRTC_SPL_LSHIFT_W32(diffQ16[k], shftVal); 1736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Generate array of dither samples in Q7. */ 1776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void GenerateDitherQ7Lb(WebRtc_Word16* bufQ7, WebRtc_UWord32 seed, 1786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int length, WebRtc_Word16 AvgPitchGain_Q12) { 1796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, shft; 1806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 dither1_Q7, dither2_Q7, dither_gain_Q14; 1816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This threshold should be equal to that in decode_spec(). */ 1836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (AvgPitchGain_Q12 < 614) { 1846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < length - 2; k += 3) { 1856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* New random unsigned int. */ 1866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin seed = (seed * 196314165) + 907633515; 1876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Fixed-point dither sample between -64 and 64 (Q7). */ 1896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* dither = seed * 128 / 4294967295 */ 1906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dither1_Q7 = (WebRtc_Word16)(((int)seed + 16777216) >> 25); 1916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* New random unsigned int. */ 1936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin seed = (seed * 196314165) + 907633515; 1946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Fixed-point dither sample between -64 and 64. */ 1966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dither2_Q7 = (WebRtc_Word16)(((int)seed + 16777216) >> 25); 1976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shft = (seed >> 25) & 15; 1996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (shft < 5) { 2006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k] = dither1_Q7; 2016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 1] = dither2_Q7; 2026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 2] = 0; 2036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (shft < 10) { 2046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k] = dither1_Q7; 2056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 1] = 0; 2066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 2] = dither2_Q7; 2076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 2086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k] = 0; 2096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 1] = dither1_Q7; 2106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 2] = dither2_Q7; 2116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 2146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dither_gain_Q14 = (WebRtc_Word16)(22528 - 10 * AvgPitchGain_Q12); 2156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Dither on half of the coefficients. */ 2176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < length - 1; k += 2) { 2186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* New random unsigned int */ 2196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin seed = (seed * 196314165) + 907633515; 2206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Fixed-point dither sample between -64 and 64. */ 2226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dither1_Q7 = (WebRtc_Word16)(((int)seed + 16777216) >> 25); 2236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Dither sample is placed in either even or odd index. */ 2256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shft = (seed >> 25) & 1; /* Either 0 or 1 */ 2266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + shft] = (((dither_gain_Q14 * dither1_Q7) + 8192) >> 14); 2286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k + 1 - shft] = 0; 2296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 2366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * GenerateDitherQ7LbUB() 2376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * generate array of dither samples in Q7 There are less zeros in dither 2396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * vector compared to GenerateDitherQ7Lb. 2406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * A uniform random number generator with the range of [-64 64] is employed 2426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * but the generated dithers are scaled by 0.35, a heuristic scaling. 2436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 2456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -seed : the initial seed for the random number generator. 2466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -length : the number of dither values to be generated. 2476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 2496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bufQ7 : pointer to a buffer where dithers are written to. 2506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic void GenerateDitherQ7LbUB( 2526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* bufQ7, 2536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 seed, 2546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int length) { 2556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 2566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < length; k++) { 2576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* new random unsigned int */ 2586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin seed = (seed * 196314165) + 907633515; 2596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Fixed-point dither sample between -64 and 64 (Q7). */ 2616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* bufQ7 = seed * 128 / 4294967295 */ 2626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k] = (WebRtc_Word16)(((int)seed + 16777216) >> 25); 2636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale by 0.35. */ 2656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bufQ7[k] = (WebRtc_Word16)WEBRTC_SPL_MUL_16_16_RSFT(bufQ7[k], 2048, 13); 2666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 2706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Function to decode the complex spectrum from the bit stream 2716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * returns the total number of bytes in the stream. 2726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeSpec(Bitstr* streamdata, WebRtc_Word16 AvgPitchGain_Q12, 2746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBand band, double* fr, double* fi) { 2756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 DitherQ7[FRAMESAMPLES]; 2766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 data[FRAMESAMPLES]; 2776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 invARSpec2_Q16[FRAMESAMPLES_QUARTER]; 2786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 invARSpecQ8[FRAMESAMPLES_QUARTER]; 2796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 ARCoefQ12[AR_ORDER + 1]; 2806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 RCQ15[AR_ORDER]; 2816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 gainQ10; 2826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 gain2_Q10, res; 2836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 in_sqrt; 2846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 newRes; 2856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, len, i; 2866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int is_12khz = !kIsSWB12; 2876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int num_dft_coeff = FRAMESAMPLES; 2886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Create dither signal. */ 2896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacLowerBand) { 2906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin GenerateDitherQ7Lb(DitherQ7, streamdata->W_upper, FRAMESAMPLES, 2916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin AvgPitchGain_Q12); 2926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 2936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin GenerateDitherQ7LbUB(DitherQ7, streamdata->W_upper, FRAMESAMPLES); 2946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacUpperBand12) { 2956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin is_12khz = kIsSWB12; 2966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin num_dft_coeff = FRAMESAMPLES_HALF; 2976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode model parameters. */ 3016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_DecodeRc(streamdata, RCQ15) < 0) 3026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 3036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12); 3056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_DecodeGain2(streamdata, &gain2_Q10) < 0) 3076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 3086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Compute inverse AR power spectrum. */ 3106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16); 3116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert to magnitude spectrum, 3136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * by doing square-roots (modified from SPLIB). */ 3146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1); 3156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_QUARTER; k++) { 3166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin in_sqrt = invARSpec2_Q16[k]; 3176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin i = 10; 3186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Negative values make no sense for a real sqrt-function. */ 3206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (in_sqrt < 0) 3216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin in_sqrt = -in_sqrt; 3226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin newRes = (in_sqrt / res + res) >> 1; 3246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin do { 3256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin res = newRes; 3266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin newRes = (in_sqrt / res + res) >> 1; 3276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } while (newRes != res && i-- > 0); 3286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin invARSpecQ8[k] = (WebRtc_Word16)newRes; 3306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin len = WebRtcIsac_DecLogisticMulti2(data, streamdata, invARSpecQ8, DitherQ7, 3336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin num_dft_coeff, is_12khz); 3346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Arithmetic decoding of spectrum. */ 3356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (len < 1) { 3366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_SPECTRUM; 3376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (band) { 3406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacLowerBand: { 3416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scale down spectral samples with low SNR. */ 3426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 p1; 3436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 p2; 3446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (AvgPitchGain_Q12 <= 614) { 3456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin p1 = 30 << 10; 3466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin p2 = 32768 + (33 << 16); 3476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 3486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin p1 = 36 << 10; 3496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin p2 = 32768 + (40 << 16); 3506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES; k += 4) { 3526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gainQ10 = WebRtcSpl_DivW32W16ResW16(p1, (WebRtc_Word16)( 3536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin (invARSpec2_Q16[k >> 2] + p2) >> 16)); 3546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *fr++ = (double)((data[ k ] * gainQ10 + 512) >> 10) / 128.0; 3556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *fi++ = (double)((data[k + 1] * gainQ10 + 512) >> 10) / 128.0; 3566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *fr++ = (double)((data[k + 2] * gainQ10 + 512) >> 10) / 128.0; 3576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *fi++ = (double)((data[k + 3] * gainQ10 + 512) >> 10) / 128.0; 3586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacUpperBand12: { 3626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0, i = 0; k < FRAMESAMPLES_HALF; k += 4) { 3636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fr[i] = (double)data[ k ] / 128.0; 3646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fi[i] = (double)data[k + 1] / 128.0; 3656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin i++; 3666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fr[i] = (double)data[k + 2] / 128.0; 3676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fi[i] = (double)data[k + 3] / 128.0; 3686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin i++; 3696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* The second half of real and imaginary coefficients is zero. This is 3716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * due to using the old FFT module which requires two signals as input 3726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * while in 0-12 kHz mode we only have 8-12 kHz band, and the second 3736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * signal is set to zero. */ 3746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(&fr[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER * 3756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(double)); 3766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memset(&fi[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER * 3776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sizeof(double)); 3786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacUpperBand16: { 3816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (i = 0, k = 0; k < FRAMESAMPLES; k += 4, i++) { 3826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fr[i] = (double)data[ k ] / 128.0; 3836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fi[i] = (double)data[k + 1] / 128.0; 3846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fr[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 2] / 128.0; 3856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin fi[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 3] / 128.0; 3866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return len; 3916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 3926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeSpec(const WebRtc_Word16* fr, const WebRtc_Word16* fi, 3956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 AvgPitchGain_Q12, enum ISACBand band, 3966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamdata) { 3976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 ditherQ7[FRAMESAMPLES]; 3986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 dataQ7[FRAMESAMPLES]; 3996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 PSpec[FRAMESAMPLES_QUARTER]; 4006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 invARSpec2_Q16[FRAMESAMPLES_QUARTER]; 4016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord16 invARSpecQ8[FRAMESAMPLES_QUARTER]; 4026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 CorrQ7[AR_ORDER + 1]; 4036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 CorrQ7_norm[AR_ORDER + 1]; 4046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 RCQ15[AR_ORDER]; 4056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 ARCoefQ12[AR_ORDER + 1]; 4066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 gain2_Q10; 4076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 val; 4086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 nrg, res; 4096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 sum; 4106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 in_sqrt; 4116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 newRes; 4126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 err; 4136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_UWord32 nrg_u32; 4146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int shift_var; 4156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, n, j, i; 4166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int is_12khz = !kIsSWB12; 4176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int num_dft_coeff = FRAMESAMPLES; 4186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Create dither signal. */ 4206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacLowerBand) { 4216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin GenerateDitherQ7Lb(ditherQ7, streamdata->W_upper, FRAMESAMPLES, 4226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin AvgPitchGain_Q12); 4236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 4246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin GenerateDitherQ7LbUB(ditherQ7, streamdata->W_upper, FRAMESAMPLES); 4256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (band == kIsacUpperBand12) { 4266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin is_12khz = kIsSWB12; 4276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin num_dft_coeff = FRAMESAMPLES_HALF; 4286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* add dither and quantize, and compute power spectrum */ 4326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (band) { 4336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacLowerBand: { 4346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES; k += 4) { 4356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fr++ + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 4366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k] = val; 4376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = val * val; 4386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 4406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 1] = val; 4416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2]; 4446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 2] = val; 4456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3]; 4486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 3] = val; 4496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PSpec[k >> 2] = sum >> 2; 4526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 4546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacUpperBand12: { 4566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0, j = 0; k < FRAMESAMPLES_HALF; k += 4) { 4576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fr++ + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 4586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k] = val; 4596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = val * val; 4606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 4626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 1] = val; 4636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PSpec[j++] = sum >> 1; 4666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2]; 4686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 2] = val; 4696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = val * val; 4706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3]; 4726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 3] = val; 4736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PSpec[j++] = sum >> 1; 4766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 4786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case kIsacUpperBand16: { 4806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0, k = 0; k < FRAMESAMPLES; k += 4, j++) { 4816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((fr[j] + ditherQ7[k] + 64) & 0xFF80) - ditherQ7[k]; 4826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k] = val; 4836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = val * val; 4846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((fi[j] + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1]; 4866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 1] = val; 4876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((fr[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 2] + 64) & 4906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0xFF80) - ditherQ7[k + 2]; 4916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 2] = val; 4926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin val = ((fi[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 3] + 64) & 4956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0xFF80) - ditherQ7[k + 3]; 4966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin dataQ7[k + 3] = val; 4976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += val * val; 4986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PSpec[k >> 2] = sum >> 2; 5006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* compute correlation from power spectrum */ 5066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FindCorrelation(PSpec, CorrQ7); 5076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find AR coefficients */ 5096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Aumber of bit shifts to 14-bit normalize CorrQ7[0] 5106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * (leaving room for sign) */ 5116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin shift_var = WebRtcSpl_NormW32(CorrQ7[0]) - 18; 5126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (shift_var > 0) { 5146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < AR_ORDER + 1; k++) { 5156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ7_norm[k] = CorrQ7[k] << shift_var; 5166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < AR_ORDER + 1; k++) { 5196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin CorrQ7_norm[k] = CorrQ7[k] >> (-shift_var); 5206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find RC coefficients. */ 5246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcSpl_AutoCorrToReflCoef(CorrQ7_norm, AR_ORDER, RCQ15); 5256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize & code RC Coefficient. */ 5276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeRc(RCQ15, streamdata); 5286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* RC -> AR coefficients */ 5306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12); 5316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Compute ARCoef' * Corr * ARCoef in Q19. */ 5336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg = 0; 5346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j <= AR_ORDER; j++) { 5356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n <= j; n++) { 5366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg += (ARCoefQ12[j] * ((CorrQ7_norm[j - n] * ARCoefQ12[n] + 256) >> 9) + 5376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4) >> 3; 5386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = j + 1; n <= AR_ORDER; n++) { 5406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg += (ARCoefQ12[j] * ((CorrQ7_norm[n - j] * ARCoefQ12[n] + 256) >> 9) + 5416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4) >> 3; 5426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg_u32 = (WebRtc_UWord32)nrg; 5466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (shift_var > 0) { 5476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg_u32 = nrg_u32 >> shift_var; 5486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg_u32 = nrg_u32 << (-shift_var); 5506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (nrg_u32 > 0x7FFFFFFF) { 5526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg = 0x7FFFFFFF; 5536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 5546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin nrg = (WebRtc_Word32)nrg_u32; 5556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Also shifts 31 bits to the left! */ 5576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin gain2_Q10 = WebRtcSpl_DivResultInQ31(FRAMESAMPLES_QUARTER, nrg); 5586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize & code gain2_Q10. */ 5606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_EncodeGain2(&gain2_Q10, streamdata)) { 5616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 5626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Compute inverse AR power spectrum. */ 5656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16); 5666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Convert to magnitude spectrum, by doing square-roots 5676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * (modified from SPLIB). */ 5686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1); 5696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < FRAMESAMPLES_QUARTER; k++) { 5706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin in_sqrt = invARSpec2_Q16[k]; 5716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin i = 10; 5726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Negative values make no sense for a real sqrt-function. */ 5736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (in_sqrt < 0) { 5746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin in_sqrt = -in_sqrt; 5756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin newRes = (in_sqrt / res + res) >> 1; 5776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin do { 5786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin res = newRes; 5796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin newRes = (in_sqrt / res + res) >> 1; 5806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } while (newRes != res && i-- > 0); 5816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin invARSpecQ8[k] = (WebRtc_Word16)newRes; 5836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* arithmetic coding of spectrum */ 5856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_EncLogisticMulti2(streamdata, dataQ7, invARSpecQ8, 5866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin num_dft_coeff, is_12khz); 5876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 5886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return (err); 5896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 5926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* step-up */ 5956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Rc2Poly(double* RC, int N, double* a) { 5966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int m, k; 5976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmp[MAX_AR_MODEL_ORDER]; 5986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin a[0] = 1.0; 6006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp[0] = 1.0; 6016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (m = 1; m <= N; m++) { 6026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* copy */ 6036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&tmp[1], &a[1], (m - 1) * sizeof(double)); 6046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin a[m] = RC[m - 1]; 6056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 1; k < m; k++) { 6066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin a[k] += RC[m - 1] * tmp[m - k]; 6076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return; 6106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* step-down */ 6136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Poly2Rc(double* a, int N, double* RC) { 6146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int m, k; 6156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmp[MAX_AR_MODEL_ORDER]; 6166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmp_inv; 6176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RC[N - 1] = a[N]; 6196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (m = N - 1; m > 0; m--) { 6206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp_inv = 1.0 / (1.0 - RC[m] * RC[m]); 6216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 1; k <= m; k++) { 6226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp[k] = (a[k] - RC[m] * a[m - k + 1]) * tmp_inv; 6236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&a[1], &tmp[1], (m - 1) * sizeof(double)); 6266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RC[m - 1] = tmp[m]; 6276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return; 6296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#define MAX_ORDER 100 6336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Matlab's LAR definition */ 6356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Rc2Lar(const double* refc, double* lar, int order) { 6366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 6376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < order; k++) { 6386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lar[k] = log((1 + refc[k]) / (1 - refc[k])); 6396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Lar2Rc(const double* lar, double* refc, int order) { 6446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 6456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmp; 6466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < order; k++) { 6486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmp = exp(lar[k]); 6496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin refc[k] = (tmp - 1) / (tmp + 1); 6506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Poly2Lar(double* lowband, int orderLo, double* hiband, 6546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int orderHi, int Nsub, double* lars) { 6556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 6566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rc[MAX_ORDER], *inpl, *inph, *outp; 6576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inpl = lowband; 6596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inph = hiband; 6606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp = lars; 6616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < Nsub; k++) { 6626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* gains */ 6636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp[0] = inpl[0]; 6646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp[1] = inph[0]; 6656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp += 2; 6666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low band */ 6686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inpl[0] = 1.0; 6696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Poly2Rc(inpl, orderLo, rc); 6706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Lar(rc, outp, orderLo); 6716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp += orderLo; 6726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High band */ 6746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inph[0] = 1.0; 6756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Poly2Rc(inph, orderHi, rc); 6766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Lar(rc, outp, orderHi); 6776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outp += orderHi; 6786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inpl += orderLo + 1; 6806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inph += orderHi + 1; 6816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6856f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_Poly2LarUB(double* lpcVecs, WebRtc_Word16 bandwidth) { 6866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double poly[MAX_ORDER]; 6876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rc[MAX_ORDER]; 6886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* ptrIO; 6896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 vecCntr; 6906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 vecSize; 6916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVec; 6926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin vecSize = UB_LPC_ORDER; 6946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidth) { 6956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 6966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB_LPC_VEC_PER_FRAME; 6976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 6986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 7006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB16_LPC_VEC_PER_FRAME; 7016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 7026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 7046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 7056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrIO = lpcVecs; 7086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poly[0] = 1.0; 7096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (vecCntr = 0; vecCntr < numVec; vecCntr++) { 7106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(&poly[1], ptrIO, sizeof(double) * vecSize); 7116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Poly2Rc(poly, vecSize, rc); 7126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Lar(rc, ptrIO, vecSize); 7136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrIO += vecSize; 7146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 7166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 7176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Lar2Poly(double* lars, double* lowband, int orderLo, 7206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* hiband, int orderHi, int Nsub) { 7216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, orderTot; 7226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rc[MAX_ORDER], *outpl, *outph, *inp; 7236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin orderTot = (orderLo + orderHi + 2); 7256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outpl = lowband; 7266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outph = hiband; 7276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* First two elements of 'inp' store gains*/ 7286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inp = lars; 7296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < Nsub; k++) { 7306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low band */ 7316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2Rc(&inp[2], rc, orderLo); 7326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Poly(rc, orderLo, outpl); 7336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High band */ 7356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2Rc(&inp[orderLo + 2], rc, orderHi); 7366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Poly(rc, orderHi, outph); 7376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* gains */ 7396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outpl[0] = inp[0]; 7406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outph[0] = inp[1]; 7416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outpl += orderLo + 1; 7436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin outph += orderHi + 1; 7446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin inp += orderTot; 7456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 7476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 7496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * assumes 2 LAR vectors interpolates to 'numPolyVec' A-polynomials 7506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Note: 'numPolyVecs' includes the first and the last point of the interval 7516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 7526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_Lar2PolyInterpolUB(double* larVecs, double* percepFilterParams, 7536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int numPolyVecs) { 7546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int polyCntr, coeffCntr; 7556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double larInterpol[UB_LPC_ORDER]; 7566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double rc[UB_LPC_ORDER]; 7576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double delta[UB_LPC_ORDER]; 7586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* calculate the step-size for linear interpolation coefficients */ 7606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) { 7616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin delta[coeffCntr] = (larVecs[UB_LPC_ORDER + coeffCntr] - 7626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin larVecs[coeffCntr]) / (numPolyVecs - 1); 7636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (polyCntr = 0; polyCntr < numPolyVecs; polyCntr++) { 7666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) { 7676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin larInterpol[coeffCntr] = larVecs[coeffCntr] + 7686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin delta[coeffCntr] * polyCntr; 7696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2Rc(larInterpol, rc, UB_LPC_ORDER); 7716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* convert to A-polynomial, the following function returns A[0] = 1; 7736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * which is written where gains had to be written. Then we write the 7746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * gain (outside this function). This way we say a memcpy. */ 7756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Rc2Poly(rc, UB_LPC_ORDER, percepFilterParams); 7766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin percepFilterParams += (UB_LPC_ORDER + 1); 7776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 7796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeLpc(Bitstr* streamdata, double* LPCCoef_lo, 7816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* LPCCoef_hi) { 7826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE]; 7836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 7846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeLpcCoef(streamdata, lars); 7866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 7876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_LPC; 7886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, 7906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin SUBFRAMES); 7916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 7926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 7936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 7946f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodeInterpolLpcUb(Bitstr* streamdata, 7956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* percepFilterParams, 7966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) { 7976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lpcCoeff[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 7986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 7996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int interpolCntr; 8006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int subframeCntr; 8016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numSegments; 8026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVecPerSegment; 8036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numGains; 8046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double percepFilterGains[SUBFRAMES << 1]; 8066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* ptrOutParam = percepFilterParams; 8076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecodeLpcCoefUB(streamdata, lpcCoeff, percepFilterGains, 8096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bandwidth); 8106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 8116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_LPC; 8126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidth) { 8156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 8166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numGains = SUBFRAMES; 8176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSegments = UB_LPC_VEC_PER_FRAME - 1; 8186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVecPerSegment = kLpcVecPerSegmentUb12; 8196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 8206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 8226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numGains = SUBFRAMES << 1; 8236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numSegments = UB16_LPC_VEC_PER_FRAME - 1; 8246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVecPerSegment = kLpcVecPerSegmentUb16; 8256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 8266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 8286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 8296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (interpolCntr = 0; interpolCntr < numSegments; interpolCntr++) { 8326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2PolyInterpolUB(&lpcCoeff[interpolCntr * UB_LPC_ORDER], 8336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrOutParam, numVecPerSegment + 1); 8346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrOutParam += (numVecPerSegment * (UB_LPC_ORDER + 1)); 8356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrOutParam = percepFilterParams; 8386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac16kHz) { 8406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrOutParam += (1 + UB_LPC_ORDER); 8416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (subframeCntr = 0; subframeCntr < numGains; subframeCntr++) { 8446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *ptrOutParam = percepFilterGains[subframeCntr]; 8456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrOutParam += (1 + UB_LPC_ORDER); 8466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 8486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 8496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* decode & dequantize LPC Coef */ 8526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeLpcCoef(Bitstr* streamdata, double* LPCCoef) { 8536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int j, k, n, pos, pos2, posg, poss, offsg, offss, offs2; 8546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_g[KLT_ORDER_GAIN], index_s[KLT_ORDER_SHAPE]; 8556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs_g[KLT_ORDER_GAIN], tmpcoeffs_s[KLT_ORDER_SHAPE]; 8566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs2_g[KLT_ORDER_GAIN], tmpcoeffs2_s[KLT_ORDER_SHAPE]; 8576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double sum; 8586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 8596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int model = 1; 8606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of model number */ 8626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* We are keeping this for backward compatibility of bit-streams. */ 8636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(&model, streamdata, 8646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltModelCdfPtr, 8656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltModelInitIndex, 1); 8666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 8676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 8686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Only accepted value of model is 0. It is kept in bit-stream for backward 8706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * compatibility. */ 8716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (model != 0) { 8726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_LPC_MODEL; 8736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of quantization indices */ 8766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti( 8776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s, streamdata, WebRtcIsac_kQKltCdfPtrShape, 8786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltInitIndexShape, KLT_ORDER_SHAPE); 8796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 8806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 8816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti( 8836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g, streamdata, WebRtcIsac_kQKltCdfPtrGain, 8846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltInitIndexGain, KLT_ORDER_GAIN); 8856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 8866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 8876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 8896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization levels for coefficients */ 8906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_SHAPE; k++) { 8916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[k] = 8926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltLevelsShape[WebRtcIsac_kQKltOffsetShape[k] + 8936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s[k]]; 8946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_GAIN; k++) { 8966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[WebRtcIsac_kQKltOffsetGain[k] + 8976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k]]; 8986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 8996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Inverse KLT */ 9016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform, transpose matrix! */ 9036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 9046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 9056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 9066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 9076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 9086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 9096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 9106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 9116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offsg; 9126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 9136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_GAIN_ORDER; n++) { 9146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++]; 9156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_g[posg++] = sum; 9176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += LPC_GAIN_ORDER; 9186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 9206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 9216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 9226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offss; 9236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 9246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_SHAPE_ORDER; n++) { 9256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++]; 9266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_s[poss++] = sum; 9286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += LPC_SHAPE_ORDER; 9296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 9316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 9326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform, transpose matrix */ 9356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 9366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 9376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 9386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 9396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 9406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 9416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 9426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 9436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 9446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = j; 9456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 9466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2]; 9476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_GAIN_ORDER; 9486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += SUBFRAMES; 9496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg++] = sum; 9526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = offss; 9546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 9556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 9566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 9576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = j; 9586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 9596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2]; 9606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_SHAPE_ORDER; 9616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += SUBFRAMES; 9626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss++] = sum; 9646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 9666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 9676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* scaling, mean addition, and gain restoration */ 9706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 9716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 9726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = 0; 9736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 9746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* log gains */ 9756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 9766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg]; 9776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = exp(LPCCoef[pos]); 9786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos++; 9796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 9806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 9816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg]; 9826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = exp(LPCCoef[pos]); 9836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos++; 9846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 9856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low-band LAR coefficients. */ 9876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) { 9886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE; 9896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 9906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 9926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High-band LAR coefficients. */ 9936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) { 9946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE; 9956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 9966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 9986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 9996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 10006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Encode LPC in LAR domain. */ 10026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeLar(double* LPCCoef, Bitstr* streamdata, 10036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISAC_SaveEncData_t* encData) { 10046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int j, k, n, pos, pos2, poss, offss, offs2; 10056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_s[KLT_ORDER_SHAPE]; 10066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_ovr_s[KLT_ORDER_SHAPE]; 10076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs_s[KLT_ORDER_SHAPE]; 10086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs2_s[KLT_ORDER_SHAPE]; 10096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double sum; 10106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const int kModel = 0; 10116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Mean removal and scaling. */ 10136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 10146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = 0; 10156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 10166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* First two element are gains, move over them. */ 10176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += 2; 10186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low-band LAR coefficients. */ 10206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_LOBAND_ORDER; n++, poss++, pos++) { 10216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss]; 10226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss] *= LPC_LOBAND_SCALE; 10236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High-band LAR coefficients. */ 10266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_HIBAND_ORDER; n++, poss++, pos++) { 10276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss]; 10286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss] *= LPC_HIBAND_SCALE; 10296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* KLT */ 10336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform. */ 10356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 10366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 10376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = offss; 10386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 10396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 10406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offss; 10416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = k; 10426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_SHAPE_ORDER; n++) { 10436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2]; 10446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += LPC_SHAPE_ORDER; 10456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_s[poss++] = sum; 10476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 10496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform. */ 10526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 10536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 10546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 10556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = offss; 10566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 10576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 10586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 10596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 10606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 10616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2++]; 10626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_SHAPE_ORDER; 10636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss++] = sum; 10656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += SUBFRAMES; 10676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 10686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize coefficients. */ 10716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_SHAPE; k++) { 10726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s[k] = (WebRtcIsac_lrint(tmpcoeffs_s[k] / KLT_STEPSIZE)) + 10736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQKltQuantMinShape[k]; 10746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (index_s[k] < 0) { 10756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s[k] = 0; 10766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (index_s[k] > WebRtcIsac_kQKltMaxIndShape[k]) { 10776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s[k] = WebRtcIsac_kQKltMaxIndShape[k]; 10786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_ovr_s[k] = WebRtcIsac_kQKltOffsetShape[k] + index_s[k]; 10806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Only one model remains in this version of the code, kModel = 0. We 10846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * are keeping for bit-streams to be backward compatible. */ 10856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of model number */ 10866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, &kModel, WebRtcIsac_kQKltModelCdfPtr, 1); 10876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams */ 10896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy coding of quantization indices - shape only. */ 10906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, index_s, WebRtcIsac_kQKltCdfPtrShape, 10916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin KLT_ORDER_SHAPE); 10926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams. */ 10946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_SHAPE; k++) { 10956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->LPCindex_s[KLT_ORDER_SHAPE * encData->startIdx + k] = index_s[k]; 10966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 10976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 10986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find quantization levels for shape coefficients. */ 10996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_SHAPE; k++) { 11006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[k] = WebRtcIsac_kQKltLevelsShape[index_ovr_s[k]]; 11016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Inverse KLT. */ 11036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform, transpose matrix.! */ 11046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 11056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 11066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 11076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 11086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 11096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 11106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offss; 11116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 11126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_SHAPE_ORDER; n++) { 11136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++]; 11146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_s[poss++] = sum; 11166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += LPC_SHAPE_ORDER; 11176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 11196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform, Transpose matrix */ 11226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss = 0; 11236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 11246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 11256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = offss; 11266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_SHAPE_ORDER; k++) { 11276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 11286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 11296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = j; 11306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 11316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2]; 11326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_SHAPE_ORDER; 11336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += SUBFRAMES; 11346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_s[poss++] = sum; 11366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offss += LPC_SHAPE_ORDER; 11386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scaling, mean addition, and gain restoration. */ 11416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin poss = 0; 11426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = 0; 11436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 11446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Ignore gains. */ 11456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += 2; 11466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Low band LAR coefficients. */ 11486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) { 11496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE; 11506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 11516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* High band LAR coefficients. */ 11546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) { 11556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE; 11566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss]; 11576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 11606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeLpcLb(double* LPCCoef_lo, double* LPCCoef_hi, 11636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamdata, ISAC_SaveEncData_t* encData) { 11646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE]; 11656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 11666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Poly2Lar(LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, SUBFRAMES, 11686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lars); 11696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncodeLar(lars, streamdata, encData); 11706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, 11716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin SUBFRAMES); 11726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams (and transcoding). */ 11736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < (ORDERLO + 1)*SUBFRAMES; k++) { 11746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->LPCcoeffs_lo[(ORDERLO + 1)*SUBFRAMES * encData->startIdx + k] = 11756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef_lo[k]; 11766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < (ORDERHI + 1)*SUBFRAMES; k++) { 11786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->LPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * encData->startIdx + k] = 11796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef_hi[k]; 11806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 11816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 11826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11846f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_EncodeLpcUB(double* lpcVecs, Bitstr* streamdata, 11856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* interpolLPCCoeff, 11866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth, 11876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISACUBSaveEncDataStruct* encData) { 11886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 11896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int idx[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 11906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int interpolCntr; 11916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Poly2LarUB(lpcVecs, bandwidth); 11936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_RemoveLarMean(lpcVecs, bandwidth); 11946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecorrelateIntraVec(lpcVecs, U, bandwidth); 11956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecorrelateInterVec(U, lpcVecs, bandwidth); 11966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_QuantizeUncorrLar(lpcVecs, idx, bandwidth); 11976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 11986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth); 11996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth); 12006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_AddLarMean(lpcVecs, bandwidth); 12016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidth) { 12036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 12046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the indices to be used for multiple encoding. */ 12056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER * 12066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_VEC_PER_FRAME * sizeof(int)); 12076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb12, 12086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME); 12096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (interpolCntr = 0; interpolCntr < UB_INTERPOL_SEGMENTS; 12106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interpolCntr++) { 12116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff, 12126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kLpcVecPerSegmentUb12 + 1); 12136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcVecs += UB_LPC_ORDER; 12146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interpolLPCCoeff += (kLpcVecPerSegmentUb12 * (UB_LPC_ORDER + 1)); 12156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 12176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 12196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the indices to be used for multiple encoding. */ 12206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER * 12216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB16_LPC_VEC_PER_FRAME * sizeof(int)); 12226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb16, 12236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME); 12246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (interpolCntr = 0; interpolCntr < UB16_INTERPOL_SEGMENTS; 12256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interpolCntr++) { 12266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff, 12276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kLpcVecPerSegmentUb16 + 1); 12286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcVecs += UB_LPC_ORDER; 12296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interpolLPCCoeff += (kLpcVecPerSegmentUb16 * (UB_LPC_ORDER + 1)); 12306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 12326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 12346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 12356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 12376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 12386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeLpcGainLb(double* LPCCoef_lo, double* LPCCoef_hi, 12406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamdata, 12416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISAC_SaveEncData_t* encData) { 12426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int j, k, n, pos, pos2, posg, offsg, offs2; 12436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_g[KLT_ORDER_GAIN]; 12446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_ovr_g[KLT_ORDER_GAIN]; 12456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs_g[KLT_ORDER_GAIN]; 12466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs2_g[KLT_ORDER_GAIN]; 12476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double sum; 12486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* log gains, mean removal and scaling */ 12496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 12506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 12516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]); 12526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 12536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 12546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 12556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]); 12566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 12576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 12586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 12596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* KLT */ 12626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform. */ 12646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 12656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 12666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 12676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 12686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 12696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offsg; 12706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = k; 12716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_GAIN_ORDER; n++) { 12726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2]; 12736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += LPC_GAIN_ORDER; 12746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_g[posg++] = sum; 12766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 12786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform. */ 12816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 12826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 12836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 12846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 12856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 12866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 12876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 12886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 12896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 12906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++]; 12916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_GAIN_ORDER; 12926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg++] = sum; 12946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += SUBFRAMES; 12966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 12976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 12986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 12996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize coefficients. */ 13006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_GAIN; k++) { 13016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get index. */ 13026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE); 13036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k]; 13046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (index_g[k] < 0) { 13056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = 0; 13066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) { 13076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = WebRtcIsac_kQKltMaxIndGain[k]; 13086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k]; 13106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find quantization levels for coefficients. */ 13126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]]; 13136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams. */ 13156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->LPCindex_g[KLT_ORDER_GAIN * encData->startIdx + k] = index_g[k]; 13166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy coding of quantization indices - gain. */ 13196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, index_g, WebRtcIsac_kQKltCdfPtrGain, 13206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin KLT_ORDER_GAIN); 13216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find quantization levels for coefficients. */ 13236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform. */ 13246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 13256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 13266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 13276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 13286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 13296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 13306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offsg; 13316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 13326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_GAIN_ORDER; n++) 13336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++]; 13346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_g[posg++] = sum; 13356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += LPC_GAIN_ORDER; 13366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 13386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform, transpose matrix. */ 13416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 13426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 13436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 13446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 13456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 13466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 13476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 13486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = j; 13496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 13506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2]; 13516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_GAIN_ORDER; 13526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += SUBFRAMES; 13536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg++] = sum; 13556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 13576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Scaling, mean addition, and gain restoration. */ 13616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 13626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 13636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 13646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += WebRtcIsac_kLpcMeansGain[posg]; 13656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef_lo[k * (LPC_LOBAND_ORDER + 1)] = exp(sum); 13666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos++; 13676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 13686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE; 13696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += WebRtcIsac_kLpcMeansGain[posg]; 13706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin LPCCoef_hi[k * (LPC_HIBAND_ORDER + 1)] = exp(sum); 13716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos++; 13726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 13736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 13746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 13766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeLpcGainUb(double* lpGains, Bitstr* streamdata, 13786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int* lpcGainIndex) { 13796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double U[UB_LPC_GAIN_DIM]; 13806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int idx[UB_LPC_GAIN_DIM]; 13816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ToLogDomainRemoveMean(lpGains); 13826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecorrelateLPGain(lpGains, U); 13836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_QuantizeLpcGain(U, idx); 13846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Store the index for re-encoding for FEC. */ 13856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin memcpy(lpcGainIndex, idx, UB_LPC_GAIN_DIM * sizeof(int)); 13866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateLpcGain(U, lpGains); 13876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_AddMeanToLinearDomain(lpGains); 13886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat, 13896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_GAIN_DIM); 13906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 13916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 13936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_StoreLpcGainUb(double* lpGains, Bitstr* streamdata) { 13946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double U[UB_LPC_GAIN_DIM]; 13956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int idx[UB_LPC_GAIN_DIM]; 13966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_ToLogDomainRemoveMean(lpGains); 13976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecorrelateLPGain(lpGains, U); 13986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_QuantizeLpcGain(U, idx); 13996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat, 14006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_GAIN_DIM); 14016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14056f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodeLpcGainUb(double* lpGains, Bitstr* streamdata) { 14066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double U[UB_LPC_GAIN_DIM]; 14076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int idx[UB_LPC_GAIN_DIM]; 14086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 14096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(idx, streamdata, 14106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcGainCdfMat, 14116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcGainEntropySearch, 14126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_GAIN_DIM); 14136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 14146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 14156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DequantizeLpcGain(idx, U); 14176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateLpcGain(U, lpGains); 14186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_AddMeanToLinearDomain(lpGains); 14196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 14206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* decode & dequantize RC */ 14256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeRc(Bitstr* streamdata, WebRtc_Word16* RCQ15) { 14266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, err; 14276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index[AR_ORDER]; 14286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of quantization indices */ 14306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(index, streamdata, 14316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQArRcCdfPtr, 14326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQArRcInitIndex, AR_ORDER); 14336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) 14346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 14356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization levels for reflection coefficients */ 14376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < AR_ORDER; k++) { 14386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]); 14396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 14416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* quantize & code RC */ 14456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeRc(WebRtc_Word16* RCQ15, Bitstr* streamdata) { 14466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k; 14476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index[AR_ORDER]; 14486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* quantize reflection coefficients (add noise feedback?) */ 14506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < AR_ORDER; k++) { 14516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = WebRtcIsac_kQArRcInitIndex[k]; 14526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k]]) { 14546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k] + 1]) { 14556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k]++; 14566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (RCQ15[k] < WebRtcIsac_kQArBoundaryLevels[--index[k]]) ; 14596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]); 14616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of quantization indices */ 14646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, index, WebRtcIsac_kQArRcCdfPtr, AR_ORDER); 14656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* decode & dequantize squared Gain */ 14696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeGain2(Bitstr* streamdata, WebRtc_Word32* gainQ10) { 14706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index, err; 14716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of quantization index */ 14736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(&index, streamdata, 14746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQGainCdf_ptr, 14756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQGainInitIndex, 1); 14766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 14776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 14786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization level */ 14806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *gainQ10 = WebRtcIsac_kQGain2Levels[index]; 14816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 14826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 14836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* quantize & code squared Gain */ 14866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeGain2(WebRtc_Word32* gainQ10, Bitstr* streamdata) { 14876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index; 14886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 14896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization index */ 14906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index = WebRtcIsac_kQGainInitIndex[0]; 14916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index]) { 14926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index + 1]) { 14936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index++; 14946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 14966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin while (*gainQ10 < WebRtcIsac_kQGain2BoundaryLevels[--index]) ; 14976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 14986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* De-quantize */ 14996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *gainQ10 = WebRtcIsac_kQGain2Levels[index]; 15006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of quantization index */ 15026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, &index, WebRtcIsac_kQGainCdf_ptr, 1); 15036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 15046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 15056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* code and decode Pitch Gains and Lags functions */ 15086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* decode & dequantize Pitch Gains */ 15106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodePitchGain(Bitstr* streamdata, 15116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16* PitchGains_Q12) { 15126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_comb, err; 15136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* WebRtcIsac_kQPitchGainCdf_ptr[1]; 15146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy decoding of quantization indices */ 15166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf; 15176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistBisectMulti(&index_comb, streamdata, 15186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQPitchGainCdf_ptr, 15196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQCdfTableSizeGain, 1); 15206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Error check, Q_mean_Gain.. tables are of size 144 */ 15216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) || (index_comb < 0) || (index_comb > 144)) { 15226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_PITCH_GAIN; 15236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* De-quantize back to pitch gains by table look-up. */ 15256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb]; 15266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb]; 15276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb]; 15286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb]; 15296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 15306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 15316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Quantize & code Pitch Gains. */ 15346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodePitchGain(WebRtc_Word16* PitchGains_Q12, 15356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamdata, 15366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISAC_SaveEncData_t* encData) { 15376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, j; 15386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double C; 15396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double S[PITCH_SUBFRAMES]; 15406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index[3]; 15416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_comb; 15426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* WebRtcIsac_kQPitchGainCdf_ptr[1]; 15436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double PitchGains[PITCH_SUBFRAMES] = {0, 0, 0, 0}; 15446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Take the asin. */ 15466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 15476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096; 15486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin S[k] = asin(PitchGains[k]); 15496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Find quantization index; only for the first three 15526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * transform coefficients. */ 15536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 3; k++) { 15546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* transform */ 15556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = 0.0; 15566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < PITCH_SUBFRAMES; j++) { 15576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C += WebRtcIsac_kTransform[k][j] * S[j]; 15586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Quantize */ 15606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = WebRtcIsac_lrint(C / PITCH_GAIN_STEPSIZE); 15616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Check that the index is not outside the boundaries of the table. */ 15636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (index[k] < WebRtcIsac_kIndexLowerLimitGain[k]) { 15646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = WebRtcIsac_kIndexLowerLimitGain[k]; 15656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (index[k] > WebRtcIsac_kIndexUpperLimitGain[k]) { 15666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = WebRtcIsac_kIndexUpperLimitGain[k]; 15676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] -= WebRtcIsac_kIndexLowerLimitGain[k]; 15696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 15706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Calculate unique overall index. */ 15726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_comb = WebRtcIsac_kIndexMultsGain[0] * index[0] + 15736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kIndexMultsGain[1] * index[1] + index[2]; 15746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* unquantize back to pitch gains by table look-up */ 15766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb]; 15776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb]; 15786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb]; 15796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb]; 15806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of quantization pitch gains */ 15826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf; 15836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, &index_comb, 15846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQPitchGainCdf_ptr, 1); 15856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->pitchGain_index[encData->startIdx] = index_comb; 15866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 15876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 15906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Pitch LAG */ 15916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Decode & de-quantize Pitch Lags. */ 15926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodePitchLag(Bitstr* streamdata, WebRtc_Word16* PitchGain_Q12, 15936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* PitchLags) { 15946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, err; 15956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double StepSize; 15966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double C; 15976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index[PITCH_SUBFRAMES]; 15986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double mean_gain; 15996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* mean_val2, *mean_val3, *mean_val4; 16006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* lower_limit; 16016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* init_index; 16026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16* cdf_size; 16036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16** cdf; 16046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double PitchGain[4] = {0, 0, 0, 0}; 16056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* compute mean pitch gain */ 16076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain = 0.0; 16086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 4; k++) { 16096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096; 16106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain += PitchGain[k]; 16116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain /= 4.0; 16136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* voicing classification. */ 16156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (mean_gain < 0.2) { 16166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeLo; 16176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrLo; 16186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf_size = WebRtcIsac_kQPitchLagCdfSizeLo; 16196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Lo; 16206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Lo; 16216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Lo; 16226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo; 16236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin init_index = WebRtcIsac_kQInitIndexLagLo; 16246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (mean_gain < 0.4) { 16256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeMid; 16266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrMid; 16276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf_size = WebRtcIsac_kQPitchLagCdfSizeMid; 16286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Mid; 16296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Mid; 16306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Mid; 16316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid; 16326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin init_index = WebRtcIsac_kQInitIndexLagMid; 16336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 16346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeHi; 16356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrHi; 16366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf_size = WebRtcIsac_kQPitchLagCdfSizeHi; 16376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Hi; 16386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Hi; 16396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Hi; 16406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQindexLowerLimitLagHi; 16416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin init_index = WebRtcIsac_kQInitIndexLagHi; 16426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy decoding of quantization indices. */ 16456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistBisectMulti(index, streamdata, cdf, cdf_size, 1); 16466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((err < 0) || (index[0] < 0)) { 16476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG; 16486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(index + 1, streamdata, cdf + 1, 16506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin init_index, 3); 16516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 16526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG; 16536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Unquantize back to transform coefficients and do the inverse transform: 16566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * S = T'*C. */ 16576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = (index[0] + lower_limit[0]) * StepSize; 16586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 16596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C; 16606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val2[index[1]]; 16626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 16636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C; 16646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val3[index[2]]; 16666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 16676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C; 16686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val4[index[3]]; 16706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 16716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C; 16726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 16746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 16756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Quantize & code pitch lags. */ 16796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodePitchLag(double* PitchLags, WebRtc_Word16* PitchGain_Q12, 16806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamdata, 16816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ISAC_SaveEncData_t* encData) { 16826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int k, j; 16836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double StepSize; 16846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double C; 16856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index[PITCH_SUBFRAMES]; 16866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double mean_gain; 16876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* mean_val2, *mean_val3, *mean_val4; 16886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* lower_limit, *upper_limit; 16896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_UWord16** cdf; 16906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double PitchGain[4] = {0, 0, 0, 0}; 16916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 16926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* compute mean pitch gain */ 16936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain = 0.0; 16946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 4; k++) { 16956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096; 16966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain += PitchGain[k]; 16976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 16986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_gain /= 4.0; 16996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams */ 17016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->meanGain[encData->startIdx] = mean_gain; 17026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Voicing classification. */ 17046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (mean_gain < 0.2) { 17056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeLo; 17066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrLo; 17076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Lo; 17086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Lo; 17096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Lo; 17106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo; 17116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin upper_limit = WebRtcIsac_kQIndexUpperLimitLagLo; 17126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (mean_gain < 0.4) { 17136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeMid; 17146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrMid; 17156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Mid; 17166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Mid; 17176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Mid; 17186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid; 17196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin upper_limit = WebRtcIsac_kQIndexUpperLimitLagMid; 17206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else { 17216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin StepSize = WebRtcIsac_kQPitchLagStepsizeHi; 17226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin cdf = WebRtcIsac_kQPitchLagCdfPtrHi; 17236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val2 = WebRtcIsac_kQMeanLag2Hi; 17246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val3 = WebRtcIsac_kQMeanLag3Hi; 17256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin mean_val4 = WebRtcIsac_kQMeanLag4Hi; 17266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lower_limit = WebRtcIsac_kQindexLowerLimitLagHi; 17276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin upper_limit = WebRtcIsac_kQindexUpperLimitLagHi; 17286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization index */ 17316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < 4; k++) { 17326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* transform */ 17336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = 0.0; 17346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < PITCH_SUBFRAMES; j++) { 17356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C += WebRtcIsac_kTransform[k][j] * PitchLags[j]; 17366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* quantize */ 17386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = WebRtcIsac_lrint(C / StepSize); 17396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* check that the index is not outside the boundaries of the table */ 17416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (index[k] < lower_limit[k]) { 17426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] = lower_limit[k]; 17436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (index[k] > upper_limit[k]) index[k] = upper_limit[k]; { 17446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index[k] -= lower_limit[k]; 17456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Save data for creation of multiple bit streams */ 17476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin encData->pitchIndex[PITCH_SUBFRAMES * encData->startIdx + k] = index[k]; 17486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Un-quantize back to transform coefficients and do the inverse transform: 17516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * S = T'*C */ 17526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = (index[0] + lower_limit[0]) * StepSize; 17536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 17546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C; 17556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val2[index[1]]; 17576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 17586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C; 17596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val3[index[2]]; 17616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 17626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C; 17636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin C = mean_val4[index[3]]; 17656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < PITCH_SUBFRAMES; k++) { 17666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C; 17676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 17686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of quantization pitch lags */ 17696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, index, cdf, PITCH_SUBFRAMES); 17706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 17716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Routines for in-band signaling of bandwidth estimation */ 17756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Histograms based on uniform distribution of indices */ 17766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Move global variables later! */ 17776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* cdf array for frame length indicator */ 17806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinconst WebRtc_UWord16 WebRtcIsac_kFrameLengthCdf[4] = { 17816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0, 21845, 43690, 65535 }; 17826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* pointer to cdf array for frame length indicator */ 17846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinconst WebRtc_UWord16* WebRtcIsac_kFrameLengthCdf_ptr[1] = { 17856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kFrameLengthCdf }; 17866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* initial cdf index for decoder of frame length indicator */ 17886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinconst WebRtc_UWord16 WebRtcIsac_kFrameLengthInitIndex[1] = { 1 }; 17896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 17916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeFrameLen(Bitstr* streamdata, WebRtc_Word16* framesamples) { 17926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int frame_mode, err; 17936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = 0; 17946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of frame length [1:30ms,2:60ms] */ 17956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(&frame_mode, streamdata, 17966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kFrameLengthCdf_ptr, 17976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kFrameLengthInitIndex, 1); 17986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) 17996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH; 18006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (frame_mode) { 18026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 1: 18036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *framesamples = 480; /* 30ms */ 18046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 18056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 2: 18066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *framesamples = 960; /* 60ms */ 18076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 18086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 18096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = -ISAC_DISALLOWED_FRAME_MODE_DECODER; 18106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 18126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_EncodeFrameLen(WebRtc_Word16 framesamples, Bitstr* streamdata) { 18156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int frame_mode, status; 18166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = 0; 18186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin frame_mode = 0; 18196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy coding of frame length [1:480 samples,2:960 samples] */ 18206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (framesamples) { 18216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 480: 18226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin frame_mode = 1; 18236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 18246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 960: 18256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin frame_mode = 2; 18266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 18276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 18286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin status = - ISAC_DISALLOWED_FRAME_MODE_ENCODER; 18296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (status < 0) 18326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 18336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, &frame_mode, 18356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kFrameLengthCdf_ptr, 1); 18366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return status; 18376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* cdf array for estimated bandwidth */ 18406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kBwCdf[25] = { 18416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 0, 2731, 5461, 8192, 10923, 13653, 16384, 19114, 21845, 24576, 27306, 30037, 18426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 32768, 35498, 38229, 40959, 43690, 46421, 49151, 51882, 54613, 57343, 60074, 18436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 62804, 65535 }; 18446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* pointer to cdf array for estimated bandwidth */ 18466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16* kBwCdfPtr[1] = { kBwCdf }; 18476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* initial cdf index for decoder of estimated bandwidth*/ 18496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinstatic const WebRtc_UWord16 kBwInitIndex[1] = { 7 }; 18506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeSendBW(Bitstr* streamdata, WebRtc_Word16* BWno) { 18536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int BWno32, err; 18546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy decoding of sender's BW estimation [0..23] */ 18566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti(&BWno32, streamdata, kBwCdfPtr, 18576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kBwInitIndex, 1); 18586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 18596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_BANDWIDTH; 18606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *BWno = (WebRtc_Word16)BWno32; 18626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 18636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_EncodeReceiveBw(int* BWno, Bitstr* streamdata) { 18666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* entropy encoding of receiver's BW estimation [0..23] */ 18676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamdata, BWno, kBwCdfPtr, 1); 18686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 18696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* estimate code length of LPC Coef */ 18726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinvoid WebRtcIsac_TranscodeLPCCoef(double* LPCCoef_lo, double* LPCCoef_hi, 18736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int* index_g) { 18746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int j, k, n, pos, pos2, posg, offsg, offs2; 18756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_ovr_g[KLT_ORDER_GAIN]; 18766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs_g[KLT_ORDER_GAIN]; 18776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double tmpcoeffs2_g[KLT_ORDER_GAIN]; 18786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double sum; 18796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* log gains, mean removal and scaling */ 18816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = 0; 18826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < SUBFRAMES; k++) { 18836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]); 18846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 18856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 18866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 18876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]); 18886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg]; 18896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg] *= LPC_GAIN_SCALE; 18906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg++; 18916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 18926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* KLT */ 18946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 18956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Left transform. */ 18966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 18976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 18986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 18996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 19006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 19016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = offsg; 19026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = k; 19036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < LPC_GAIN_ORDER; n++) { 19046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2]; 19056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 += LPC_GAIN_ORDER; 19066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs2_g[posg++] = sum; 19086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 19106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Right transform. */ 19136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg = 0; 19146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 = 0; 19156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (j = 0; j < SUBFRAMES; j++) { 19166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin posg = offsg; 19176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < LPC_GAIN_ORDER; k++) { 19186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum = 0; 19196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos = k; 19206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = offs2; 19216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (n = 0; n < SUBFRAMES; n++) { 19226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++]; 19236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos += LPC_GAIN_ORDER; 19246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[posg++] = sum; 19266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offs2 += SUBFRAMES; 19286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin offsg += LPC_GAIN_ORDER; 19296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* quantize coefficients */ 19336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for (k = 0; k < KLT_ORDER_GAIN; k++) { 19346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Get index. */ 19356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE); 19366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k]; 19376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (index_g[k] < 0) { 19386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = 0; 19396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) { 19406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_g[k] = WebRtcIsac_kQKltMaxIndGain[k]; 19416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k]; 19436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* find quantization levels for coefficients */ 19456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]]; 19466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 19486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* Decode & de-quantize LPC Coefficients. */ 19516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkinint WebRtcIsac_DecodeLpcCoefUB(Bitstr* streamdata, double* lpcVecs, 19526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* percepFilterGains, 19536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) { 19546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int index_s[KLT_ORDER_SHAPE]; 19556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; 19576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int err; 19586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Entropy decoding of quantization indices. */ 19606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidth) { 19616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 19626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti( 19636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb12, 19646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcShapeEntropySearchUb12, UB_LPC_ORDER * 19656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB_LPC_VEC_PER_FRAME); 19666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 19676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 19696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin err = WebRtcIsac_DecHistOneStepMulti( 19706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb16, 19716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kLpcShapeEntropySearchUb16, UB_LPC_ORDER * 19726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin UB16_LPC_VEC_PER_FRAME); 19736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 19746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 19766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 19776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (err < 0) { 19806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return err; 19816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DequantizeLpcParam(index_s, lpcVecs, bandwidth); 19846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth); 19856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth); 19866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_AddLarMean(lpcVecs, bandwidth); 19876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecodeLpcGainUb(percepFilterGains, streamdata); 19886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (bandwidth == isac16kHz) { 19906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Decode another set of Gains. */ 19916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_DecodeLpcGainUb(&percepFilterGains[SUBFRAMES], streamdata); 19926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 19936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 19946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 19956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 19966f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_EncodeBandwidth(enum ISACBandwidth bandwidth, 19976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamData) { 19986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int bandwidthMode; 19996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidth) { 20006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: { 20016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bandwidthMode = 0; 20026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 20036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: { 20056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin bandwidthMode = 1; 20066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 20076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 20096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_ENCODER_BANDWIDTH; 20106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamData, &bandwidthMode, kOneBitEqualProbCdf_ptr, 20126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1); 20136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 20146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 20156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20166f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodeBandwidth(Bitstr* streamData, 20176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin enum ISACBandwidth* bandwidth) { 20186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int bandwidthMode; 20196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_DecHistOneStepMulti(&bandwidthMode, streamData, 20206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kOneBitEqualProbCdf_ptr, 20216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kOneBitEqualProbInitIndex, 1) < 0) { 20226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_BANDWITH; 20236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch (bandwidthMode) { 20256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 0: { 20266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bandwidth = isac12kHz; 20276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 20286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case 1: { 20306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *bandwidth = isac16kHz; 20316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 20326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 20346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_DISALLOWED_BANDWIDTH_MODE_DECODER; 20356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 20376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 20386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20396f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_EncodeJitterInfo(WebRtc_Word32 jitterIndex, 20406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin Bitstr* streamData) { 20416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* This is to avoid LINUX warning until we change 'int' to 'Word32'. */ 20426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int intVar; 20436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if ((jitterIndex < 0) || (jitterIndex > 1)) { 20456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 20466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin intVar = (int)(jitterIndex); 20486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Use the same CDF table as for bandwidth 20496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * both take two values with equal probability.*/ 20506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_EncHistMulti(streamData, &intVar, kOneBitEqualProbCdf_ptr, 1); 20516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 20526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 20536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 20546f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecodeJitterInfo(Bitstr* streamData, 20556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32* jitterInfo) { 20566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int intVar; 20576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin /* Use the same CDF table as for bandwidth 20586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * both take two values with equal probability. */ 20596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if (WebRtcIsac_DecHistOneStepMulti(&intVar, streamData, 20606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kOneBitEqualProbCdf_ptr, 20616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin kOneBitEqualProbInitIndex, 1) < 0) { 20626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -ISAC_RANGE_ERROR_DECODE_BANDWITH; 20636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 20646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *jitterInfo = (WebRtc_Word16)(intVar); 20656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 20666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2067