fixed-point: cleaned up operators, removed a couple float ops, fixed a
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 05:08:56 +0000 (05:08 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 05:08:56 +0000 (05:08 +0000)
MULT16_16 that had a 32-bit operand in ltp.c

git-svn-id: http://svn.xiph.org/trunk/speex@5530 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/lpc.c
libspeex/lsp.c
libspeex/ltp.c
libspeex/misc.h
libspeex/quant_lsp.c

index 84b5be2..01acecc 100644 (file)
@@ -235,7 +235,7 @@ 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] -= SHR(MULT16_16(g,r[q]),11);
+                     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++)
index 2f57f53..f84bcf2 100644 (file)
@@ -131,7 +131,7 @@ int          n
    int shift, ac_shift;
    
    for (j=0;j<n;j++)
-      ac0 += MULT16_16(x[j],x[j])/256;
+      ac0 += SHR(MULT16_16(x[j],x[j]),8);
    ac0 += n;
    shift = 8;
    while (shift && ac0<0x40000000)
index 7c170d2..9b1df30 100644 (file)
@@ -79,8 +79,15 @@ static spx_word16_t cos_32(spx_word16_t x)
 #define ANGLE2X(a) (SHL(cos_32(a),2))
 #define X2ANGLE(x) (acos(x)*LSP_SCALING)
 
+/* maybe we could approximate acos as 
+   sqrt(6.7349563814-5.213449731*sqrt(0.6688572663+x))
+*/
 #else
 
+#define C1 0.99940307
+#define C2 -0.49558072
+#define C3 0.03679168
+
 #define ANGLE2X(a) (cos(a))
 #define X2ANGLE(x) (acos(x))
 
index dbb4b90..e18cf95 100644 (file)
@@ -390,12 +390,12 @@ int cdbk_offset
    
 #ifdef FIXED_POINT
    for (i=0;i<nsf;i++)
-      exc[i]=MULT16_16(sgain[0],SHR(e[2][i],6))+MULT16_16(sgain[1],SHR(e[1][i],6))+MULT16_16(sgain[2],SHR(e[0][i],6));
+     exc[i]=MULT16_32_Q13(SHL(sgain[0],7),e[2][i])+MULT16_32_Q13(SHL(sgain[1],7),e[1][i])+MULT16_32_Q13(SHL(sgain[2],7),e[0][i]);
    
    err=0;
    for (i=0;i<nsf;i++)
    {
-      spx_sig_t perr=target[i]-(MULT16_16(sgain[0],SHR(x[2][i],6))+MULT16_16(sgain[1],SHR(x[1][i],6))+MULT16_16(sgain[2],SHR(x[0][i],6)));
+      spx_sig_t perr=target[i]-(MULT16_32_Q13(SHL(sgain[0],7),x[2][i])+MULT16_32_Q13(SHL(sgain[1],7),x[1][i])+MULT16_32_Q13(SHL(sgain[2],7),x[0][i]));
       spx_word16_t perr2 = SHR(perr,15);
       err += MULT16_16(perr2,perr2);
       
@@ -620,7 +620,7 @@ int cdbk_offset
          sgain[1] = 64*gain[1];
          sgain[2] = 64*gain[2];
          for (i=0;i<nsf;i++)
-            exc[i]=MULT16_16(sgain[0],SHR(e[2][i],6))+MULT16_16(sgain[1],SHR(e[1][i],6))+MULT16_16(sgain[2],SHR(e[0][i],6));
+            exc[i]=MULT16_32_Q13(SHL(sgain[0],7),e[2][i])+MULT16_32_Q13(SHL(sgain[1],7),e[1][i])+MULT16_32_Q13(SHL(sgain[2],7),e[0][i]);
       }
 #else
       for (i=0;i<nsf;i++)
index 37966d3..90c5f01 100644 (file)
@@ -59,19 +59,25 @@ typedef spx_word32_t spx_sig_t;
 #define SHR(a,shift) ((a) >> (shift))
 #define SHL(a,shift) ((a) << (shift))
 
