code cleanup
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 5 Jul 2002 16:01:12 +0000 (16:01 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 5 Jul 2002 16:01:12 +0000 (16:01 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3529 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/cb_search.h
libspeex/lpc.c
libspeex/lsp.c
libspeex/lsp.h
libspeex/ltp.c
libspeex/modes.c
libspeex/vq.c
libspeex/vq.h

index f8dcdf0..a56ad5a 100644 (file)
@@ -42,171 +42,6 @@ static float scal_gains4[16] = {
 };
 
 
-void split_cb_search(
-float target[],                        /* target vector */
-float ak[],                    /* LPCs for this subframe */
-float awk1[],                  /* Weighted LPCs for this subframe */
-float awk2[],                  /* Weighted LPCs for this subframe */
-void *par,                      /* Codebook/search parameters*/
-int   p,                        /* number of LPC coeffs */
-int   nsf,                      /* number of samples in subframe */
-float *exc,
-SpeexBits *bits,
-float *stack
-)
-{
-   int i,j, id;
-   float *resp, *E, q;
-   float *t, *r, *e;
-   float *gains;
-   int *ind;
-   float *shape_cb;
-   int shape_cb_size, subvect_size, nb_subvect;
-   float exc_energy=0;
-   split_cb_params *params;
-
-   params = (split_cb_params *) par;
-   subvect_size = params->subvect_size;
-   nb_subvect = params->nb_subvect;
-   shape_cb_size = 1<<params->shape_bits;
-   shape_cb = params->shape_cb;
-   resp = PUSH(stack, shape_cb_size*subvect_size);
-   E = PUSH(stack, shape_cb_size);
-   t = PUSH(stack, nsf);
-   r = PUSH(stack, nsf);
-   e = PUSH(stack, nsf);
-   gains = PUSH(stack, nb_subvect);
-   ind = (int*)PUSH(stack, nb_subvect);
-
-   /* Compute energy of the "real excitation" */
-   syn_filt_zero(target, awk1, e, nsf, p);
-   residue_zero(e, ak, e, nsf, p);
-   residue_zero(e, awk2, e, nsf, p);
-   for (i=0;i<nsf;i++)
-      exc_energy += e[i]*e[i];
-   exc_energy=sqrt(exc_energy/nb_subvect);
-
-   /* Quantize global ("average") gain */
-   q=log(exc_energy+.1);
-   q=floor(.5+2*(q-2));
-   if (q<0)
-      q=0;
-   if (q>15)
-      q=15;
-   id = (int)q;
-   speex_bits_pack(bits, id, 4);
-   exc_energy=exp(.5*q+2);
-
-
-   for (i=0;i<nsf;i++)
-      t[i]=target[i];
-
-   e[0]=1;
-   for (i=1;i<nsf;i++)
-      e[i]=0;
-   residue_zero(e, awk1, r, nsf, p);
-   syn_filt_zero(r, ak, r, nsf, p);
-   syn_filt_zero(r, awk2, r, nsf,p);
-   
-   /* Pre-compute codewords response and energy */
-   for (i=0;i<shape_cb_size;i++)
-   {
-      float *res = resp+i*subvect_size;
-
-      /* Compute codeword response */
-      int k;
-      for(j=0;j<subvect_size;j++)
-         res[j]=0;
-      for(j=0;j<subvect_size;j++)
-      {
-         for (k=j;k<subvect_size;k++)
-            res[k]+=shape_cb[i*subvect_size+j]*r[k-j];
-      }
-      /* Compute energy of codeword response */
-      E[i]=0;
-      for(j=0;j<subvect_size;j++)
-         E[i]+=res[j]*res[j];
-      E[i]=1/(.001+E[i]);
-   }
-
-   for (i=0;i<nb_subvect;i++)
-   {
-      int best_index=0, k, m;
-      float g, corr, best_gain=0, score, best_score=-1;
-      /* Find best codeword for current sub-vector */
-      for (j=0;j<shape_cb_size;j++)
-      {
-         corr=xcorr(resp+j*subvect_size,t+subvect_size*i,subvect_size);
-         score=corr*corr*E[j];
-         g = corr*E[j];
-         if (score>best_score)
-         {
-            best_index=j;
-            best_score=score;
-            best_gain=g;
-         }
-      }
-      speex_bits_pack(bits,best_index,params->shape_bits);
-      
-      /* Quantize gain */
-      {
-         int s=0, best_id;
-         best_gain /= .01+exc_energy;
-         if (best_gain<0)
-         {
-            best_gain=-best_gain;
-            s=1;
-         }
-
-         /* Find gain index (it's a scalar but we use the VQ code anyway)*/
-         best_id = vq_index(&best_gain, scal_gains4, 1, 8);
-
-         best_gain=scal_gains4[best_id];
-         /*printf ("gain_quant: %f %d %f\n", best_gain, best_id, scal_gains4[best_id]);*/
-         if (s)
-            best_gain=-best_gain;
-         best_gain *= exc_energy;
-         speex_bits_pack(bits,s,1);
-         speex_bits_pack(bits,best_id,3);
-      }
-      ind[i]=best_index;
-      gains[i]=best_gain;
-      /* Update target for next subvector */
-      for (j=0;j<subvect_size;j++)
-      {
-         g=best_gain*shape_cb[best_index*subvect_size+j];
-         for (k=subvect_size*i+j,m=0;k<nsf;k++,m++)
-            t[k] -= g*r[m];
-      }
-   }
-   
-   /* Put everything back together */
-   for (i=0;i<nb_subvect;i++)
-      for (j=0;j<subvect_size;j++)
-         e[subvect_size*i+j]=gains[i]*shape_cb[ind[i]*subvect_size+j];
-
-   /* Update excitation */
-   for (j=0;j<nsf;j++)
-      exc[j]+=e[j];
-   
-   /* Update target */
-   residue_zero(e, awk1, r, nsf, p);
-   syn_filt_zero(r, ak, r, nsf, p);
-   syn_filt_zero(r, awk2, r, nsf,p);
-   for (j=0;j<nsf;j++)
-      target[j]-=r[j];
-
-   
-
-
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-}
 
 void split_cb_search_nogain(
 float target[],                        /* target vector */
@@ -727,330 +562,6 @@ float *stack
 }
 
 
-void split_cb_search2(
-float target[],                        /* target vector */
-float ak[],                    /* LPCs for this subframe */
-float awk1[],                  /* Weighted LPCs for this subframe */
-float awk2[],                  /* Weighted LPCs for this subframe */
-void *par,                      /* Codebook/search parameters*/
-int   p,                        /* number of LPC coeffs */
-int   nsf,                      /* number of samples in subframe */
-float *exc,
-SpeexBits *bits,
-float *stack
-)
-{
-   int i,j, id;
-   float *resp, *E, q;
-   float *t, *r, *e;
-   float *gains;
-   int *ind, *gain_ind;
-   float *shape_cb;
-   int shape_cb_size, subvect_size, nb_subvect;
-   float exc_energy=0;
-   split_cb_params *params;
-
-   params = (split_cb_params *) par;
-   subvect_size = params->subvect_size;
-   nb_subvect = params->nb_subvect;
-   shape_cb_size = 1<<params->shape_bits;
-   shape_cb = params->shape_cb;
-   resp = PUSH(stack, shape_cb_size*subvect_size);
-   E = PUSH(stack, shape_cb_size);
-   t = PUSH(stack, nsf);
-   r = PUSH(stack, nsf);
-   e = PUSH(stack, nsf);
-   gains = PUSH(stack, nb_subvect);
-   ind = (int*)PUSH(stack, nb_subvect);
-   gain_ind = (int*)PUSH(stack, nb_subvect);
-
-   /* Compute energy of the "real excitation" */
-   syn_filt_zero(target, awk1, e, nsf, p);
-   residue_zero(e, ak, e, nsf, p);
-   residue_zero(e, awk2, e, nsf, p);
-   for (i=0;i<nsf;i++)
-      exc_energy += e[i]*e[i];
-   exc_energy=sqrt(exc_energy/nb_subvect);
-
-   /* Quantize global ("average") gain */
-   q=log(exc_energy+.1);
-   q=floor(.5+2*(q-2));
-   if (q<0)
-      q=0;
-   if (q>15)
-      q=15;
-   id = (int)q;
-   speex_bits_pack(bits, id, 4);
-   exc_energy=exp(.5*q+2);
-
-
-   for (i=0;i<nsf;i++)
-      t[i]=target[i];
-
-   e[0]=1;
-   for (i=1;i<nsf;i++)
-      e[i]=0;
-   residue_zero(e, awk1, r, nsf, p);
-   syn_filt_zero(r, ak, r, nsf, p);
-   syn_filt_zero(r, awk2, r, nsf,p);
-   
-   /* Pre-compute codewords response and energy */
-   for (i=0;i<shape_cb_size;i++)
-   {
-      float *res = resp+i*subvect_size;
-
-      /* Compute codeword response */
-      int k;
-      for(j=0;j<subvect_size;j++)
-         res[j]=0;
-      for(j=0;j<subvect_size;j++)
-      {
-         for (k=j;k<subvect_size;k++)
-            res[k]+=shape_cb[i*subvect_size+j]*r[k-j];
-      }
-      /* Compute energy of codeword response */
-      E[i]=0;
-      for(j=0;j<subvect_size;j++)
-         E[i]+=res[j]*res[j];
-      E[i]=1/(.001+E[i]);
-   }
-
-   for (i=0;i<nb_subvect;i++)
-   {
-      int best_index[2]={0,0}, k, m, best_gain_ind[2]={0,0};
-      float g, corr, best_gain[2]={0,0}, score, best_score[2]={-1,-1};
-      /* Find best codeword for current sub-vector */
-      for (j=0;j<shape_cb_size;j++)
-      {
-         corr=xcorr(resp+j*subvect_size,t+subvect_size*i,subvect_size);
-         score=corr*corr*E[j];
-         g = corr*E[j];
-         if (score>best_score[0])
-         {
-            best_index[1]=best_index[0];
-            best_score[1]=best_score[0];
-            best_gain[1]=best_gain[0];
-
-            best_index[0]=j;
-            best_score[0]=score;
-            best_gain[0]=g;
-         } else if (score>best_score[1]) {
-            best_index[1]=j;
-            best_score[1]=score;
-            best_gain[1]=g;            
-         }
-      }
-      
-      /* Quantize gain */
-      for (k=0;k<2;k++) {
-         int s=0, best_id;
-         best_gain[k] /= .01+exc_energy;
-         if (best_gain[k]<0)
-         {
-            best_gain[k]=-best_gain[k];
-            s=1;
-         }
-
-         /* Find gain index (it's a scalar but we use the VQ code anyway)*/
-         best_id = vq_index(&best_gain[k], scal_gains4, 1, 8);
-
-         best_gain_ind[k]=best_id;
-         best_gain[k]=scal_gains4[best_id];
-         /*printf ("gain_quant: %f %d %f\n", best_gain, best_id, scal_gains4[best_id]);*/
-         if (s)
-            best_gain[k]=-best_gain[k];
-         best_gain[k] *= exc_energy;
-      }
-
-
-
-      if (i<nb_subvect-1) {
-         int best_index2=0;
-         float best_score2=-1, best_gain2=0;
-         int nbest;
-         float err[2]={0,0};
-         float *tt=PUSH(stack,nsf);
-         for (nbest=0;nbest<2;nbest++)
-         {
-            for (j=0;j<nsf;j++)
-               tt[j]=t[j];
-            for (j=0;j<subvect_size;j++)
-            {
-               g=best_gain[nbest]*shape_cb[best_index[nbest]*subvect_size+j];
-               for (k=subvect_size*i+j,m=0;k<nsf;k++,m++)
-                  tt[k] -= g*r[m];
-            }
-            
-
-            for (j=0;j<shape_cb_size;j++)
-            {
-               corr=xcorr(resp+j*subvect_size,tt+subvect_size*(i+1),subvect_size);
-               score=corr*corr*E[j];
-               g = corr*E[j];
-               if (score>best_score2)
-               {
-                  best_index2=j;
-                  best_score2=score;
-                  best_gain2=g;
-               }
-            }
-
-            {
-               int s=0, best_id;
-               best_gain2 /= .01+exc_energy;
-               if (best_gain2<0)
-               {
-                  best_gain2=-best_gain2;
-                  s=1;
-               }
-               best_id = vq_index(&best_gain2, scal_gains4, 1, 8);
-               best_gain2=scal_gains4[best_id];
-               if (s)
-                  best_gain2=-best_gain2;
-               best_gain2 *= exc_energy;
-            }
-
-            for (j=0;j<subvect_size;j++)
-            {
-               g=best_gain2*shape_cb[best_index2*subvect_size+j];
-               for (k=subvect_size*(i+1)+j,m=0;k<nsf;k++,m++)
-                  tt[k] -= g*r[m];
-            }
-            for (j=subvect_size*i;j<subvect_size*(i+2);j++)
-               err[nbest]-=tt[j]*tt[j];
-            
-            best_score[nbest]=err[nbest];
-         }
-
-         if (best_score[1]>best_score[0])
-         {
-            best_index[0]=best_index[1];
-            best_score[0]=best_score[1];
-            best_gain[0]=best_gain[1];
-            best_gain_ind[0]=best_gain_ind[1];
-         }
-         POP(stack);
-      }
-
-
-      
-
-      ind[i]=best_index[0];
-      gain_ind[i]=best_gain_ind[0];
-      gains[i]=best_gain[0];
-      /* Update target for next subvector */
-      for (j=0;j<subvect_size;j++)
-      {
-         g=best_gain[0]*shape_cb[best_index[0]*subvect_size+j];
-         for (k=subvect_size*i+j,m=0;k<nsf;k++,m++)
-            t[k] -= g*r[m];
-      }
-   }
-   for (i=0;i<nb_subvect;i++)
-   {
-      speex_bits_pack(bits, ind[i], params->shape_bits);
-      if (gains[i]<0)
-         speex_bits_pack(bits, 1, 1);
-      else
-         speex_bits_pack(bits, 0, 1);
-      speex_bits_pack(bits, gain_ind[i], 3);
-      /*printf ("encode split: %d %d %f\n", i, ind[i], gains[i]);*/
-
-   }
-   /* Put everything back together */
-   for (i=0;i<nb_subvect;i++)
-      for (j=0;j<subvect_size;j++)
-         e[subvect_size*i+j]=gains[i]*shape_cb[ind[i]*subvect_size+j];
-
-   /* Update excitation */
-   for (j=0;j<nsf;j++)
-      exc[j]+=e[j];
-   
-   /* Update target */
-   residue_zero(e, awk1, r, nsf, p);
-   syn_filt_zero(r, ak, r, nsf, p);
-   syn_filt_zero(r, awk2, r, nsf,p);
-   for (j=0;j<nsf;j++)
-      target[j]-=r[j];
-
-   
-
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-   POP(stack);
-}
-
-
-
-
-void split_cb_unquant(
-float *exc,
-void *par,                      /* non-overlapping codebook */
-int   nsf,                      /* number of samples in subframe */
-SpeexBits *bits,
-float *stack
-)
-{
-   int i,j;
-   int *ind;
-   float *gains;
-   float *sign;
-   float *shape_cb, exc_energy;
-   int shape_cb_size, subvect_size, nb_subvect;
-   split_cb_params *params;
-
-   params = (split_cb_params *) par;
-   subvect_size = params->subvect_size;
-   nb_subvect = params->nb_subvect;
-   shape_cb_size = 1<<params->shape_bits;
-   shape_cb = params->shape_cb;
-   
-   ind = (int*)PUSH(stack, nb_subvect);
-   gains = PUSH(stack, nb_subvect);
-   sign = PUSH(stack, nb_subvect);
-
-   /* Decode global (average) gain */
-   {
-      int id;
-      id = speex_bits_unpack_unsigned(bits, 4);
-      exc_energy=exp(.5*id+2);
-   }
-
-   /* Decode codewords and gains */
-   for (i=0;i<nb_subvect;i++)
-   {
-      int gain_id;
-      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
-      if (speex_bits_unpack_unsigned(bits, 1))
-         sign[i]=-1;
-      else
-         sign[i]=1;
-      
-      gain_id = speex_bits_unpack_unsigned(bits, 3);
-      gains[i]=scal_gains4[gain_id];
-      gains[i] *= sign[i];
-      gains[i] *= exc_energy;
-
-      /*printf ("decode split: %d %d %f\n", i, ind[i], gains[i]);*/
-   }
-
-   /* Compute decoded excitation */
-   for (i=0;i<nb_subvect;i++)
-      for (j=0;j<subvect_size;j++)
-         exc[subvect_size*i+j]+=gains[i]*shape_cb[ind[i]*subvect_size+j];
-
-   POP(stack);
-   POP(stack);
-   POP(stack);
-}
-
-
-
 void split_cb_nogain_unquant(
 float *exc,
 void *par,                      /* non-overlapping codebook */
index 8d45eaa..c9d38c0 100644 (file)
@@ -29,32 +29,6 @@ typedef struct split_cb_params {
    int     shape_bits;
 } split_cb_params;
 
-float overlap_cb_search(
-float target[],                        /* target vector */
-float ak[],                    /* LPCs for this subframe */
-float awk1[],                  /* Weighted LPCs for this subframe */
-float awk2[],                  /* Weighted LPCs for this subframe */
-float codebook[],              /* overlapping codebook */
-int   entries,                 /* number of overlapping entries to search */
-float *gain,                   /* gain of optimum entry */
-int   *index,                  /* index of optimum entry */
-int   p,                        /* number of LPC coeffs */
-int   nsf,                      /* number of samples in subframe */
-float *stack
-);
-
-void split_cb_search(
-float target[],                        /* target vector */
-float ak[],                    /* LPCs for this subframe */
-float awk1[],                  /* Weighted LPCs for this subframe */
-float awk2[],                  /* Weighted LPCs for this subframe */
-void *par,                      /* Codebook/search parameters*/
-int   p,                        /* number of LPC coeffs */
-int   nsf,                      /* number of samples in subframe */
-float *exc,
-SpeexBits *bits,
-float *stack
-);
 
 void split_cb_search_nogain(
 float target[],                        /* target vector */
@@ -103,28 +77,6 @@ SpeexBits *bits,
 float *stack
 );
 
-void split_cb_search2(
-float target[],                        /* target vector */
-float ak[],                    /* LPCs for this subframe */
-float awk1[],                  /* Weighted LPCs for this subframe */
-float awk2[],                  /* Weighted LPCs for this subframe */
-void *par,                      /* Codebook/search parameters*/
-int   p,                        /* number of LPC coeffs */
-int   nsf,                      /* number of samples in subframe */
-float *exc,
-SpeexBits *bits,
-float *stack
-);
-
-
-void split_cb_unquant(
-float *exc,
-void  *par,                     /* Innovation parameters */
-int   nsf,                      /* number of samples in subframe */
-SpeexBits *bits,
-float *stack
-);
-
 void split_cb_nogain_unquant(
 float *exc,
 void *par,                      /* non-overlapping codebook */
index bff5f4b..932878b 100644 (file)
   Jutta Degener
   Carsten Bormann
 */
+/* Speex License:
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
 
 
 /* LPC- and Reflection Coefficients
index a5cedc7..1a7b7c8 100644 (file)
     radians format but in the x domain of the unit circle.
 
 \*---------------------------------------------------------------------------*/
+/* Speex License:
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
 
 #include <math.h>
 #include <stdio.h>
@@ -282,7 +298,8 @@ void lsp_to_lpc(float *freq,float *ak,int lpcrdr, float *stack)
     POP(stack);
 }
 
-
+/*Added by JMV
+  Makes sure the LSPs are stable*/
 void lsp_enforce_margin(float *lsp, int len, float margin)
 {
    int i;
index 5bf3c37..2758602 100644 (file)
@@ -7,6 +7,22 @@
        DATE CREATED: 21/11/95\r
 \r
 \*---------------------------------------------------------------------------*/\r
+/* Speex License:\r
+\r
+   This library is free software; you can redistribute it and/or\r
+   modify it under the terms of the GNU Lesser General Public\r
+   License as published by the Free Software Foundation; either\r
+   version 2.1 of the License, or (at your option) any later version.\r
+   \r
+   This library is distributed in the hope that it will be useful,\r
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   Lesser General Public License for more details.\r
+   \r
+   You should have received a copy of the GNU Lesser General Public\r
+   License along with this library; if not, write to the Free Software\r
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+*/\r
 \r
 #ifndef __AK2LSPD__\r
 #define __AK2LSPD__\r
@@ -14,6 +30,7 @@
 int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta, float *stack);\r
 void lsp_to_lpc(float *freq, float *ak, int lpcrdr, float *stack);\r
 \r
+/*Added by JMV*/\r
 void lsp_enforce_margin(float *lsp, int len, float margin);\r
 \r
 \r
index 84038b6..c0c0aa3 100644 (file)
@@ -20,7 +20,6 @@
 #include <math.h>
 #include <stdio.h>
 #include "ltp.h"
-#include "cb_search.h"
 #include "stack_alloc.h"
 #include "filters.h"
 #include "speex_bits.h"
index 3c89c07..b74c2fa 100644 (file)
@@ -257,7 +257,7 @@ SpeexMode speex_nb_mode = {
    &nb_mode,
    "narrowband",
    0,
-   1,
+   2,
    &nb_encoder_init,
    &nb_encoder_destroy,
    &nb_encode,
@@ -350,7 +350,7 @@ SpeexMode speex_wb_mode = {
    &sb_wb_mode,
    "full-rate wideband (sub-band CELP)",
    1,
-   1,
+   2,
    &sb_encoder_init,
    &sb_encoder_destroy,
    &sb_encode,
index d26b20a..92b9188 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Jean-Marc Valin & David Rowe
+/* Copyright (C) 2002 Jean-Marc Valin
    File: vq.c
    Vector quantization
 
@@ -19,6 +19,7 @@
 
 #include "vq.h"
 
+/*Finds the index of the entry in a codebook that best matches the input*/
 int vq_index(float *in, float *codebook, int len, int entries)
 {
    int i,j;
index 2460bad..a8addef 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Jean-Marc Valin & David Rowe
+/* Copyright (C) 2002 Jean-Marc Valin
    File: vq.h
    Vector quantization