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