+#define ADD16(a,b) ((a)+(b))
+#define ADD32(a,b) ((a)+(b))
+
 /* result fits in 16 bits */
-#define MULT16_16_16(a,b)     (((short)(a))*(b))
+#define MULT16_16_16(a,b)     (((short)(a))*((short)(b)))
+
+/* Kludge: just making sure results are on 32 bits */
+#define MULT16_16(a,b)     (((int)(a))*((short)(b)))
 
-#define MULT16_16(a,b)     (((a))*(b))
-#define MULT16_32_Q13(a,b) (((a)*((b)>>13)) + ((a)*((short)((b)&0x00001fff))>>13))
-#define MULT16_32_Q14(a,b) (((a)*((b)>>14)) + ((a)*((short)((b)&0x00003fff))>>14))
-#define MULT16_32_Q15(a,b) (((a)*((b)>>15)) + ((a)*((short)((b)&0x00007fff))>>15))
+#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
+#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13))
+#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
 
-#define MULT16_16_Q13(a,b) (((short)(a))*(b)>>13)
-#define MULT16_16_Q14(a,b) (((short)(a))*(b)>>14)
-#define MULT16_16_Q15(a,b) (((short)(a))*(b)>>15)
+#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
+#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
+#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
 
-#define MULT16_16_P14(a,b) ((8192+((short)(a))*(b))>>14)
+#define MULT16_16_P14(a,b) (SHR(ADD16(8192,MULT16_16((a),(b))),14))
 
 
 #define DIV32_16(a,b) (((signed int)(a))/(b))
index cfc3f5c..616f3ff 100644 (file)
 
 #ifdef FIXED_POINT
 #define LSP_LINEAR(i) (SHL(i+1,11))
+#define LSP_DIV_256(x) (SHL((spx_word16_t)x, 5))
+#define LSP_DIV_512(x) (SHL((spx_word16_t)x, 4))
+#define LSP_DIV_1024(x) (SHL((spx_word16_t)x, 3))
+
 #else
+
 #define LSP_LINEAR(i) (.25*(i)+.25)
 #define LSP_SCALE 256.
+#define LSP_DIV_256(x) (0.0039062*(x))
+#define LSP_DIV_512(x) (0.0019531*(x))
+#define LSP_DIV_1024(x) (0.00097656*(x))
+
 #endif
 
 static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order)
@@ -188,23 +197,23 @@ void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits)
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<10;i++)
-      lsp[i] += LSP_SCALING*(0.0039062*cdbk_nb[id*10+i]);
+      lsp[i] += LSP_DIV_256(cdbk_nb[id*10+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] += LSP_SCALING*(0.0019531 * cdbk_nb_low1[id*5+i]);
+      lsp[i] += LSP_DIV_512(cdbk_nb_low1[id*5+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] += LSP_SCALING*(0.00097656 * cdbk_nb_low2[id*5+i]);
+      lsp[i] += LSP_DIV_1024(cdbk_nb_low2[id*5+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += LSP_SCALING*(0.0019531 * cdbk_nb_high1[id*5+i]);
+      lsp[i+5] += LSP_DIV_512(cdbk_nb_high1[id*5+i]);
    
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += LSP_SCALING*(0.00097656 * cdbk_nb_high2[id*5+i]);
+      lsp[i+5] += LSP_DIV_1024(cdbk_nb_high2[id*5+i]);
 }
 
 
@@ -258,15 +267,15 @@ void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits)
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<10;i++)
-      lsp[i] += LSP_SCALING*0.0039062*cdbk_nb[id*10+i];
+      lsp[i] += LSP_DIV_256(cdbk_nb[id*10+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] += LSP_SCALING*0.0019531*cdbk_nb_low1[id*5+i];
+      lsp[i] += LSP_DIV_512(cdbk_nb_low1[id*5+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += LSP_SCALING*0.0019531*cdbk_nb_high1[id*5+i];
+      lsp[i+5] += LSP_DIV_512(cdbk_nb_high1[id*5+i]);
    
 }