16f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/* 26f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Copyright (c) 2011 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 * code_LPC_UB.c 136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This file contains definition of functions used to 156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * encode LPC parameters (Shape & gain) of the upper band. 166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "encode_lpc_swb.h" 206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "typedefs.h" 216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "settings.h" 226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb12_tables.h" 246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_shape_swb16_tables.h" 256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include "lpc_gain_swb_tables.h" 266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <stdio.h> 286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <string.h> 296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin#include <math.h> 306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_RemoveLarMean() 336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Remove the means from LAR coefficients. 356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lar : pointer to lar vectors. LAR vectors are 386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * concatenated. 396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lar : pointer to mean-removed LAR:s. 446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 476f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 486f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_RemoveLarMean( 496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* lar, 506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 vecCntr; 546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVec; 556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* meanLAR; 566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB_LPC_VEC_PER_FRAME; 616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin meanLAR = WebRtcIsac_kMeanLarUb12; 626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB16_LPC_VEC_PER_FRAME; 676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin meanLAR = WebRtcIsac_kMeanLarUb16; 686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(vecCntr = 0; vecCntr < numVec; vecCntr++) 756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) 776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // REMOVE MEAN 796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *lar++ -= meanLAR[coeffCntr]; 806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecorrelateIntraVec() 876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Remove the correlation amonge the components of LAR vectors. If LAR vectors 896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of one frame are put in a matrix where each column is a LAR vector of a 906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * sub-frame, then this is equivalent to multiplying the LAR matrix with 916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * a decorrelting mtrix from left. 926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -inLar : pointer to mean-removed LAR vecrtors. 956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : decorrelated LAR vectors. 1006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 1016f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 1026f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_DecorrelateIntraVec( 1036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 1046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out, 1056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 1066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 1076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* ptrData; 1086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* ptrRow; 1096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 1106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 1116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 larVecCntr; 1126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVec; 1136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* decorrMat; 1146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 1156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 1176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decorrMat = &WebRtcIsac_kIntraVecDecorrMatUb12[0][0]; 1196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB_LPC_VEC_PER_FRAME; 1206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 1216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 1236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decorrMat = &WebRtcIsac_kIintraVecDecorrMatUb16[0][0]; 1256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB16_LPC_VEC_PER_FRAME; 1266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 1276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 1296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 1306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 1336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // decorrMat * data 1346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 1356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // data is assumed to contain 'numVec' of LAR 1366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // vectors (mean removed) each of dimension 'UB_LPC_ORDER' 1376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // concatenated one after the other. 1386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 1396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrData = data; 1416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(larVecCntr = 0; larVecCntr < numVec; larVecCntr++) 1426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < UB_LPC_ORDER; rowCntr++) 1446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrRow = &decorrMat[rowCntr * UB_LPC_ORDER]; 1466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out = 0; 1476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < UB_LPC_ORDER; colCntr++) 1486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out += ptrData[colCntr] * ptrRow[colCntr]; 1506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out++; 1526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrData += UB_LPC_ORDER; 1546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 1566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 1576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 1596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecorrelateInterVec() 1606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Remover the correlation among mean-removed LAR vectors. If LAR vectors 1626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * of one frame are put in a matrix where each column is a LAR vector of a 1636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * sub-frame, then this is equivalent to multiplying the LAR matrix with 1646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * a decorrelting mtrix from right. 1656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 1676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : pointer to matrix of LAR vectors. The matrix 1686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * is stored column-wise. 1696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 1706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 1716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 1726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 1736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : decorrelated LAR vectors. 1746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 1756f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 1766f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_DecorrelateInterVec( 1776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 1786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out, 1796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 1806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 1816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 1826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 1836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 1846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* decorrMat; 1856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 interVecDim; 1866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 1876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 1886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 1906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decorrMat = &WebRtcIsac_kInterVecDecorrMatUb12[0][0]; 1926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB_LPC_VEC_PER_FRAME; 1936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 1946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 1956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 1966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 1976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decorrMat = &WebRtcIsac_kInterVecDecorrMatUb16[0][0]; 1986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB16_LPC_VEC_PER_FRAME; 1996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 2006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 2026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 2036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 2066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // data * decorrMat 2076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 2086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // data is of size 'interVecDim' * 'UB_LPC_ORDER' 2096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // That is 'interVecDim' of LAR vectors (mean removed) 2106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // in columns each of dimension 'UB_LPC_ORDER'. 2116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // matrix is stored column-wise. 2126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 2136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) 2156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < interVecDim; colCntr++) 2176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out[coeffCntr + colCntr * UB_LPC_ORDER] = 0; 2196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < interVecDim; rowCntr++) 2206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out[coeffCntr + colCntr * UB_LPC_ORDER] += 2226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin data[coeffCntr + rowCntr * UB_LPC_ORDER] * 2236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin decorrMat[rowCntr * interVecDim + colCntr]; 2246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 2316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_QuantizeUncorrLar() 2326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Quantize the uncorrelated parameters. 2346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 2366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : uncorrelated LAR vectors. 2376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 2386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 2396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 2406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 2416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : quantized version of the input. 2426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -idx : pointer to quantization indices. 2436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 2446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkindouble 2456f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_QuantizeUncorrLar( 2466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* data, 2476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int* recIdx, 2486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 2496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 2506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 cntr; 2516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word32 idx; 2526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 interVecDim; 2536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* leftRecPoint; 2546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double quantizationStepSize; 2556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const WebRtc_Word16* numQuantCell; 2566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 2576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 2596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin leftRecPoint = WebRtcIsac_kLpcShapeLeftRecPointUb12; 2616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb12; 2626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numQuantCell = WebRtcIsac_kLpcShapeNumRecPointUb12; 2636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB_LPC_VEC_PER_FRAME; 2646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 2656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 2676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin leftRecPoint = WebRtcIsac_kLpcShapeLeftRecPointUb16; 2696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb16; 2706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numQuantCell = WebRtcIsac_kLpcShapeNumRecPointUb16; 2716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB16_LPC_VEC_PER_FRAME; 2726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 2736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 2756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 2766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 2796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // Quantize the parametrs. 2806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 2816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(cntr = 0; cntr < UB_LPC_ORDER * interVecDim; cntr++) 2826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx = (WebRtc_Word32)floor((*data - leftRecPoint[cntr]) / 2846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin quantizationStepSize + 0.5); 2856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if(idx < 0) 2866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx = 0; 2886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin else if(idx >= numQuantCell[cntr]) 2906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 2916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx = numQuantCell[cntr] - 1; 2926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 2946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *data++ = leftRecPoint[cntr] + idx * quantizationStepSize; 2956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *recIdx++ = idx; 2966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 2976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 2986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 2996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 3026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DequantizeLpcParam() 3036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Get the quantized value of uncorrelated LARs given the quantization indices. 3056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 3076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -idx : pointer to quantiztion indices. 3086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 3096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 3106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 3126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : pointer to quantized values. 3136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 3146f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 3156f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_DequantizeLpcParam( 3166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const int* idx, 3176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out, 3186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 3196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 3206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 cntr; 3216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 interVecDim; 3226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* leftRecPoint; 3236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double quantizationStepSize; 3246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 3266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 3286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin leftRecPoint = WebRtcIsac_kLpcShapeLeftRecPointUb12; 3306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb12; 3316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB_LPC_VEC_PER_FRAME; 3326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 3356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin leftRecPoint = WebRtcIsac_kLpcShapeLeftRecPointUb16; 3376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb16; 3386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB16_LPC_VEC_PER_FRAME; 3396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 3426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 3436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 3466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // Dequantize given the quantization indices 3476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin // 3486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(cntr = 0; cntr < UB_LPC_ORDER * interVecDim; cntr++) 3506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out++ = leftRecPoint[cntr] + *idx++ * quantizationStepSize; 3526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 3546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 3556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 3586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_CorrelateIntraVec() 3596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is the inverse of WebRtcIsac_DecorrelateIntraVec(). 3616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 3636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : uncorrelated parameters. 3646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 3656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 3666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 3676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 3686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : correlated parametrs. 3696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 3706f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 3716f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_CorrelateIntraVec( 3726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 3736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out, 3746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 3756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 3766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 vecCntr; 3776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 3786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 3796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVec; 3806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* ptrData; 3816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* intraVecDecorrMat; 3826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 3836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 3846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 3866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB_LPC_VEC_PER_FRAME; 3886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin intraVecDecorrMat = &WebRtcIsac_kIntraVecDecorrMatUb12[0][0]; 3896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 3926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 3936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB16_LPC_VEC_PER_FRAME; 3946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin intraVecDecorrMat = &WebRtcIsac_kIintraVecDecorrMatUb16[0][0]; 3956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 3966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 3976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 3986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 3996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrData = data; 4036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(vecCntr = 0; vecCntr < numVec; vecCntr++) 4046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < UB_LPC_ORDER; colCntr++) 4066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out = 0; 4086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < UB_LPC_ORDER; rowCntr++) 4096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out += ptrData[rowCntr] * 4116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin intraVecDecorrMat[rowCntr * UB_LPC_ORDER + colCntr]; 4126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out++; 4146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin ptrData += UB_LPC_ORDER; 4166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 4186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 4196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 4216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_CorrelateInterVec() 4226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is the inverse of WebRtcIsac_DecorrelateInterVec(). 4246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 4266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data 4276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 4286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 4296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 4316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : correlated parametrs. 4326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 4336f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 4346f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_CorrelateInterVec( 4356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 4366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out, 4376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 4386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 4396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 4406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 4416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 4426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 interVecDim; 4436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double myVec[UB16_LPC_VEC_PER_FRAME]; 4446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* interVecDecorrMat; 4456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 4476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 4496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB_LPC_VEC_PER_FRAME; 4516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDecorrMat = &WebRtcIsac_kInterVecDecorrMatUb12[0][0]; 4526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 4536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 4556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDim = UB16_LPC_VEC_PER_FRAME; 4576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDecorrMat = &WebRtcIsac_kInterVecDecorrMatUb16[0][0]; 4586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 4596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 4616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 4626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) 4656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < interVecDim; rowCntr++) 4676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin myVec[rowCntr] = 0; 4696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < interVecDim; colCntr++) 4706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin myVec[rowCntr] += data[coeffCntr + colCntr * UB_LPC_ORDER] * //*ptrData * 4726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin interVecDecorrMat[rowCntr * interVecDim + colCntr]; 4736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin //ptrData += UB_LPC_ORDER; 4746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < interVecDim; rowCntr++) 4786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 4796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out[coeffCntr + rowCntr * UB_LPC_ORDER] = myVec[rowCntr]; 4806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 4826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 4836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 4846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 4856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 4866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_AddLarMean() 4876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is the inverse of WebRtcIsac_RemoveLarMean() 4896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 4916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : pointer to mean-removed LAR:s. 4926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -bandwidth : indicates if the given LAR vectors belong 4936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * to SWB-12kHz or SWB-16kHz. 4946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 4956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 4966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : pointer to LARs. 4976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 4986f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 4996f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_AddLarMean( 5006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* data, 5016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 bandwidth) 5026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 5036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 5046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 vecCntr; 5056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 numVec; 5066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* meanLAR; 5076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin switch(bandwidth) 5096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac12kHz: 5116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB_LPC_VEC_PER_FRAME; 5136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin meanLAR = WebRtcIsac_kMeanLarUb12; 5146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin case isac16kHz: 5176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin numVec = UB16_LPC_VEC_PER_FRAME; 5196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin meanLAR = WebRtcIsac_kMeanLarUb16; 5206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin break; 5216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin default: 5236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return -1; 5246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(vecCntr = 0; vecCntr < numVec; vecCntr++) 5276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) 5296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *data++ += meanLAR[coeffCntr]; 5316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 5356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 5376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_ToLogDomainRemoveMean() 5386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Transform the LPC gain to log domain then remove the mean value. 5406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5416f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 5426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : pointer to LPC Gain, expecting 6 LPC gains 5436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 5456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : mean-removed in log domain. 5466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 5476f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 5486f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtcIsac_ToLogDomainRemoveMean( 5496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* data) 5506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 5516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 5526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++) 5536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin data[coeffCntr] = log(data[coeffCntr]) - WebRtcIsac_kMeanLpcGain; 5556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 5586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 5616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DecorrelateLPGain() 5626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Decorrelate LPC gains. There are 6 LPC Gains per frame. This is like 5646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * multiplying gain vector with decorrelating matrix. 5656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 5676f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : LPC gain in log-domain with mean removed. 5686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 5706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : decorrelated parameters. 5716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 5726f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DecorrelateLPGain( 5736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 5746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out) 5756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 5766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 5776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 5786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < UB_LPC_GAIN_DIM; colCntr++) 5806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out = 0; 5826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < UB_LPC_GAIN_DIM; rowCntr++) 5836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 5846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out += data[rowCntr] * WebRtcIsac_kLpcGainDecorrMat[rowCntr][colCntr]; 5856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out++; 5876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 5886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 5896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 5906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 5916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 5926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_QuantizeLpcGain() 5936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Quantize the decorrelated log-domain gains. 5956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 5976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : uncorrelated LPC gains. 5986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 5996f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 6006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -idx : quantization indices 6016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : quantized value of the inpt. 6026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 6036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkindouble WebRtcIsac_QuantizeLpcGain( 6046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* data, 6056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin int* idx) 6066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 6076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 6086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++) 6096f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6106f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *idx = (int)floor((*data - WebRtcIsac_kLeftRecPointLpcGain[coeffCntr]) / 6116f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQSizeLpcGain + 0.5); 6126f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6136f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin if(*idx < 0) 6146f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6156f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *idx = 0; 6166f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6176f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin else if(*idx >= WebRtcIsac_kNumQCellLpcGain[coeffCntr]) 6186f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6196f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *idx = WebRtcIsac_kNumQCellLpcGain[coeffCntr] - 1; 6206f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6216f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *data = WebRtcIsac_kLeftRecPointLpcGain[coeffCntr] + *idx * 6226f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQSizeLpcGain; 6236f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6246f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin data++; 6256f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx++; 6266f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6276f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6286f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6296f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6306f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 6316f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_DequantizeLpcGain() 6326f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6336f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Get the quantized values given the quantization indices. 6346f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6356f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 6366f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -idx : pointer to quantization indices. 6376f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6386f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 6396f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGains : quantized values of the given parametes. 6406f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 6416f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_DequantizeLpcGain( 6426f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const int* idx, 6436f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out) 6446f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 6456f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 6466f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++) 6476f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6486f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out = WebRtcIsac_kLeftRecPointLpcGain[coeffCntr] + *idx * 6496f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtcIsac_kQSizeLpcGain; 6506f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out++; 6516f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin idx++; 6526f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6536f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6546f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6556f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6566f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 6576f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_CorrelateLpcGain() 6586f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6596f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is the inverse of WebRtcIsac_DecorrelateLPGain(). 6606f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6616f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 6626f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -data : decorrelated parameters. 6636f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6646f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 6656f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -out : correlated parameters. 6666f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 6676f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_CorrelateLpcGain( 6686f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin const double* data, 6696f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* out) 6706f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 6716f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 rowCntr; 6726f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 colCntr; 6736f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6746f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(rowCntr = 0; rowCntr < UB_LPC_GAIN_DIM; rowCntr++) 6756f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6766f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out = 0; 6776f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(colCntr = 0; colCntr < UB_LPC_GAIN_DIM; colCntr++) 6786f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 6796f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin *out += WebRtcIsac_kLpcGainDecorrMat[rowCntr][colCntr] * data[colCntr]; 6806f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6816f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin out++; 6826f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 6836f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6846f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 6856f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 6866f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6876f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin 6886f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin/****************************************************************************** 6896f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * WebRtcIsac_AddMeanToLinearDomain() 6906f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6916f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * This is the inverse of WebRtcIsac_ToLogDomainRemoveMean(). 6926f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6936f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Input: 6946f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : LPC gain in log-domain & mean removed 6956f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * 6966f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * Output: 6976f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin * -lpcGain : LPC gain in normal domain. 6986f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin */ 6996f12fff925188ced26e518cd2252aff3e93bb04eAlexander GutkinWebRtc_Word16 WebRtcIsac_AddMeanToLinearDomain( 7006f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin double* lpcGains) 7016f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin{ 7026f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin WebRtc_Word16 coeffCntr; 7036f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++) 7046f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin { 7056f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin lpcGains[coeffCntr] = exp(lpcGains[coeffCntr] + WebRtcIsac_kMeanLpcGain); 7066f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin } 7076f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin return 0; 7086f12fff925188ced26e518cd2252aff3e93bb04eAlexander Gutkin} 709