fixed-point: increased precision of the cos approximation, fixed some Speex-1.1.2
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 11 Nov 2003 07:33:03 +0000 (07:33 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 11 Nov 2003 07:33:03 +0000 (07:33 +0000)
floating-point/fixed-point mismatch

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

libspeex/lsp.c
libspeex/nb_celp.c
libspeex/sb_celp.c

index 3597ec5..71ebff0 100644 (file)
@@ -58,26 +58,31 @@ Modified by Jean-Marc Valin
 
 #ifdef FIXED_POINT
 
-#define C1 8187
-#define C2 -4058
-#define C3 301
-static spx_word16_t cos_32(spx_word16_t x)
+#define C1 8192
+#define C2 -4096
+#define C3 340
+#define C4 -10
+
+static spx_word16_t spx_cos(spx_word16_t x)
 {
    spx_word16_t x2;
 
    if (x<12868)
    {
-      x2 = MULT16_16_Q13(x,x);
-      return ADD32(C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
+      x2 = MULT16_16_P13(x,x);
+      return ADD32(C1, MULT16_16_P13(x2, ADD32(C2, MULT16_16_P13(x2, ADD32(C3, MULT16_16_P13(C4, x2))))));
    } else {
       x = 25736-x;
-      x2 = MULT16_16_Q13(x,x);
-      return SUB32(-C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
+      x2 = MULT16_16_P13(x,x);
+      return SUB32(-C1, MULT16_16_P13(x2, ADD32(C2, MULT16_16_P13(x2, ADD32(C3, MULT16_16_P13(C4, x2))))));
+      //return SUB32(-C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
    }
 }
 
+
 #define FREQ_SCALE 16384
-#define ANGLE2X(a) (SHL(cos_32(a),2))
+//#define ANGLE2X(a) (32768*cos(((a)/8192.)))
+#define ANGLE2X(a) (SHL(spx_cos(a),2))
 //#define X2ANGLE(x) (acos(.00006103515625*(x))*LSP_SCALING)
 #define X2ANGLE(x) (spx_acos(x))
 /* maybe we could approximate acos as 
index 39dadea..0b09f65 100644 (file)
@@ -788,8 +788,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
          /*printf ("%f %f\n", ener, ol_gain);*/
 
          /* Normalize innovation */
+#ifdef FIXED_POINT
          signal_div(target, target, .5+ener, st->subframeSize);
-         
+#else
+         signal_div(target, target, ener, st->subframeSize);
+#endif
          /* Quantize innovation */
          if (SUBMODE(innovation_quant))
          {
@@ -799,7 +802,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
                                       innov, syn_resp, bits, stack, st->complexity);
             
             /* De-normalize innovation and update excitation */
+#ifdef FIXED_POINT
             signal_mul(innov, innov, .5+ener, st->subframeSize);
+#else
+            signal_mul(innov, innov, ener, st->subframeSize);
+#endif
 
             for (i=0;i<st->subframeSize;i++)
                exc[i] += innov[i];
@@ -824,7 +831,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
                exc[i] += innov2[i];
          }
 
+#ifdef FIXED_POINT
          signal_mul(target, target, .5+ener, st->subframeSize);
+#else
+         signal_mul(target, target, ener, st->subframeSize);
+#endif
       }
 
       /*Keep the previous memory*/
@@ -1523,8 +1534,11 @@ int nb_decode(void *state, SpeexBits *bits, short *out)
          }
 
          /* De-normalize innovation and update excitation */
+#ifdef FIXED_POINT
          signal_mul(innov, innov, .5+ener, st->subframeSize);
-
+#else
+         signal_mul(innov, innov, ener, st->subframeSize);
+#endif
          /*Vocoder mode*/
          if (st->submodeID==1) 
          {
index 3a0c62b..b9dbf0e 100644 (file)
@@ -618,9 +618,11 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
          for (i=0;i<st->subframeSize;i++)
            exc[i]=0;
 
-
+#ifdef FIXED_POINT
+         signal_div(target, target, .5+scale, st->subframeSize);
+#else
          signal_div(target, target, scale, st->subframeSize);
-
+#endif
          /* Reset excitation */
          for (i=0;i<st->subframeSize;i++)
             innov[i]=0;
@@ -631,8 +633,11 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
                                    innov, syn_resp, bits, stack, (st->complexity+1)>>1);
          /*print_vec(target, st->subframeSize, "after");*/
 
+#ifdef FIXED_POINT
+         signal_mul(innov, innov, .5+scale, st->subframeSize);
+#else
          signal_mul(innov, innov, scale, st->subframeSize);
-
+#endif
          for (i=0;i<st->subframeSize;i++)
             exc[i] += innov[i];
 
@@ -1043,7 +1048,11 @@ int sb_decode(void *state, SpeexBits *bits, short *out)
          SUBMODE(innovation_unquant)(exc, SUBMODE(innovation_params), st->subframeSize, 
                                 bits, stack);
 
+#ifdef FIXED_POINT
+         signal_mul(exc,exc,.5+scale,st->subframeSize);
+#else
          signal_mul(exc,exc,scale,st->subframeSize);
+#endif
 
          if (SUBMODE(double_codebook)) {
             char *tmp_stack=stack;