some cleaning up
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 24 Apr 2005 04:45:44 +0000 (04:45 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 24 Apr 2005 04:45:44 +0000 (04:45 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@9176 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/fixed_debug.h
libspeex/lsp.c
libspeex/ltp.c

index 63a6509..5030c84 100644 (file)
@@ -61,16 +61,17 @@ static void compute_weighted_codebook(const signed char *shape_cb, const spx_wor
       for(j=0;j<subvect_size;j++)
       {
          spx_word32_t resj=0;
+         spx_word16_t res16;
          for (k=0;k<=j;k++)
             resj = MAC16_16(resj,shape[k],r[j-k]);
 #ifdef FIXED_POINT
-         resj = SHR32(resj, 11);
+         res16 = EXTRACT16(SHR32(resj, 11));
 #else
-         resj *= 0.03125;
+         res16 = 0.03125f*resj;
 #endif
          /* Compute codeword energy */
-         E[i]=ADD32(E[i],MULT16_16(EXTRACT16(resj),EXTRACT16(resj)));
-         res[j] = resj;
+         E[i]=MAC16_16(E[i],res16,res16);
+         res[j] = res16;
          /*printf ("%d\n", (int)res[j]);*/
       }
    }
index bd01751..040dd78 100644 (file)
@@ -245,19 +245,32 @@ static inline int MULT16_16(int a, int b)
    return res;
 }
 
-#define MAC16_16(c,a,b)     (ADD32((c),MULT16_16((a),(b))))
+#define MAC16_16(c,a,b)     (spx_mips--,ADD32((c),MULT16_16((a),(b))))
 #define MAC16_16_Q11(c,a,b)     (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11))))
 #define MAC16_16_Q13(c,a,b)     (ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13))))
 
-#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR32((b),12)), SHR32(MULT16_16((a),((b)&0x00000fff)),12))
-#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR32((b),13)), SHR32(MULT16_16((a),((b)&0x00001fff)),13))
-#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR32((b),14)), SHR32(MULT16_16((a),((b)&0x00003fff)),14))
+static inline int MULT16_32_QX(int a, long long b, int Q)
+{
+   long long res;
+   if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
+   {
+      fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d\n", Q, a, b);
+   }
+   res = (((long long)a)*(long long)b) >> Q;
+   if (!VERIFY_INT(res))
+      fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d\n", Q, a, b,(int)res);
+   spx_mips+=5;
+   return res;
+}
 
-#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR32((b),11)), SHR32(MULT16_16((a),((b)&0x000007ff)),11))
-#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR32((b),11)), SHR32(MULT16_16((a),((b)&0x000007ff)),11)))
 
-#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR32((b),15)), SHR32(MULT16_16((a),((b)&0x00007fff)),15))
-#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR32((b),15)), SHR32(MULT16_16((a),((b)&0x00007fff)),15)))
+#define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11)
+#define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b)))
+#define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12)
+#define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13)
+#define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14)
+#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
+#define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b)))
 
 static inline int SATURATE(int a, int b)
 {
@@ -377,8 +390,6 @@ static inline short MULT16_16_P15(int a, int b)
    return res;
 }
 
-#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
-
 
 static inline int DIV32_16(long long a, long long b) 
 {
@@ -401,7 +412,7 @@ static inline int DIV32_16(long long a, long long b)
       if (res<-32768)
          res = -32768;
    }
-   spx_mips++;
+   spx_mips+=20;
    return res;
 }
 static inline int DIV32(long long a, long long b) 
@@ -420,7 +431,7 @@ static inline int DIV32(long long a, long long b)
    res = a/b;
    if (!VERIFY_INT(res))
       fprintf (stderr, "DIV32: output is not int: %d\n", (int)res);
-   spx_mips++;
+   spx_mips+=36;
    return res;
 }
 
index e86facf..8358370 100644 (file)
@@ -287,27 +287,28 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,spx_word16_t del
           speex_warning_int("px", *px);
        if (fabs(*qx)>=32768)
        speex_warning_int("qx", *qx);*/
-       *px = (2+*px)>>2;
-       *qx = (2+*qx)>>2;
+       *px = PSHR32(*px,2);
+       *qx = PSHR32(*qx,2);
        px++;
        qx++;
     }
+    /* The reason for this lies in the way cheb_poly_eva() is implemented for fixed-point */
     P[m] = PSHR32(P[m],3);
     Q[m] = PSHR32(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++ = (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++){
-       *px = 2**px;
-       *qx = 2**qx;
-        px++;
-        qx++;
+       *px = 2**px;
+       *qx = 2**qx;
+       px++;
+       qx++;
     }
 #endif
 
index 46ec4af..a040326 100644 (file)
 
 static spx_word32_t inner_prod(const spx_word16_t *x, const spx_word16_t *y, int len)
 {
-   int i;
+   int i=0;
    spx_word32_t sum=0;
-   for (i=0;i<len;i+=4)
+   len >>= 2;
+   while(len--)
    {
       spx_word32_t part=0;
-      part = MAC16_16(part,x[i],y[i]);
-      part = MAC16_16(part,x[i+1],y[i+1]);
-      part = MAC16_16(part,x[i+2],y[i+2]);
-      part = MAC16_16(part,x[i+3],y[i+3]);
+      part = MAC16_16(part,*x++,*y++);
+      part = MAC16_16(part,*x++,*y++);
+      part = MAC16_16(part,*x++,*y++);
+      part = MAC16_16(part,*x++,*y++);
+      /* HINT: If you had a 40-bit accumulator, you could shift only at the end */
       sum = ADD32(sum,SHR32(part,6));
    }
    return sum;
 }
 
-#if 0 /* Enable this for machines with enough registers (i.e. not x86) */
+#if 0 /* HINT: Enable this for machines with enough registers (i.e. not x86) */
 static void pitch_xcorr(const spx_word16_t *_x, const spx_word16_t *_y, spx_word32_t *corr, int len, int nb_pitch, char *stack)
 {
    int i,j;