diff intercom/ilbc/gainquant.c @ 2:13be24d74cd2

import intercom-0.4.1
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 09:57:52 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/intercom/ilbc/gainquant.c	Fri Jun 25 09:57:52 2010 +0200
@@ -0,0 +1,111 @@
+
+   /******************************************************************
+
+       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;
+}

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.