fixed-point: cos approximation for lsp_to_lpc, removed some float ops
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 1 Nov 2003 17:42:22 +0000 (17:42 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 1 Nov 2003 17:42:22 +0000 (17:42 +0000)
in LSP quantization (more to do).

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

libspeex/lsp.c
libspeex/quant_lsp.c

index b68dbd6..7c170d2 100644 (file)
@@ -57,11 +57,33 @@ Modified by Jean-Marc Valin
 #endif
 
 #ifdef FIXED_POINT
-#define ANGLE2X(a) (cos((a)/LSP_SCALING))
+
+#define C1 8187
+#define C2 -4058
+#define C3 301
+static spx_word16_t cos_32(spx_word16_t x)
+{
+   spx_word16_t x2;
+
+   if (x<12868)
+   {
+      x2 = MULT16_16_Q13(x,x);
+      return C1 + MULT16_16_Q13(x2, C2 + MULT16_16_Q13(C3, x2));
+   } else {
+      x = 25736-x;
+      x2 = MULT16_16_Q13(x,x);
+      return -C1 - MULT16_16_Q13(x2, C2 + MULT16_16_Q13(C3, x2));
+   }
+}
+
+#define ANGLE2X(a) (SHL(cos_32(a),2))
 #define X2ANGLE(x) (acos(x)*LSP_SCALING)
+
 #else
+
 #define ANGLE2X(a) (cos(a))
 #define X2ANGLE(x) (acos(x))
+
 #endif
 
 
@@ -344,7 +366,7 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
     
     freqn = PUSH(stack, lpcrdr, spx_word16_t);
     for (i=0;i<lpcrdr;i++)
-       freqn[i] = ANGLE2X(freq[i])*32768.;
+       freqn[i] = ANGLE2X(freq[i]);
 
     Wp = PUSH(stack, 4*m+2, spx_word32_t);
     pw = Wp;
index 80a1403..cfc3f5c 100644 (file)
 /* FIXME: Get rid of this kludge quick before someone gets hurt */
 
 #ifdef FIXED_POINT
-#define LSP_SCALE (8192./LSP_SCALING)
-#define LSP_OVERSCALE (32./LSP_SCALING)
+#define LSP_LINEAR(i) (SHL(i+1,11))
 #else
-#define LSP_SCALE 256
-#define LSP_OVERSCALE 1
+#define LSP_LINEAR(i) (.25*(i)+.25)
+#define LSP_SCALE 256.
 #endif
 
 static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order)
@@ -138,7 +137,7 @@ void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
    compute_quant_weights(qlsp, quant_weight, order);
 
    for (i=0;i<order;i++)
-      qlsp[i]-=LSP_SCALING*(.25*i+.25);
+      qlsp[i]-=LSP_LINEAR(i);
 
 #ifndef FIXED_POINT
    for (i=0;i<order;i++)
@@ -184,7 +183,7 @@ void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=LSP_SCALING*(.25*i+.25);
+      lsp[i]=LSP_LINEAR(i);
 
 
    id=speex_bits_unpack_unsigned(bits, 6);
@@ -221,7 +220,7 @@ void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
    compute_quant_weights(qlsp, quant_weight, order);
 
    for (i=0;i<order;i++)
-      qlsp[i]-=LSP_SCALING*(.25*i+.25);
+      qlsp[i]-=LSP_LINEAR(i);
 #ifndef FIXED_POINT
    for (i=0;i<order;i++)
       qlsp[i]=qlsp[i]*LSP_SCALE;
@@ -254,7 +253,7 @@ void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=LSP_SCALING*(.25*i+.25);
+      lsp[i]=LSP_LINEAR(i);
 
 
    id=speex_bits_unpack_unsigned(bits, 6);