diff intercom/ilbc/StateConstructW.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/StateConstructW.c	Fri Jun 25 09:57:52 2010 +0200
@@ -0,0 +1,69 @@
+
+   /******************************************************************
+
+       iLBC Speech Coder ANSI-C Source Code
+
+       StateConstructW.c
+
+       Copyright (C) The Internet Society (2004).
+       All Rights Reserved.
+
+   ******************************************************************/
+
+#include <math.h>
+#include <string.h>
+
+#include "iLBC_define.h"
+#include "constants.h"
+#include "filter.h"
+
+   /*----------------------------------------------------------------*
+    *  decoding of the start state
+    *---------------------------------------------------------------*/
+
+void StateConstructW(int idxForMax,     /* (i) 6-bit index for the quantization of
+                                           max amplitude */
+  int *idxVec,                  /* (i) vector of quantization indexes */
+  float *syntDenum,             /* (i) synthesis filter denumerator */
+  float *out,                   /* (o) the decoded state vector */
+  int len                       /* (i) length of a state vector */
+  )
+{
+  float maxVal, tmpbuf[LPC_FILTERORDER + 2 * STATE_LEN], *tmp,
+    numerator[LPC_FILTERORDER + 1];
+  float foutbuf[LPC_FILTERORDER + 2 * STATE_LEN], *fout;
+  int k, tmpi;
+
+  /* decoding of the maximum value */
+
+  maxVal = state_frgqTbl[idxForMax];
+  maxVal = (float) pow(10, maxVal) / (float) 4.5;
+
+  /* initialization of buffers and coefficients */
+
+  memset(tmpbuf, 0, LPC_FILTERORDER * sizeof(float));
+  memset(foutbuf, 0, LPC_FILTERORDER * sizeof(float));
+  for (k = 0; k < LPC_FILTERORDER; k++) {
+    numerator[k] = syntDenum[LPC_FILTERORDER - k];
+  }
+  numerator[LPC_FILTERORDER] = syntDenum[0];
+  tmp = &tmpbuf[LPC_FILTERORDER];
+  fout = &foutbuf[LPC_FILTERORDER];
+
+  /* decoding of the sample values */
+
+  for (k = 0; k < len; k++) {
+    tmpi = len - 1 - k;
+    /* maxVal = 1/scal */
+    tmp[k] = maxVal * state_sq3Tbl[idxVec[tmpi]];
+  }
+
+  /* circular convolution with all-pass filter */
+
+  memset(tmp + len, 0, len * sizeof(float));
+  ZeroPoleFilter(tmp, numerator, syntDenum, 2 * len,
+    LPC_FILTERORDER, fout);
+  for (k = 0; k < len; k++) {
+    out[k] = fout[len - 1 - k] + fout[2 * len - 1 - k];
+  }
+}

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