/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "spectrum_ar_model_tables.h"
#include "settings.h"

/********************* AR Coefficient Tables ************************/
/* cdf for quantized reflection coefficient 1 */
const WebRtc_UWord16 WebRtcIsac_kQArRc1Cdf[12] = {
 0,  2,  4,  129,  7707,  57485,  65495,  65527,  65529,  65531,
 65533,  65535};

/* cdf for quantized reflection coefficient 2 */
const WebRtc_UWord16 WebRtcIsac_kQArRc2Cdf[12] = {
 0,  2,  4,  7,  531,  25298,  64525,  65526,  65529,  65531,
 65533,  65535};

/* cdf for quantized reflection coefficient 3 */
const WebRtc_UWord16 WebRtcIsac_kQArRc3Cdf[12] = {
 0,  2,  4,  6,  620,  22898,  64843,  65527,  65529,  65531,
 65533,  65535};

/* cdf for quantized reflection coefficient 4 */
const WebRtc_UWord16 WebRtcIsac_kQArRc4Cdf[12] = {
 0,  2,  4,  6,  35,  10034,  60733,  65506,  65529,  65531,
 65533,  65535};

/* cdf for quantized reflection coefficient 5 */
const WebRtc_UWord16 WebRtcIsac_kQArRc5Cdf[12] = {
 0,  2,  4,  6,  36,  7567,  56727,  65385,  65529,  65531,
 65533,  65535};

/* cdf for quantized reflection coefficient 6 */
const WebRtc_UWord16 WebRtcIsac_kQArRc6Cdf[12] = {
 0,  2,  4,  6,  14,  6579,  57360,  65409,  65529,  65531,
 65533,  65535};

/* representation levels for quantized reflection coefficient 1 */
const WebRtc_Word16 WebRtcIsac_kQArRc1Levels[11] = {
 -32104, -29007, -23202, -15496, -9279, -2577, 5934, 17535, 24512, 29503, 32104
};

/* representation levels for quantized reflection coefficient 2 */
const WebRtc_Word16 WebRtcIsac_kQArRc2Levels[11] = {
 -32104, -29503, -23494, -15261, -7309, -1399, 6158, 16381, 24512, 29503, 32104
};

/* representation levels for quantized reflection coefficient 3 */
const WebRtc_Word16 WebRtcIsac_kQArRc3Levels[11] = {
-32104, -29503, -23157, -15186, -7347, -1359, 5829, 17535, 24512, 29503, 32104
};

/* representation levels for quantized reflection coefficient 4 */
const WebRtc_Word16 WebRtcIsac_kQArRc4Levels[11] = {
-32104, -29503, -24512, -15362, -6665, -342, 6596, 14585, 24512, 29503, 32104
};

/* representation levels for quantized reflection coefficient 5 */
const WebRtc_Word16 WebRtcIsac_kQArRc5Levels[11] = {
-32104, -29503, -24512, -15005, -6564, -106, 7123, 14920, 24512, 29503, 32104
};

/* representation levels for quantized reflection coefficient 6 */
const WebRtc_Word16 WebRtcIsac_kQArRc6Levels[11] = {
-32104, -29503, -24512, -15096, -6656, -37, 7036, 14847, 24512, 29503, 32104
};

/* quantization boundary levels for reflection coefficients */
const WebRtc_Word16 WebRtcIsac_kQArBoundaryLevels[12] = {
-32768, -31441, -27566, -21458, -13612, -4663, 4663, 13612, 21458, 27566, 31441, 32767
};

/* initial index for AR reflection coefficient quantizer and cdf table search */
const WebRtc_UWord16 WebRtcIsac_kQArRcInitIndex[6] = {
 5,  5,  5,  5,  5,  5};

/* pointers to AR cdf tables */
const WebRtc_UWord16 *WebRtcIsac_kQArRcCdfPtr[AR_ORDER] = {
  WebRtcIsac_kQArRc1Cdf, WebRtcIsac_kQArRc2Cdf, WebRtcIsac_kQArRc3Cdf,
  WebRtcIsac_kQArRc4Cdf, WebRtcIsac_kQArRc5Cdf, WebRtcIsac_kQArRc6Cdf
};

/* pointers to AR representation levels tables */
const WebRtc_Word16 *WebRtcIsac_kQArRcLevelsPtr[AR_ORDER] = {
  WebRtcIsac_kQArRc1Levels, WebRtcIsac_kQArRc2Levels, WebRtcIsac_kQArRc3Levels,
  WebRtcIsac_kQArRc4Levels, WebRtcIsac_kQArRc5Levels, WebRtcIsac_kQArRc6Levels
};


/******************** GAIN Coefficient Tables ***********************/
/* cdf for Gain coefficient */
const WebRtc_UWord16 WebRtcIsac_kQGainCdf[19] = {
 0,  2,  4,  6,  8,  10,  12,  14,  16,  1172,
 11119,  29411,  51699,  64445,  65527,  65529,  65531,  65533,  65535};

/* representation levels for quantized squared Gain coefficient */
const WebRtc_Word32 WebRtcIsac_kQGain2Levels[18] = {
// 17, 28, 46, 76, 128, 215, 364, 709, 1268, 1960, 3405, 6078, 11286, 17827, 51918, 134498, 487432, 2048000};
 128, 128, 128, 128, 128, 215, 364, 709, 1268, 1960, 3405, 6078, 11286, 17827, 51918, 134498, 487432, 2048000};
/* quantization boundary levels for squared Gain coefficient */
const WebRtc_Word32 WebRtcIsac_kQGain2BoundaryLevels[19] = {
0, 21, 35, 59, 99, 166, 280, 475, 815, 1414, 2495, 4505, 8397, 16405, 34431, 81359, 240497, 921600, 0x7FFFFFFF};

/* pointers to Gain cdf table */
const WebRtc_UWord16 *WebRtcIsac_kQGainCdf_ptr[1] = {WebRtcIsac_kQGainCdf};

/* Gain initial index for gain quantizer and cdf table search */
const WebRtc_UWord16 WebRtcIsac_kQGainInitIndex[1] = {11};

/************************* Cosine Tables ****************************/
/* Cosine table */
const WebRtc_Word16 WebRtcIsac_kCos[6][60] = {
{512,  512,  511,  510,  508,  507,  505,  502,  499,  496,  493,  489,  485,  480,  476,  470,  465,  459,  453,  447,
440,  433,  426,  418,  410,  402,  394,  385,  376,  367,  357,  348,  338,  327,  317,  306,  295,  284,  273,  262,
250,  238,  226,  214,  202,  190,  177,  165,  152,  139,  126,  113,  100,  87,  73,  60,  47,  33,  20,  7},
{512,  510,  508,  503,  498,  491,  483,  473,  462,  450,  437,  422,  406,  389,  371,  352,  333,  312,  290,  268,
244,  220,  196,  171,  145,  120,  93,  67,  40,  13,  -13,  -40,  -67,  -93,  -120,  -145,  -171,  -196,  -220,  -244,
-268,  -290,  -312,  -333,  -352,  -371,  -389,  -406,  -422,  -437,  -450,  -462,  -473,  -483,  -491,  -498,  -503,  -508,  -510,  -512},
{512,  508,  502,  493,  480,  465,  447,  426,  402,  376,  348,  317,  284,  250,  214,  177,  139,  100,  60,  20,
-20,  -60,  -100,  -139,  -177,  -214,  -250,  -284,  -317,  -348,  -376,  -402,  -426,  -447,  -465,  -480,  -493,  -502,  -508,  -512,
-512,  -508,  -502,  -493,  -480,  -465,  -447,  -426,  -402,  -376,  -348,  -317,  -284,  -250,  -214,  -177,  -139,  -100,  -60,  -20},
{511,  506,  495,  478,  456,  429,  398,  362,  322,  279,  232,  183,  133,  80,  27,  -27,  -80,  -133,  -183,  -232,
-279,  -322,  -362,  -398,  -429,  -456,  -478,  -495,  -506,  -511,  -511,  -506,  -495,  -478,  -456,  -429,  -398,  -362,  -322,  -279,
-232,  -183,  -133,  -80,  -27,  27,  80,  133,  183,  232,  279,  322,  362,  398,  429,  456,  478,  495,  506,  511},
{511,  502,  485,  459,  426,  385,  338,  284,  226,  165,  100,  33,  -33,  -100,  -165,  -226,  -284,  -338,  -385,  -426,
-459,  -485,  -502,  -511,  -511,  -502,  -485,  -459,  -426,  -385,  -338,  -284,  -226,  -165,  -100,  -33,  33,  100,  165,  226,
284,  338,  385,  426,  459,  485,  502,  511,  511,  502,  485,  459,  426,  385,  338,  284,  226,  165,  100,  33},
{510,  498,  473,  437,  389,  333,  268,  196,  120,  40,  -40,  -120,  -196,  -268,  -333,  -389,  -437,  -473,  -498,  -510,
-510,  -498,  -473,  -437,  -389,  -333,  -268,  -196,  -120,  -40,  40,  120,  196,  268,  333,  389,  437,  473,  498,  510,
510,  498,  473,  437,  389,  333,  268,  196,  120,  40,  -40,  -120,  -196,  -268,  -333,  -389,  -437,  -473,  -498,  -510}
};
