fixed-point: lpc stuff
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:29:45 +0000 (04:29 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:29:45 +0000 (04:29 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5412 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters.c
libspeex/lpc.c
libspeex/lsp.c
libspeex/misc.h
libspeex/modes.c
libspeex/nb_celp.c

index 9176e8c..eb1e5ed 100644 (file)
@@ -88,6 +88,11 @@ void iir_mem2(float *x, spx_coef_t *den, float *y, int N, int ord, spx_mem_t *me
    
    for (i=0;i<11;i++)
    {
+      if (fabs(den[i])>3.999)
+      {
+         speex_warning_int("tata", den[i]*100);
+         den[i]=3.999;
+      }
       dens[i] = (int)floor(.5+8192*den[i]);
    }
 
index c7bbafd..8bffcad 100644 (file)
 
 #include "lpc.h"
 
+#ifdef FIXED_POINT
+#include <math.h>
+
+/* returns minimum mean square error    */
+float _spx_lpc(
+spx_coef_t       *lpc, /* out: [0...p-1] LPC coefficients      */
+const float *ac,  /* in:  [0...p] autocorrelation values  */
+int          p
+)
+{
+   int i, j;  
+   spx_word16_t r;
+   spx_word16_t error = floor(ac[0]);
+   spx_word16_t lpcq[10];
+
+   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 */
+      int rr = -8192.*floor(ac[i + 1]);
+      for (j = 0; j < i; j++) 
+         rr -= lpcq[j] * floor(ac[i - j]);
+      r = DIV32_16(rr,error+16);
+
+      /*  Update LPC coefficients and total error */
+      lpcq[i] = r;
+      for (j = 0; j < i/2; j++) 
+      {
+         spx_word16_t tmp  = lpcq[j];
+         lpcq[j]     += MULT16_16_Q13(r,lpcq[i-1-j]);
+         lpcq[i-1-j] += MULT16_16_Q13(r,tmp);
+      }
+      if (i & 1) 
+         lpcq[j] += MULT16_16_Q13(lpcq[j],r);
+
+      error -= MULT16_16_Q13(r,MULT16_16_Q13(error,r));
+   }
+   for (i = 0; i < p; i++)
+      lpc[i] = lpcq[i]/8192.;
+   return error;
+}
+
+
+/* Compute the autocorrelation
+ *                      ,--,
+ *              ac(i) = >  x(n) * x(n-i)  for all n
+ *                      `--'
+ * 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
+)
+{
+   float d;
+   int i, j;
+   for (i=0;i<lag;i++)
+   {
+      d=0;
+      for (j=i;j<n;j++)
+      {
+         d += x[j] * x[j-i];
+      }
+      if (i==0)
+         ac[i] = d+.01;
+      else
+         ac[i] = 8192.*d/ac[0];
+   }
+   ac[0] = 8192.;
+}
+
+
+#else
+
+
+
 /* returns minimum mean square error    */
 float _spx_lpc(
 spx_coef_t       *lpc, /* out: [0...p-1] LPC coefficients      */
@@ -125,4 +209,9 @@ int          n
          d += x[i] * x[i-lag];
       ac[lag] = d;
    }
+   ac[0] += 10;
 }
+
+#endif
+
+
index b5c97d9..ccb8bcd 100644 (file)
@@ -67,16 +67,10 @@ Modified by Jean-Marc Valin
 
 \*---------------------------------------------------------------------------*/
 
+#undef FIXED_POINT
 
 #ifdef FIXED_POINT
 
-#define SCALE1 8192.
-#define SCALE2 16384.
-#define SCALE 16384.
-
-#include <stdio.h>
-
-
 static float cheb_poly_eva(float *coef,float x,int m,char *stack)
 /*  float coef[]       coefficients of the polynomial to be evaluated  */
 /*  float x            the point where polynomial is to be evaluated   */
@@ -299,7 +293,7 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
 
 \*---------------------------------------------------------------------------*/
 
-#if FIXED_POINT
+#ifdef FIXED_POINT
 
 void lsp_to_lpc(float *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 /*  float *freq        array of LSP frequencies in the x domain        */
index e753f89..420dfe2 100644 (file)
@@ -63,6 +63,9 @@ typedef int spx_word32_t;
 
 #define MULT16_16_P14(a,b) ((8192+((signed int)(a))*(b))>>14)
 
+
+#define DIV32_16(a,b) (((signed int)(a))/(b))
+
 #else
 
 typedef float spx_mem_t;
index 43ab10d..980ada2 100644 (file)
@@ -350,8 +350,8 @@ static SpeexNBMode nb_mode = {
    144,    /*pitchEnd*/
    0.9,    /*gamma1*/
    0.6,    /*gamma2*/
-   .01,   /*lag_factor*/
-   1.0001, /*lpc_floor*/
+   .012,   /*lag_factor*/
+   1.0002, /*lpc_floor*/
    0.0,    /*preemph*/
 #ifdef EPIC_48K
    0,
index 1b2122b..322feb2 100644 (file)
@@ -235,7 +235,6 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
    /* Compute auto-correlation */
    _spx_autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
 
-   st->autocorr[0] += 10;        /* prevents NANs */
    st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */