Mercurial > hg > audiostuff
diff intercom/ilbc/iCBConstruct.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/iCBConstruct.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,109 @@ + + /****************************************************************** + + iLBC Speech Coder ANSI-C Source Code + + iCBConstruct.c + + Copyright (C) The Internet Society (2004). + All Rights Reserved. + + ******************************************************************/ + +#include <math.h> + +#include "iLBC_define.h" +#include "gainquant.h" +#include "getCBvec.h" + + /*----------------------------------------------------------------* + * Convert the codebook indexes to make the search easier + *---------------------------------------------------------------*/ + + + + + + +void index_conv_enc(int *index /* (i/o) Codebook indexes */ + ) +{ + int k; + + for (k = 1; k < CB_NSTAGES; k++) { + + if ((index[k] >= 108) && (index[k] < 172)) { + index[k] -= 64; + } else if (index[k] >= 236) { + index[k] -= 128; + } else { + /* ERROR */ + } + } +} + +void index_conv_dec(int *index /* (i/o) Codebook indexes */ + ) +{ + int k; + + for (k = 1; k < CB_NSTAGES; k++) { + + if ((index[k] >= 44) && (index[k] < 108)) { + index[k] += 64; + } else if ((index[k] >= 108) && (index[k] < 128)) { + index[k] += 128; + } else { + /* ERROR */ + } + } +} + + /*----------------------------------------------------------------* + * Construct decoded vector from codebook and gains. + *---------------------------------------------------------------*/ + +void iCBConstruct(float *decvector, /* (o) Decoded vector */ + int *index, /* (i) Codebook indices */ + int *gain_index, /* (i) Gain quantization indices */ + float *mem, /* (i) Buffer for codevector construction */ + int lMem, /* (i) Length of buffer */ + int veclen, /* (i) Length of vector */ + int nStages /* (i) Number of codebook stages */ + ) +{ + int j, k; + + + + + + float gain[CB_NSTAGES]; + float cbvec[SUBL]; + + /* gain de-quantization */ + + gain[0] = gaindequant(gain_index[0], 1.0, 32); + if (nStages > 1) { + gain[1] = gaindequant(gain_index[1], (float) fabs(gain[0]), 16); + } + if (nStages > 2) { + gain[2] = gaindequant(gain_index[2], (float) fabs(gain[1]), 8); + } + + /* codebook vector construction and construction of + total vector */ + + getCBvec(cbvec, mem, index[0], lMem, veclen); + for (j = 0; j < veclen; j++) { + decvector[j] = gain[0] * cbvec[j]; + } + if (nStages > 1) { + for (k = 1; k < nStages; k++) { + getCBvec(cbvec, mem, index[k], lMem, veclen); + for (j = 0; j < veclen; j++) { + decvector[j] += gain[k] * cbvec[j]; + } + } + } +}