Minor cleanup (who needs reflection coefficients anyway) in LPC code.
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 16 May 2003 20:41:50 +0000 (20:41 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 16 May 2003 20:41:50 +0000 (20:41 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@4713 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/lpc.c
libspeex/lpc.h
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h

index 9aec141..55ff7f0 100644 (file)
@@ -17,7 +17,7 @@
   Carsten Bormann
 
 
-   Code slightly modified by Jean-Marc Valin
+   Code modified by Jean-Marc Valin
 
    Speex License:
 
@@ -51,7 +51,7 @@
 
 
 
-/* LPC- and Reflection Coefficients
+/* LPC analysis
  *
  * The next two functions calculate linear prediction coefficients
  * and/or the related reflection coefficients from the first P_MAX+1
 
 #include "lpc.h"
 
-float                      /* returns minimum mean square error    */
-wld(
-    float       * lpc, /*      [0...p-1] LPC coefficients      */
-    const float * ac,  /*  in: [0...p] autocorrelation values  */
-    float       * ref, /* out: [0...p-1] reflection coef's     */
-    int p
-    )
+/* returns minimum mean square error    */
+float _spx_lpc(
+float       *lpc, /* out: [0...p-1] LPC coefficients      */
+const float *ac,  /* in:  [0...p] autocorrelation values  */
+int          p
+)
 {
    int i, j;  float r, error = ac[0];
 
-   if (ac[0] == 0) {
-      for (i = 0; i < p; i++) ref[i] = 0; return 0; }
+   if (ac[0] == 0)
+   {
+      for (i = 0; i < p; i++)
+         lpc[i] = 0;
+      return 0;
+   }
 
    for (i = 0; i < p; i++) {
 
-      /* Sum up this iteration's reflection coefficient.
-       */
+      /* Sum up this iteration's reflection coefficient */
       r = -ac[i + 1];
-      for (j = 0; j < i; j++) r -= lpc[j] * ac[i - j];
-      ref[i] = r /= error;
+      for (j = 0; j < i; j++) 
+         r -= lpc[j] * ac[i - j];
 
-      /*  Update LPC coefficients and total error.
-       */
+      /*  Update LPC coefficients and total error */
       lpc[i] = r;
-      for (j = 0; j < i/2; j++) {
+      for (j = 0; j < i/2; j++) 
+      {
          float tmp  = lpc[j];
          lpc[j]     += r * lpc[i-1-j];
          lpc[i-1-j] += r * tmp;
       }
-      if (i % 2) lpc[j] += lpc[j] * r;
+      if (i & 1) 
+         lpc[j] += lpc[j] * r;
 
       error *= 1.0 - r * r;
    }
@@ -107,13 +110,18 @@ wld(
  * for lags between 0 and lag-1, and x == 0 outside 0...n-1
  */
 void _spx_autocorr(
-              const float * x,   /*  in: [0...n-1] samples x   */
-              float *ac,   /* out: [0...lag-1] ac values */
-              int lag, int   n)
+const float *x,   /*  in: [0...n-1] samples x   */
+float       *ac,  /* out: [0...lag-1] ac values */
+int          lag, 
+int          n
+)
 {
-   float d; int i;
-   while (lag--) {
-      for (i = lag, d = 0; i < n; i++) d += x[i] * x[i-lag];
+   float d;
+   int i;
+   while (lag--) 
+   {
+      for (i = lag, d = 0; i < n; i++) 
+         d += x[i] * x[i-lag];
       ac[lag] = d;
    }
 }
index e3f70b5..57ca9e7 100644 (file)
@@ -39,10 +39,9 @@ void _spx_autocorr(
               int lag, int   n);
 
 float                      /* returns minimum mean square error    */
-wld(
+_spx_lpc(
     float       * lpc, /*      [0...p-1] LPC coefficients      */
     const float * ac,  /*  in: [0...p] autocorrelation values  */
-    float       * ref, /* out: [0...p-1] reflection coef's     */
     int p
     );
 
index 6759381..1e592da 100644 (file)
@@ -150,7 +150,7 @@ void *nb_encoder_init(SpeexMode *m)
    st->old_qlsp = PUSH(st->stack, st->lpcSize, float);
    st->interp_lsp = PUSH(st->stack, st->lpcSize, float);
    st->interp_qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->rc = PUSH(st->stack, st->lpcSize, float);
+
    st->first = 1;
    for (i=0;i<st->lpcSize;i++)
    {
@@ -241,7 +241,7 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
       st->autocorr[i] *= st->lagWindow[i];
 
    /* Levinson-Durbin */
-   wld(st->lpc+1, st->autocorr, st->rc, st->lpcSize);
+   _spx_lpc(st->lpc+1, st->autocorr, st->lpcSize);
    st->lpc[0]=1;
 
    /* LPC to LSPs (x-domain) transform */
index 52cafa1..f7d84e0 100644 (file)
@@ -97,7 +97,6 @@ typedef struct EncState {
    float *interp_qlpc;    /**< Interpolated quantized LPCs */
    float *bw_lpc1;        /**< LPCs after bandwidth expansion by gamma1 for perceptual weighting*/
    float *bw_lpc2;        /**< LPCs after bandwidth expansion by gamma2 for perceptual weighting*/
-   float *rc;             /**< Reflection coefficients */
    float *mem_sp;         /**< Filter memory for signal synthesis */
    float *mem_sw;         /**< Filter memory for perceptually-weighted signal */
    float *mem_sw_whole;   /**< Filter memory for perceptually-weighted signal (whole frame)*/
index 8fd7680..b41dcc7 100644 (file)
@@ -189,7 +189,6 @@ void *sb_encoder_init(SpeexMode *m)
    for (i=0;i<st->lpcSize+1;i++)
       st->lagWindow[i]=exp(-.5*sqr(2*M_PI*st->lag_factor*i));
 
-   st->rc = PUSH(st->stack, st->lpcSize, float);
    st->autocorr = PUSH(st->stack, st->lpcSize+1, float);
    st->lpc = PUSH(st->stack, st->lpcSize+1, float);
    st->bw_lpc1 = PUSH(st->stack, st->lpcSize+1, float);
@@ -288,7 +287,7 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
       st->autocorr[i] *= st->lagWindow[i];
 
    /* Levinson-Durbin */
-   wld(st->lpc+1, st->autocorr, st->rc, st->lpcSize);
+   _spx_lpc(st->lpc+1, st->autocorr, st->lpcSize);
    st->lpc[0]=1;
 
    /* LPC to LSPs (x-domain) transform */
index 64b23ee..a2c58ee 100644 (file)
@@ -72,7 +72,6 @@ typedef struct SBEncState {
    float *window;              /**< LPC analysis window */
    float *lagWindow;           /**< Auto-correlation window */
    float *autocorr;            /**< Auto-correlation (for LPC analysis) */
-   float *rc;                  /**< Reflection coefficients (unused) */
    float *lpc;                 /**< LPC coefficients */
    float *lsp;                 /**< LSP coefficients */
    float *qlsp;                /**< Quantized LSPs */