...
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 05:55:22 +0000 (05:55 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 05:55:22 +0000 (05:55 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5531 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/filters.c
libspeex/lsp.c
libspeex/misc.h

index 01acecc..933b85d 100644 (file)
@@ -143,17 +143,18 @@ int   complexity
       {
          spx_word32_t resj=0;
          for (k=0;k<=j;k++)
-            resj += shape[k]*r[j-k];
+            resj = ADD32(resj,MULT16_32_Q11(shape[k],r[j-k]));
+#ifndef FIXED_POINT
          resj *= 0.03125;
-         
-         res[j] = SHR(resj,6);
+#endif
+         res[j] = resj;
          /*printf ("%d\n", (int)res[j]);*/
       }
       
       /* Compute codeword energy */
       E[i]=0;
       for(j=0;j<subvect_size;j++)
-         E[i]+=MULT16_16(res[j],res[j]);
+         E[i]=ADD32(E[i],MULT16_16(res[j],res[j]));
    }
 
    for (j=0;j<N;j++)
index 1a8972c..5950f2d 100644 (file)
@@ -338,7 +338,7 @@ void fir_mem_up(spx_sig_t *x, spx_word16_t *a, spx_sig_t *y, int N, int M, spx_w
       spx_sig_t y0, y1, y2, y3;
       spx_word16_t x0;
 
-      y0 = y1 = y2 = y3 = 0.f;
+      y0 = y1 = y2 = y3 = 0;
       x0 = xx[N-4-i];
 
       for (j = 0; j < M; j += 4) {
index 9b1df30..12e8623 100644 (file)
@@ -107,7 +107,7 @@ static spx_word16_t cos_32(spx_word16_t x)
 
 #ifdef FIXED_POINT
 
-static float cheb_poly_eva(spx_word32_t *coef,float x,int m,char *stack)
+static spx_word32_t 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                         */
@@ -193,6 +193,11 @@ static float cheb_poly_eva(spx_word32_t *coef,float x,int m,char *stack)
 
 \*---------------------------------------------------------------------------*/
 
+#ifdef FIXED_POINT
+#define SIGN_CHANGE(a,b) (((a)&0x70000000)^((b)&0x70000000)||(b==0))
+#else
+#define SIGN_CHANGE(a,b) (((a)*(b))<0.0)
+#endif
 
 int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,float delta, char *stack)
 /*  float *a                   lpc coefficients                        */
@@ -204,8 +209,8 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,float delta, cha
 
 {
 
-    float psuml,psumr,psumm,temp_xr,xl,xr,xm=0;
-    float temp_psumr/*,temp_qsumr*/;
+    float temp_xr,xl,xr,xm=0;
+    spx_word32_t psuml,psumr,psumm,temp_psumr/*,temp_qsumr*/;
     int i,j,m,flag,k;
     spx_word32_t *Q;                   /* ptrs for memory allocation           */
     spx_word32_t *P;
@@ -311,18 +316,20 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,float delta, cha
     between xm and xr else set interval between xl and xr and repeat till
     root is located within the specified limits                        */
 
-           if((psumr*psuml)<0.0){
+           if(SIGN_CHANGE(psumr,psuml))
+            {
                roots++;
 
                psumm=psuml;
                for(k=0;k<=nb;k++){
                    xm = (xl+xr)/2;             /* bisect the interval  */
                    psumm=cheb_poly_eva(pt,xm,lpcrdr,stack);
-                   if(psumm*psuml>0.){
+                   /*if(psumm*psuml>0.)*/
+                   if(!SIGN_CHANGE(psumm,psuml))
+                    {
                        psuml=psumm;
                        xl=xm;
-                   }
-                   else{
+                   } else {
                        psumr=psumm;
                        xr=xm;
                    }
index 90c5f01..655ec59 100644 (file)
@@ -60,7 +60,9 @@ typedef spx_word32_t spx_sig_t;
 #define SHL(a,shift) ((a) << (shift))
 
 #define ADD16(a,b) ((a)+(b))
+#define SUB16(a,b) ((a)-(b))
 #define ADD32(a,b) ((a)+(b))
+#define SUB32(a,b) ((a)-(b))
 
 /* result fits in 16 bits */
 #define MULT16_16_16(a,b)     (((short)(a))*((short)(b)))
@@ -80,7 +82,7 @@ typedef spx_word32_t spx_sig_t;
 #define MULT16_16_P14(a,b) (SHR(ADD16(8192,MULT16_16((a),(b))),14))
 
 
-#define DIV32_16(a,b) (((signed int)(a))/(b))
+#define DIV32_16(a,b) (((signed int)(a))/((short)(b)))
 
 #else
 
@@ -101,9 +103,14 @@ typedef float spx_word32_t;
 #define PSHR(a,shift)       (a)
 #define SHR(a,shift)       (a)
 #define SHL(a,shift)       (a)
+#define ADD16(a,b) ((a)+(b))
+#define SUB16(a,b) ((a)-(b))
+#define ADD32(a,b) ((a)+(b))
+#define SUB32(a,b) ((a)-(b))
 #define MULT16_16_16(a,b)     ((a)*(b))
 #define MULT16_16(a,b)     ((a)*(b))
 
+#define MULT16_32_Q11(a,b)     ((a)*(b))
 #define MULT16_32_Q13(a,b)     ((a)*(b))
 #define MULT16_32_Q14(a,b)     ((a)*(b))
 #define MULT16_32_Q15(a,b)     ((a)*(b))