Mercurial > hg > audiostuff
diff intercom/ilbc/getCBvec.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/getCBvec.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,181 @@ + + /****************************************************************** + + iLBC Speech Coder ANSI-C Source Code + + getCBvec.c + + Copyright (C) The Internet Society (2004). + All Rights Reserved. + + ******************************************************************/ + +#include "iLBC_define.h" +#include "constants.h" +#include <string.h> + + /*----------------------------------------------------------------* + * Construct codebook vector for given index. + *---------------------------------------------------------------*/ + +void getCBvec(float *cbvec, /* (o) Constructed codebook vector */ + float *mem, /* (i) Codebook buffer */ + int index, /* (i) Codebook index */ + int lMem, /* (i) Length of codebook buffer */ + int cbveclen /* (i) Codebook vector length */ + ) +{ + int j, k, n, memInd, sFilt; + float tmpbuf[CB_MEML]; + int base_size; + int ilow, ihigh; + float alfa, alfa1; + + /* Determine size of codebook sections */ + + base_size = lMem - cbveclen + 1; + + if (cbveclen == SUBL) { + base_size += cbveclen / 2; + } + + /* No filter -> First codebook section */ + + if (index < lMem - cbveclen + 1) { + + /* first non-interpolated vectors */ + + k = index + cbveclen; + /* get vector */ + memcpy(cbvec, mem + lMem - k, cbveclen * sizeof(float)); + + } else if (index < base_size) { + + k = 2 * (index - (lMem - cbveclen + 1)) + cbveclen; + + ihigh = k / 2; + ilow = ihigh - 5; + + /* Copy first noninterpolated part */ + + memcpy(cbvec, mem + lMem - k / 2, ilow * sizeof(float)); + + /* interpolation */ + + alfa1 = (float) 0.2; + alfa = 0.0; + for (j = ilow; j < ihigh; j++) { + cbvec[j] = ((float) 1.0 - alfa) * mem[lMem - k / 2 + j] + + alfa * mem[lMem - k + j]; + + + + + + alfa += alfa1; + } + + /* Copy second noninterpolated part */ + + memcpy(cbvec + ihigh, mem + lMem - k + ihigh, + (cbveclen - ihigh) * sizeof(float)); + + } + + /* Higher codebook section based on filtering */ + + else { + + /* first non-interpolated vectors */ + + if (index - base_size < lMem - cbveclen + 1) { + float tempbuff2[CB_MEML + CB_FILTERLEN + 1]; + float *pos; + float *pp, *pp1; + + memset(tempbuff2, 0, CB_HALFFILTERLEN * sizeof(float)); + memcpy(&tempbuff2[CB_HALFFILTERLEN], mem, lMem * sizeof(float)); + memset(&tempbuff2[lMem + CB_HALFFILTERLEN], 0, + (CB_HALFFILTERLEN + 1) * sizeof(float)); + + k = index - base_size + cbveclen; + sFilt = lMem - k; + memInd = sFilt + 1 - CB_HALFFILTERLEN; + + /* do filtering */ + pos = cbvec; + memset(pos, 0, cbveclen * sizeof(float)); + for (n = 0; n < cbveclen; n++) { + pp = &tempbuff2[memInd + n + CB_HALFFILTERLEN]; + pp1 = &cbfiltersTbl[CB_FILTERLEN - 1]; + for (j = 0; j < CB_FILTERLEN; j++) { + (*pos) += (*pp++) * (*pp1--); + } + pos++; + } + } + + /* interpolated vectors */ + + else { + + + + + + float tempbuff2[CB_MEML + CB_FILTERLEN + 1]; + + float *pos; + float *pp, *pp1; + int i; + + memset(tempbuff2, 0, CB_HALFFILTERLEN * sizeof(float)); + memcpy(&tempbuff2[CB_HALFFILTERLEN], mem, lMem * sizeof(float)); + memset(&tempbuff2[lMem + CB_HALFFILTERLEN], 0, + (CB_HALFFILTERLEN + 1) * sizeof(float)); + + k = 2 * (index - base_size - (lMem - cbveclen + 1)) + cbveclen; + sFilt = lMem - k; + memInd = sFilt + 1 - CB_HALFFILTERLEN; + + /* do filtering */ + pos = &tmpbuf[sFilt]; + memset(pos, 0, k * sizeof(float)); + for (i = 0; i < k; i++) { + pp = &tempbuff2[memInd + i + CB_HALFFILTERLEN]; + pp1 = &cbfiltersTbl[CB_FILTERLEN - 1]; + for (j = 0; j < CB_FILTERLEN; j++) { + (*pos) += (*pp++) * (*pp1--); + } + pos++; + } + + ihigh = k / 2; + ilow = ihigh - 5; + + /* Copy first noninterpolated part */ + + memcpy(cbvec, tmpbuf + lMem - k / 2, ilow * sizeof(float)); + + /* interpolation */ + + alfa1 = (float) 0.2; + alfa = 0.0; + for (j = ilow; j < ihigh; j++) { + cbvec[j] = ((float) 1.0 - alfa) * + tmpbuf[lMem - k / 2 + j] + alfa * tmpbuf[lMem - k + j]; + alfa += alfa1; + } + + + + + + + /* Copy second noninterpolated part */ + + memcpy(cbvec + ihigh, tmpbuf + lMem - k + ihigh, + (cbveclen - ihigh) * sizeof(float)); + } + } +}