fixed-point: cleanup
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 06:59:48 +0000 (06:59 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 06:59:48 +0000 (06:59 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5533 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/filters.c
libspeex/ltp.c
libspeex/misc.h
libspeex/vq.c

index 933b85d..ea29364 100644 (file)
@@ -236,11 +236,11 @@ int   complexity
 #ifdef FIXED_POINT
                   g=sign*shape_cb[rind*subvect_size+m];
                   for (n=subvect_size*(i+1);n<nsf;n++,q++)
-                     t[n] -= MULT16_32_Q11(g,r[q]);
+                     t[n] = SUB32(t[n],MULT16_32_Q11(g,r[q]));
 #else
                   g=sign*0.03125*shape_cb[rind*subvect_size+m];
                   for (n=subvect_size*(i+1);n<nsf;n++,q++)
-                     t[n] -= g*r[q];
+                     t[n] = SUB32(t[n],g*r[q]);
 #endif
                }
 
index 5950f2d..6e1c2a1 100644 (file)
@@ -119,8 +119,6 @@ spx_word16_t compute_rms(spx_sig_t *x, int len)
    return (1<<(sig_shift+3))*sqrt(1+sum/len)/(float)SIG_SCALING;
 }
 
-#define MUL_16_32_R15(a,bh,bl) ((a)*(bh) + ((a)*(bl)>>15))
-
 
 void filter_mem2(spx_sig_t *x, spx_coef_t *num, spx_coef_t *den, spx_sig_t *y, int N, int ord, spx_mem_t *mem)
 {
@@ -135,9 +133,9 @@ void filter_mem2(spx_sig_t *x, spx_coef_t *num, spx_coef_t *den, spx_sig_t *y, i
       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(num[j+1],xh,xl) - MUL_16_32_R15(den[j+1],yh,yl);
+         mem[j] = SUB32(ADD32(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(num[ord],xh,xl) - MUL_16_32_R15(den[ord],yh,yl);
+      mem[ord-1] = SUB32(MUL_16_32_R15(num[ord],xh,xl), MUL_16_32_R15(den[ord],yh,yl));
       y[i] = yi;
    }
 }
@@ -155,7 +153,7 @@ void iir_mem2(spx_sig_t *x, spx_coef_t *den, spx_sig_t *y, int N, int ord, spx_m
       yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = mem[j+1] - MUL_16_32_R15(den[j+1],yh,yl);
+         mem[j] = SUB32(mem[j+1], MUL_16_32_R15(den[j+1],yh,yl));
       }
       mem[ord-1] = - MUL_16_32_R15(den[ord],yh,yl);
       y[i] = yi;
@@ -176,7 +174,7 @@ void fir_mem2(spx_sig_t *x, spx_coef_t *num, spx_sig_t *y, int N, int ord, spx_m
       xh = xi>>15; xl=xi&0x00007fff;
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = mem[j+1] +  MUL_16_32_R15(num[j+1],xh,xl);
+         mem[j] = ADD32(mem[j+1], MUL_16_32_R15(num[j+1],xh,xl));
       }
       mem[ord-1] = MUL_16_32_R15(num[ord],xh,xl);
       y[i] = yi;
index e18cf95..93aa346 100644 (file)
@@ -48,11 +48,11 @@ static spx_word32_t inner_prod(spx_word16_t *x, spx_word16_t *y, int len)
    for (i=0;i<len;i+=4)
    {
       spx_word32_t part=0;
-      part += MULT16_16(x[i],y[i]);
-      part += MULT16_16(x[i+1],y[i+1]);
-      part += MULT16_16(x[i+2],y[i+2]);
-      part += MULT16_16(x[i+3],y[i+3]);
-      sum += SHR(part,6);
+      part = ADD32(part,MULT16_16(x[i],y[i]));
+      part = ADD32(part,MULT16_16(x[i+1],y[i+1]));
+      part = ADD32(part,MULT16_16(x[i+2],y[i+2]));
+      part = ADD32(part,MULT16_16(x[i+3],y[i+3]));
+      sum = ADD32(sum,SHR(part,6));
    }
    return sum;
 }
index 655ec59..c260e1e 100644 (file)
@@ -81,6 +81,9 @@ typedef spx_word32_t spx_sig_t;
 
 #define MULT16_16_P14(a,b) (SHR(ADD16(8192,MULT16_16((a),(b))),14))
 
+#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
+
+
 
 #define DIV32_16(a,b) (((signed int)(a))/((short)(b)))
 
index 9a0f5e3..a7b2268 100644 (file)
@@ -63,9 +63,13 @@ void vq_nbest(spx_word16_t *in, spx_word16_t *codebook, int len, int entries, sp
    used = 0;
    for (i=0;i<entries;i++)
    {
+#ifdef FIXED_POINT
+      spx_word32_t dist=SHR(E[i],1);
+#else
       spx_word32_t dist=.5*E[i];
+#endif
       for (j=0;j<len;j++)
-         dist -= MULT16_16(in[j],*codebook++);
+         dist = SUB32(dist,MULT16_16(in[j],*codebook++));
       if (i<N || dist<best_dist[N-1])
       {
          for (k=N-1; (k >= 1) && (k > used || dist < best_dist[k-1]); k--)
@@ -89,7 +93,7 @@ void vq_nbest_sign(spx_word16_t *in, spx_word16_t *codebook, int len, int entrie
    {
       spx_word32_t dist=0;
       for (j=0;j<len;j++)
-         dist -= MULT16_16(in[j],*codebook++);
+         dist = SUB32(dist,MULT16_16(in[j],*codebook++));
       if (dist>0)
       {
          sign=1;
@@ -98,7 +102,11 @@ void vq_nbest_sign(spx_word16_t *in, spx_word16_t *codebook, int len, int entrie
       {
          sign=0;
       }
-      dist += .5*E[i];
+#ifdef FIXED_POINT
+      dist = ADD32(dist,SHR(E[i],1));
+#else
+      dist = ADD32(dist,.5*E[i]);
+#endif
       if (i<N || dist<best_dist[N-1])
       {
          for (k=N-1; (k >= 1) && (k > used || dist < best_dist[k-1]); k--)