aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/ilbc/createCB.c
diff options
context:
space:
mode:
Diffstat (limited to 'codecs/ilbc/createCB.c')
-rwxr-xr-xcodecs/ilbc/createCB.c423
1 files changed, 215 insertions, 208 deletions
diff --git a/codecs/ilbc/createCB.c b/codecs/ilbc/createCB.c
index 4d95b7513..b3b0c2b0f 100755
--- a/codecs/ilbc/createCB.c
+++ b/codecs/ilbc/createCB.c
@@ -1,208 +1,215 @@
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- createCB.c
-
- Copyright (c) 2001,
- Global IP Sound AB.
- All rights reserved.
-
-******************************************************************/
-
-#include "iLBC_define.h"
-#include "constants.h"
-#include "createCB.h"
-#include <string.h>
-#include <math.h>
-
-/*----------------------------------------------------------------*
- * Construct an additional codebook vector by filtering the
- * initial codebook buffer. This vector is then used to expand
- * the codebook with an additional section.
- *---------------------------------------------------------------*/
-
-void filteredCBvecs(
- float *cbvectors, /* (o) Codebook vectors for the higher
-section */
- float *mem, /* (i) Buffer to create codebook vector from
-*/
- int lMem /* (i) Length of buffer */
-){
- int j, k;
- float *pp, *pp1;
- float tempbuff2[CB_MEML+CB_FILTERLEN];
- float *pos;
-
- memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));
- memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));
- memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0,
- (CB_HALFFILTERLEN+1)*sizeof(float));
-
- /* Create codebook vector for higher section by filtering */
-
- /* do filtering */
- pos=cbvectors;
- memset(pos, 0, lMem*sizeof(float));
- for (k=0; k<lMem; k++) {
- pp=&tempbuff2[k];
- pp1=&cbfiltersTbl[0];
- for (j=0;j<CB_FILTERLEN;j++) {
- (*pos)+=(*pp++)*(*pp1++);
- }
- pos++;
- }
-}
-
-/*----------------------------------------------------------------*
- * Search the augmented part of the codebook to find the best
- * measure.
- *----------------------------------------------------------------*/
-
-void searchAugmentedCB(
- int low, /* (i) Start index for the search */
- int high, /* (i) End index for the search */
- int stage, /* (i) Current stage */
- int startIndex, /* (i) Codebook index for the first
- aug vector */
- float *target, /* (i) Target vector for encoding */
- float *buffer, /* (i) Pointer to the end of the buffer for
- augmented codebook construction */
- float *max_measure, /* (i/o) Currently maximum measure */
- int *best_index,/* (o) Currently the best index */
- float *gain, /* (o) Currently the best gain */
- float *energy, /* (o) Energy of augmented codebook
- vectors */
- float *invenergy/* (o) Inv energy of augmented codebook
- vectors */
-) {
- int lagcount, ilow, j, tmpIndex;
- float *pp, *ppo, *ppi, *ppe, crossDot, alfa;
- float weighted, measure, nrjRecursive;
- float ftmp;
-
- /* Compute the energy for the first (low-5)
- noninterpolated samples */
- nrjRecursive = (float) 0.0;
- pp = buffer - low + 1;
- for (j=0; j<(low-5); j++) {
- nrjRecursive += ( (*pp)*(*pp) );
- pp++;
- }
- ppe = buffer - low;
-
-
- for (lagcount=low; lagcount<=high; lagcount++) {
-
- /* Index of the codebook vector used for retrieving
- energy values */
- tmpIndex = startIndex+lagcount-20;
-
- ilow = lagcount-4;
-
- /* Update the energy recursively to save complexity */
- nrjRecursive = nrjRecursive + (*ppe)*(*ppe);
- ppe--;
- energy[tmpIndex] = nrjRecursive;
-
- /* Compute cross dot product for the first (low-5) samples */
- crossDot = (float) 0.0;
- pp = buffer-lagcount;
- for (j=0; j<ilow; j++) {
- crossDot += target[j]*(*pp++);
- }
-
- /* interpolation */
- alfa = (float) 0.2;
- ppo = buffer-4;
- ppi = buffer-lagcount-4;
- for (j=ilow; j<lagcount; j++) {
- weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
- ppo++;
- ppi++;
- energy[tmpIndex] += weighted*weighted;
- crossDot += target[j]*weighted;
- alfa += (float)0.2;
- }
-
- /* Compute energy and cross dot product for the
- remaining samples */
- pp = buffer - lagcount;
- for (j=lagcount; j<SUBL; j++) {
- energy[tmpIndex] += (*pp)*(*pp);
- crossDot += target[j]*(*pp++);
- }
-
- if(energy[tmpIndex]>0.0) {
- invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);
- } else {
- invenergy[tmpIndex] = (float) 0.0;
- }
-
- if (stage==0) {
- measure = (float)-10000000.0;
-
- if (crossDot > 0.0) {
- measure = crossDot*crossDot*invenergy[tmpIndex];
- }
- }
- else {
- measure = crossDot*crossDot*invenergy[tmpIndex];
- }
-
- /* check if measure is better */
- ftmp = crossDot*invenergy[tmpIndex];
-
- if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
- *best_index = tmpIndex;
- *max_measure = measure;
- *gain = ftmp;
- }
- }
-}
-
-
-/*----------------------------------------------------------------*
- * Recreate a specific codebook vector from the augmented part.
- *
- *----------------------------------------------------------------*/
-
-void createAugmentedVec(
- int index, /* (i) Index for the augmented vector
- to be created */
- float *buffer, /* (i) Pointer to the end of the buffer for
- augmented codebook construction */
- float *cbVec/* (o) The construced codebook vector */
-) {
- int ilow, j;
- float *pp, *ppo, *ppi, alfa, alfa1, weighted;
-
- ilow = index-5;
-
- /* copy the first noninterpolated part */
-
- pp = buffer-index;
- memcpy(cbVec,pp,sizeof(float)*index);
-
- /* interpolation */
-
- alfa1 = (float)0.2;
- alfa = 0.0;
- ppo = buffer-5;
- ppi = buffer-index-5;
- for (j=ilow; j<index; j++) {
- weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
- ppo++;
- ppi++;
- cbVec[j] = weighted;
- alfa += alfa1;
- }
-
- /* copy the second noninterpolated part */
-
- pp = buffer - index;
- memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));
-}
-
-
+
+
+
+/******************************************************************
+
+ iLBC Speech Coder ANSI-C Source Code
+
+ createCB.c
+
+ Copyright (C) The Internet Society (2004).
+ All Rights Reserved.
+
+******************************************************************/
+
+#include "iLBC_define.h"
+#include "constants.h"
+#include <string.h>
+#include <math.h>
+
+/*----------------------------------------------------------------*
+ * Construct an additional codebook vector by filtering the
+ * initial codebook buffer. This vector is then used to expand
+ * the codebook with an additional section.
+ *---------------------------------------------------------------*/
+
+void filteredCBvecs(
+ float *cbvectors, /* (o) Codebook vectors for the
+ higher section */
+ float *mem, /* (i) Buffer to create codebook
+ vector from */
+ int lMem /* (i) Length of buffer */
+){
+ int j, k;
+ float *pp, *pp1;
+ float tempbuff2[CB_MEML+CB_FILTERLEN];
+ float *pos;
+
+ memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));
+ memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));
+ memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0,
+ (CB_HALFFILTERLEN+1)*sizeof(float));
+
+ /* Create codebook vector for higher section by filtering */
+
+ /* do filtering */
+ pos=cbvectors;
+ memset(pos, 0, lMem*sizeof(float));
+ for (k=0; k<lMem; k++) {
+ pp=&tempbuff2[k];
+ pp1=&cbfiltersTbl[CB_FILTERLEN-1];
+ for (j=0;j<CB_FILTERLEN;j++) {
+ (*pos)+=(*pp++)*(*pp1--);
+ }
+ pos++;
+ }
+}
+
+
+
+/*----------------------------------------------------------------*
+ * Search the augmented part of the codebook to find the best
+ * measure.
+ *----------------------------------------------------------------*/
+
+void searchAugmentedCB(
+ int low, /* (i) Start index for the search */
+ int high, /* (i) End index for the search */
+ int stage, /* (i) Current stage */
+ int startIndex, /* (i) Codebook index for the first
+ aug vector */
+ float *target, /* (i) Target vector for encoding */
+ float *buffer, /* (i) Pointer to the end of the buffer for
+ augmented codebook construction */
+ float *max_measure, /* (i/o) Currently maximum measure */
+ int *best_index,/* (o) Currently the best index */
+ float *gain, /* (o) Currently the best gain */
+ float *energy, /* (o) Energy of augmented codebook
+ vectors */
+ float *invenergy/* (o) Inv energy of augmented codebook
+ vectors */
+) {
+ int icount, ilow, j, tmpIndex;
+ float *pp, *ppo, *ppi, *ppe, crossDot, alfa;
+ float weighted, measure, nrjRecursive;
+ float ftmp;
+
+ /* Compute the energy for the first (low-5)
+ noninterpolated samples */
+ nrjRecursive = (float) 0.0;
+ pp = buffer - low + 1;
+ for (j=0; j<(low-5); j++) {
+ nrjRecursive += ( (*pp)*(*pp) );
+ pp++;
+ }
+ ppe = buffer - low;
+
+
+ for (icount=low; icount<=high; icount++) {
+
+ /* Index of the codebook vector used for retrieving
+ energy values */
+ tmpIndex = startIndex+icount-20;
+
+ ilow = icount-4;
+
+ /* Update the energy recursively to save complexity */
+ nrjRecursive = nrjRecursive + (*ppe)*(*ppe);
+ ppe--;
+ energy[tmpIndex] = nrjRecursive;
+
+ /* Compute cross dot product for the first (low-5)
+ samples */
+ crossDot = (float) 0.0;
+
+
+ pp = buffer-icount;
+ for (j=0; j<ilow; j++) {
+ crossDot += target[j]*(*pp++);
+ }
+
+ /* interpolation */
+ alfa = (float) 0.2;
+ ppo = buffer-4;
+ ppi = buffer-icount-4;
+ for (j=ilow; j<icount; j++) {
+ weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
+ ppo++;
+ ppi++;
+ energy[tmpIndex] += weighted*weighted;
+ crossDot += target[j]*weighted;
+ alfa += (float)0.2;
+ }
+
+ /* Compute energy and cross dot product for the
+ remaining samples */
+ pp = buffer - icount;
+ for (j=icount; j<SUBL; j++) {
+ energy[tmpIndex] += (*pp)*(*pp);
+ crossDot += target[j]*(*pp++);
+ }
+
+ if (energy[tmpIndex]>0.0) {
+ invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);
+ } else {
+ invenergy[tmpIndex] = (float) 0.0;
+ }
+
+ if (stage==0) {
+ measure = (float)-10000000.0;
+
+ if (crossDot > 0.0) {
+ measure = crossDot*crossDot*invenergy[tmpIndex];
+ }
+ }
+ else {
+ measure = crossDot*crossDot*invenergy[tmpIndex];
+ }
+
+ /* check if measure is better */
+ ftmp = crossDot*invenergy[tmpIndex];
+
+ if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {
+ *best_index = tmpIndex;
+ *max_measure = measure;
+ *gain = ftmp;
+ }
+ }
+}
+
+
+
+
+/*----------------------------------------------------------------*
+ * Recreate a specific codebook vector from the augmented part.
+ *
+ *----------------------------------------------------------------*/
+
+void createAugmentedVec(
+ int index, /* (i) Index for the augmented vector
+ to be created */
+ float *buffer, /* (i) Pointer to the end of the buffer for
+ augmented codebook construction */
+ float *cbVec/* (o) The construced codebook vector */
+) {
+ int ilow, j;
+ float *pp, *ppo, *ppi, alfa, alfa1, weighted;
+
+ ilow = index-5;
+
+ /* copy the first noninterpolated part */
+
+ pp = buffer-index;
+ memcpy(cbVec,pp,sizeof(float)*index);
+
+ /* interpolation */
+
+ alfa1 = (float)0.2;
+ alfa = 0.0;
+ ppo = buffer-5;
+ ppi = buffer-index-5;
+ for (j=ilow; j<index; j++) {
+ weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
+ ppo++;
+ ppi++;
+ cbVec[j] = weighted;
+ alfa += alfa1;
+ }
+
+ /* copy the second noninterpolated part */
+
+ pp = buffer - index;
+ memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));
+}
+
+