Mercurial > hg > audiostuff
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]; + } +}