fixed-point: more lpc stuff
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:30:25 +0000 (04:30 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:30:25 +0000 (04:30 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5413 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 8bffcad..88c4ccb 100644 (file)
 #include <math.h>
 
 /* returns minimum mean square error    */
-float _spx_lpc(
+spx_word32_t _spx_lpc(
 spx_coef_t       *lpc, /* out: [0...p-1] LPC coefficients      */
-const float *ac,  /* in:  [0...p] autocorrelation values  */
+const spx_word16_t *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 error = ac[0];
    spx_word16_t lpcq[10];
 
    if (ac[0] == 0)
@@ -88,14 +88,14 @@ int          p
    for (i = 0; i < p; i++) {
 
       /* Sum up this iteration's reflection coefficient */
-      int rr = -8192.*floor(ac[i + 1]);
+      int rr = -ac[i + 1]<<13;
       for (j = 0; j < i; j++) 
-         rr -= lpcq[j] * floor(ac[i - j]);
+         rr -= lpcq[j] * 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++) 
+      for (j = 0; j < i>>1; j++) 
       {
          spx_word16_t tmp  = lpcq[j];
          lpcq[j]     += MULT16_16_Q13(r,lpcq[i-1-j]);
@@ -118,28 +118,48 @@ int          p
  *                      `--'
  * for lags between 0 and lag-1, and x == 0 outside 0...n-1
  */
+#include <stdio.h>
 void _spx_autocorr(
 const float *x,   /*  in: [0...n-1] samples x   */
-float       *ac,  /* out: [0...lag-1] ac values */
+spx_word16_t       *ac,  /* out: [0...lag-1] ac values */
 int          lag, 
 int          n
 )
 {
-   float d;
+   spx_word32_t d;
    int i, j;
+   spx_word32_t ac0=1;
+   int shift, ac_shift;
+   
+   for (j=0;j<n;j++)
+      ac0 += floor(x[j]*x[j])/256;
+   ac0 += n;
+   shift = 8;
+   while (shift && ac0<0x40000000)
+   {
+      shift--;
+      ac0 <<= 1;
+   }
+   ac_shift = 18;
+   while (ac_shift && ac0<0x40000000)
+   {
+      ac_shift--;
+      ac0 <<= 1;
+   }
+   
+   
    for (i=0;i<lag;i++)
    {
       d=0;
       for (j=i;j<n;j++)
       {
-         d += x[j] * x[j-i];
+         d += ((int)(floor(x[j]) * floor(x[j-i]))) >> shift;
       }
-      if (i==0)
-         ac[i] = d+.01;
-      else
-         ac[i] = 8192.*d/ac[0];
+      
+      ac[i] = d >> ac_shift;
    }
-   ac[0] = 8192.;
+   /*ac[0] = 8192.;*/
+   /*printf ("%d %d %d, %f\n", ac0, shift, ac_shift, ac[0]);*/
 }
 
 
@@ -148,7 +168,7 @@ int          n
 
 
 /* returns minimum mean square error    */
-float _spx_lpc(
+spx_word32_t _spx_lpc(
 spx_coef_t       *lpc, /* out: [0...p-1] LPC coefficients      */
 const float *ac,  /* in:  [0...p] autocorrelation values  */
 int          p
index d95f56f..08d029b 100644 (file)
 
 void _spx_autocorr(
               const float * x,   /*  in: [0...n-1] samples x   */
-              float *ac,   /* out: [0...lag-1] ac values */
+              spx_word16_t *ac,   /* out: [0...lag-1] ac values */
               int lag, int   n);
 
-float                      /* returns minimum mean square error    */
+spx_word32_t                      /* returns minimum mean square error    */
 _spx_lpc(
     spx_coef_t       * lpc, /*      [0...p-1] LPC coefficients      */
-    const float * ac,  /*  in: [0...p] autocorrelation values  */
+    const spx_word16_t * ac,  /*  in: [0...p] autocorrelation values  */
     int p
     );
 
index 322feb2..f1fd3bf 100644 (file)
@@ -135,7 +135,7 @@ void *nb_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->autocorr = PUSH(st->stack, st->lpcSize+1, float);
+   st->autocorr = PUSH(st->stack, st->lpcSize+1, spx_word16_t);
 
    st->buf2 = PUSH(st->stack, st->windowSize, float);
 
index b878ce2..bb50f66 100644 (file)
@@ -84,7 +84,7 @@ typedef struct EncState {
    float *innov;          /**< Innovation for the frame */
    float *window;         /**< Temporary (Hanning) window */
    float *buf2;           /**< 2nd temporary buffer */
-   float *autocorr;       /**< auto-correlation */
+   spx_word16_t *autocorr;       /**< auto-correlation */
    float *lagWindow;      /**< Window applied to auto-correlation */
    spx_coef_t *lpc;            /**< LPCs for current frame */
    float *lsp;            /**< LSPs for current frame */
index 1c01da6..1acd45e 100644 (file)
@@ -190,7 +190,7 @@ 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->autocorr = PUSH(st->stack, st->lpcSize+1, float);
+   st->autocorr = PUSH(st->stack, st->lpcSize+1, spx_word16_t);
    st->lpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->bw_lpc1 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->bw_lpc2 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
index 3a14924..811f5db 100644 (file)
@@ -71,7 +71,7 @@ typedef struct SBEncState {
    float *target;              /**< Weighted target signal (analysis by synthesis) */
    float *window;              /**< LPC analysis window */
    float *lagWindow;           /**< Auto-correlation window */
-   float *autocorr;            /**< Auto-correlation (for LPC analysis) */
+   spx_word16_t *autocorr;            /**< Auto-correlation (for LPC analysis) */
    spx_coef_t *lpc;                 /**< LPC coefficients */
    float *lsp;                 /**< LSP coefficients */
    float *qlsp;                /**< Quantized LSPs */