
   /******************************************************************

       iLBC Speech Coder ANSI-C Source Code






       gainquant.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

   ******************************************************************/

#include <string.h>
#include <math.h>
#include "constants.h"
#include "filter.h"

   /*----------------------------------------------------------------*
    *  quantizer for the gain in the gain-shape coding of residual
    *---------------------------------------------------------------*/

float gainquant(                /* (o) quantized gain value */
  float in,                     /* (i) gain value */
  float maxIn,                  /* (i) maximum of gain value */
  int cblen,                    /* (i) number of quantization indices */
  int *index                    /* (o) quantization index */
  )
{
  int i, tindex;
  float minmeasure, measure, *cb, scale;

  /* ensure a lower bound on the scaling factor */

  scale = maxIn;

  if (scale < 0.1) {
    scale = (float) 0.1;
  }

  /* select the quantization table */

  if (cblen == 8) {
    cb = gain_sq3Tbl;
  } else if (cblen == 16) {
    cb = gain_sq4Tbl;
  } else {
    cb = gain_sq5Tbl;
  }

  /* select the best index in the quantization table */

  minmeasure = 10000000.0;
  tindex = 0;
  for (i = 0; i < cblen; i++) {





    measure = (in - scale * cb[i]) * (in - scale * cb[i]);

    if (measure < minmeasure) {
      tindex = i;
      minmeasure = measure;
    }
  }
  *index = tindex;

  /* return the quantized value */

  return scale * cb[tindex];
}

   /*----------------------------------------------------------------*
    *  decoder for quantized gains in the gain-shape coding of
    *  residual
    *---------------------------------------------------------------*/

float gaindequant(              /* (o) quantized gain value */
  int index,                    /* (i) quantization index */
  float maxIn,                  /* (i) maximum of unquantized gain */
  int cblen                     /* (i) number of quantization indices */
  )
{
  float scale;

  /* obtain correct scale factor */

  scale = (float) fabs(maxIn);

  if (scale < 0.1) {
    scale = (float) 0.1;
  }

  /* select the quantization table and return the decoded value */

  if (cblen == 8) {
    return scale * gain_sq3Tbl[index];
  } else if (cblen == 16) {
    return scale * gain_sq4Tbl[index];
  } else if (cblen == 32) {
    return scale * gain_sq5Tbl[index];
  }

  return 0.0;
}
