fixed-point: signals scaling
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:35:48 +0000 (04:35 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:35:48 +0000 (04:35 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5418 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/filters.c
libspeex/misc.h
libspeex/nb_celp.c

index 769c52a..f50246f 100644 (file)
@@ -344,8 +344,13 @@ char *stack
       float s=1;
       if (signs[i])
          s=-1;
+#ifdef FIXED_POINT
       for (j=0;j<subvect_size;j++)
-         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
+         exc[subvect_size*i+j]+=s*0.03125*SIG_SCALING*shape_cb[ind[i]*subvect_size+j];
+#else
+      for (j=0;j<subvect_size;j++)
+         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];      
+#endif
    }
 }
 
index 4b3294a..4f03eec 100644 (file)
@@ -50,6 +50,8 @@ void bw_lpc(float gamma, spx_coef_t *lpc_in, spx_coef_t *lpc_out, int order)
 #ifdef FIXED_POINT
 
 
+int fixed_point_on = 0;
+
 #define MUL_16_32_R15(a,bh,bl) ((a)*(bh) + ((a)*(bl)>>15))
 
 
@@ -58,10 +60,14 @@ void filter_mem2(float *x, spx_coef_t *num, spx_coef_t *den, float *y, int N, in
    int i,j;
    int xi,yi;
 
+   float local_scale = 1;
+   if (!fixed_point_on)
+      local_scale = 16384.;
+
    for (i=0;i<N;i++)
    {
       int xh,xl,yh,yl;
-      xi=floor(.5+16384*x[i]);
+      xi=floor(.5+local_scale*x[i]);
       yi = xi + (mem[0]<<2);
       xh = xi>>15; xl=xi&0x00007fff; yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
@@ -69,7 +75,7 @@ void filter_mem2(float *x, spx_coef_t *num, spx_coef_t *den, float *y, int N, in
          mem[j] = 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);
-      y[i] = yi*(1.f/16384.f);
+      y[i] = yi*(1.f/local_scale);
    }
 }
 
@@ -77,11 +83,15 @@ void iir_mem2(float *x, spx_coef_t *den, float *y, int N, int ord, spx_mem_t *me
 {
    int i,j;
    int xi,yi;
+
+   float local_scale = 1;
+   if (!fixed_point_on)
+      local_scale = 16384.;
    
    for (i=0;i<N;i++)
    {
       int yh,yl;
-      xi=floor(.5+16384*x[i]);
+      xi=floor(.5+local_scale*x[i]);
       yi = xi + (mem[0]<<2);
       yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
@@ -89,7 +99,7 @@ void iir_mem2(float *x, spx_coef_t *den, float *y, int N, int ord, spx_mem_t *me
          mem[j] = 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*(1.f/16384.f);
+      y[i] = yi*(1.f/local_scale);
    }
 }
 
@@ -99,10 +109,14 @@ void fir_mem2(float *x, spx_coef_t *num, float *y, int N, int ord, spx_mem_t *me
    int i,j;
    int xi,yi;
 
+   float local_scale = 1;
+   if (!fixed_point_on)
+      local_scale = 16384.;
+
    for (i=0;i<N;i++)
    {
       int xh,xl;
-      xi=floor(.5+16384*x[i]);
+      xi=floor(.5+local_scale*x[i]);
       yi = xi + (mem[0]<<2);
       xh = xi>>15; xl=xi&0x00007fff;
       for (j=0;j<ord-1;j++)
@@ -110,7 +124,7 @@ void fir_mem2(float *x, spx_coef_t *num, float *y, int N, int ord, spx_mem_t *me
          mem[j] = 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*(1.f/16384.f);
+      y[i] = yi*(1.f/local_scale);
    }
 
 }
index 02dce18..c9a287a 100644 (file)
 
 #ifdef FIXED_POINT
 
+extern int fixed_point_on;
+#define FIXED_SIGNAL fixed_point_on=1;
+#define FLOAT_SIGNAL fixed_point_on=0;
+
 typedef short        spx_word16_t;
 typedef int          spx_word32_t;
 typedef spx_word32_t spx_mem_t;
@@ -48,6 +52,7 @@ typedef spx_word16_t spx_coef_t;
 typedef float   spx_sig_t;
 
 #define LPC_SCALING  8192.
+#define SIG_SCALING  16384.
 
 #define MULT16_32_Q14(a,b) (((a)*((b)>>14)) + ((a)*((signed int)((b)&0x00003fff))>>14))
 #define MULT16_32_Q15(a,b) (((a)*((b)>>15)) + ((a)*((signed int)((b)&0x00007fff))>>15))
@@ -63,6 +68,9 @@ typedef float   spx_sig_t;
 
 #else
 
+#define FIXED_SIGNAL
+#define FLOAT_SIGNAL
+
 typedef float spx_mem_t;
 typedef float spx_coef_t;
 typedef float spx_sig_t;
@@ -70,7 +78,7 @@ typedef float spx_word16_t;
 typedef float spx_word32_t;
 
 #define LPC_SCALING  1.
-
+#define SIG_SCALING  1.
 #endif
 
 #ifndef RELEASE
index bd07767..c48fc61 100644 (file)
@@ -1545,7 +1545,7 @@ int nb_decode(void *state, SpeexBits *bits, float *out)
             while (st->voc_offset<st->subframeSize)
             {
                if (st->voc_offset>=0)
-                  exc[st->voc_offset]=sqrt(1.0*ol_pitch);
+                  exc[st->voc_offset]=SIG_SCALING*sqrt(1.0*ol_pitch);
                st->voc_offset+=ol_pitch;
             }
             st->voc_offset -= st->subframeSize;
@@ -1591,6 +1591,8 @@ int nb_decode(void *state, SpeexBits *bits, float *out)
       if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0)
          comb_filter(exc, sp, st->interp_qlpc, st->lpcSize, st->subframeSize,
                               pitch, pitch_gain, SUBMODE(comb_gain), st->comb_mem);
+      FIXED_SIGNAL;
+
       if (st->lpc_enh_enabled)
       {
          /* Use enhanced LPC filter */
@@ -1605,11 +1607,13 @@ int nb_decode(void *state, SpeexBits *bits, float *out)
          iir_mem2(sp, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, 
                      st->mem_sp);
       }
+
+      FLOAT_SIGNAL;
    }
    
    /*Copy output signal*/
    for (i=0;i<st->frameSize;i++)
-     out[i]=st->frame[i];
+     out[i]=st->frame[i]/SIG_SCALING;
 
    /* Store the LSPs for interpolation in the next frame */
    for (i=0;i<st->lpcSize;i++)