fixed-point: more LPC/LSP cleanup
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:33:36 +0000 (04:33 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:33:36 +0000 (04:33 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5416 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters.c
libspeex/lpc.c
libspeex/lsp.c
libspeex/modes.c
libspeex/sb_celp.c

index 4951c96..4b3294a 100644 (file)
@@ -57,13 +57,6 @@ void filter_mem2(float *x, spx_coef_t *num, spx_coef_t *den, float *y, int N, in
 {
    int i,j;
    int xi,yi;
-   short nums[11], dens[11];
-   
-   for (i=0;i<ord+1;i++)
-   {
-      nums[i] = (int)floor(.5+num[i]);
-      dens[i] = (int)floor(.5+den[i]);
-   }
 
    for (i=0;i<N;i++)
    {
@@ -73,9 +66,9 @@ void filter_mem2(float *x, spx_coef_t *num, spx_coef_t *den, float *y, int N, in
       xh = xi>>15; xl=xi&0x00007fff; yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = mem[j+1] +  MUL_16_32_R15(nums[j+1],xh,xl) - MUL_16_32_R15(dens[j+1],yh,yl);
+         mem[j] = mem[j+1] +  MUL_16_32_R15(num[j+1],xh,xl) - MUL_16_32_R15(den[j+1],yh,yl);
       }
-      mem[ord-1] = MUL_16_32_R15(nums[ord],xh,xl) - MUL_16_32_R15(dens[ord],yh,yl);
+      mem[ord-1] = MUL_16_32_R15(num[ord],xh,xl) - MUL_16_32_R15(den[ord],yh,yl);
       y[i] = yi*(1.f/16384.f);
    }
 }
@@ -84,18 +77,7 @@ void iir_mem2(float *x, spx_coef_t *den, float *y, int N, int ord, spx_mem_t *me
 {
    int i,j;
    int xi,yi;
-   short dens[11];
    
-   for (i=0;i<11;i++)
-   {
-      if (fabs(den[i])>3.999*8192)
-      {
-         speex_warning_int("tata", den[i]*100);
-         den[i]=3.999*8192;
-      }
-      dens[i] = (int)floor(.5+den[i]);
-   }
-
    for (i=0;i<N;i++)
    {
       int yh,yl;
@@ -104,9 +86,9 @@ void iir_mem2(float *x, spx_coef_t *den, float *y, int N, int ord, spx_mem_t *me
       yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = mem[j+1] - MUL_16_32_R15(dens[j+1],yh,yl);
+         mem[j] = mem[j+1] - MUL_16_32_R15(den[j+1],yh,yl);
       }
-      mem[ord-1] = - MUL_16_32_R15(dens[ord],yh,yl);
+      mem[ord-1] = - MUL_16_32_R15(den[ord],yh,yl);
       y[i] = yi*(1.f/16384.f);
    }
 }
@@ -116,12 +98,6 @@ void fir_mem2(float *x, spx_coef_t *num, float *y, int N, int ord, spx_mem_t *me
 {
    int i,j;
    int xi,yi;
-   short nums[11];
-   
-   for (i=0;i<11;i++)
-   {
-      nums[i] = (int)floor(.5+num[i]);
-   }
 
    for (i=0;i<N;i++)
    {
@@ -131,9 +107,9 @@ void fir_mem2(float *x, spx_coef_t *num, float *y, int N, int ord, spx_mem_t *me
       xh = xi>>15; xl=xi&0x00007fff;
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = mem[j+1] +  MUL_16_32_R15(nums[j+1],xh,xl);
+         mem[j] = mem[j+1] +  MUL_16_32_R15(num[j+1],xh,xl);
       }
-      mem[ord-1] = MUL_16_32_R15(nums[ord],xh,xl);
+      mem[ord-1] = MUL_16_32_R15(num[ord],xh,xl);
       y[i] = yi*(1.f/16384.f);
    }
 
index 0b8e2c0..59cea94 100644 (file)
@@ -76,7 +76,6 @@ int          p
    int i, j;  
    spx_word16_t r;
    spx_word16_t error = ac[0];
-   spx_word16_t lpcq[10];
 
    if (ac[0] == 0)
    {
@@ -90,24 +89,22 @@ int          p
       /* Sum up this iteration's reflection coefficient */
       int rr = -ac[i + 1]<<13;
       for (j = 0; j < i; j++) 
-         rr -= lpcq[j] * ac[i - j];
+         rr -= lpc[j] * ac[i - j];
       r = DIV32_16(rr,error+16);
 
       /*  Update LPC coefficients and total error */
-      lpcq[i] = r;
+      lpc[i] = r;
       for (j = 0; j < i>>1; 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);
+         spx_word16_t tmp  = lpc[j];
+         lpc[j]     += MULT16_16_Q13(r,lpc[i-1-j]);
+         lpc[i-1-j] += MULT16_16_Q13(r,tmp);
       }
       if (i & 1) 
-         lpcq[j] += MULT16_16_Q13(lpcq[j],r);
+         lpc[j] += MULT16_16_Q13(lpc[j],r);
 
       error -= MULT16_16_Q13(r,MULT16_16_Q13(error,r));
    }
-   for (i = 0; i < p; i++)
-      lpc[i] = lpcq[i];
    return error;
 }
 
@@ -158,7 +155,7 @@ int          n
       
       ac[i] = d >> ac_shift;
    }
-   /*ac[0] = 8192.;*/
+   /*ac[0] += 1;*/
    /*printf ("%d %d %d, %f\n", ac0, shift, ac_shift, ac[0]);*/
 }
 
index 4b86d6d..1c45f5b 100644 (file)
@@ -69,7 +69,7 @@ Modified by Jean-Marc Valin
 
 #ifdef FIXED_POINT
 
-static float cheb_poly_eva(float *coef,float x,int m,char *stack)
+static float cheb_poly_eva(spx_word32_t *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   */
 /*  int m              order of the polynomial                         */
@@ -89,7 +89,7 @@ static float cheb_poly_eva(float *coef,float x,int m,char *stack)
     
     for (i=0;i<m2+1;i++)
     {
-       coefn[i] = floor(.5+1024*coef[i]);
+       coefn[i] = coef[i];
        /*printf ("%f ", coef[i]);*/
     }
     /*printf ("\n");*/
@@ -113,7 +113,7 @@ static float cheb_poly_eva(float *coef,float x,int m,char *stack)
     return sum;
 }
 #else
-static float cheb_poly_eva(float *coef,float x,int m,char *stack)
+static float cheb_poly_eva(spx_word32_t *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   */
 /*  int m              order of the polynomial                         */
@@ -169,13 +169,13 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
     float psuml,psumr,psumm,temp_xr,xl,xr,xm=0;
     float temp_psumr/*,temp_qsumr*/;
     int i,j,m,flag,k;
-    float *Q;                  /* ptrs for memory allocation           */
-    float *P;
-    float *px;                 /* ptrs of respective P'(z) & Q'(z)     */
-    float *qx;
-    float *p;
-    float *q;
-    float *pt;                 /* ptr used for cheb_poly_eval()
+    spx_word32_t *Q;                   /* ptrs for memory allocation           */
+    spx_word32_t *P;
+    spx_word32_t *px;                  /* ptrs of respective P'(z) & Q'(z)     */
+    spx_word32_t *qx;
+    spx_word32_t *p;
+    spx_word32_t *q;
+    spx_word32_t *pt;                  /* ptr used for cheb_poly_eval()
                                whether P' or Q'                        */
     int roots=0;               /* DR 8/2/94: number of roots found     */
     flag = 1;                  /*  program is searching for a root when,
@@ -184,8 +184,8 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
 
 
     /* Allocate memory space for polynomials */
-    Q = PUSH(stack, (m+1), float);
-    P = PUSH(stack, (m+1), float);
+    Q = PUSH(stack, (m+1), spx_word32_t);
+    P = PUSH(stack, (m+1), spx_word32_t);
 
     /* determine P'(z)'s and Q'(z)'s coefficients where
       P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */
@@ -194,11 +194,35 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
     qx = Q;
     p = px;
     q = qx;
-    *px++ = 1.0;
-    *qx++ = 1.0;
+
+#ifdef FIXED_POINT
+    *px++ = LPC_SCALING;
+    *qx++ = LPC_SCALING;
     for(i=1;i<=m;i++){
-       *px++ = (a[i]+a[lpcrdr+1-i])/LPC_SCALING - *p++;
-       *qx++ = (a[i]-a[lpcrdr+1-i])/LPC_SCALING + *q++;
+       *px++ = (a[i]+a[lpcrdr+1-i]) - *p++;
+       *qx++ = (a[i]-a[lpcrdr+1-i]) + *q++;
+    }
+    px = P;
+    qx = Q;
+    for(i=0;i<m;i++)
+    {
+       /*if (fabs(*px)>=32768)
+          speex_warning_int("px", *px);
+       if (fabs(*qx)>=32768)
+       speex_warning_int("qx", *qx);*/
+       *px = (2+*px)>>2;
+       *qx = (2+*qx)>>2;
+       px++;
+       qx++;
+    }
+    P[m] = (4+P[m])>>3;
+    Q[m] = (4+Q[m])>>3;
+#else
+    *px++ = LPC_SCALING;
+    *qx++ = LPC_SCALING;
+    for(i=1;i<=m;i++){
+       *px++ = (a[i]+a[lpcrdr+1-i]) - *p++;
+       *qx++ = (a[i]-a[lpcrdr+1-i]) + *q++;
     }
     px = P;
     qx = Q;
@@ -208,6 +232,8 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
         px++;
         qx++;
     }
+#endif
+
     px = P;                    /* re-initialise ptrs                   */
     qx = Q;
 
index 980ada2..5b65520 100644 (file)
@@ -479,7 +479,7 @@ static SpeexSBMode sb_wb_mode = {
    640,    /*bufSize*/
    .9,    /*gamma1*/
    0.6,    /*gamma2*/
-   .002,   /*lag_factor*/
+   .001,   /*lag_factor*/
    1.0001, /*lpc_floor*/
    0.0,    /*preemph*/
    0.9,
index b03bd48..85b9793 100644 (file)
@@ -282,7 +282,6 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
    /* Compute auto-correlation */
    _spx_autocorr(st->buf, st->autocorr, st->lpcSize+1, st->windowSize);
 
-   st->autocorr[0] += 1;        /* prevents NANs */
    st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)