fixed-point: more signal scaling again, some auto-correlation work
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:38:54 +0000 (04:38 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 8 Oct 2003 04:38:54 +0000 (04:38 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5421 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/lpc.c
libspeex/lpc.h
libspeex/misc.h
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h
libspeex/testenc.c

index f50246f..f3a55db 100644 (file)
@@ -137,7 +137,7 @@ int   complexity
          res[j]=0;
          for (k=0;k<=j;k++)
             res[j] += shape[k]*r[j-k];
-         res[j] *= 0.03125;
+         res[j] *= 0.03125*SIG_SCALING;
       }
       
       /* Compute codeword energy */
@@ -221,7 +221,7 @@ int   complexity
                      rind-=shape_cb_size;
                   }
 
-                  g=sign*0.03125*shape_cb[rind*subvect_size+m];
+                  g=sign*0.03125*SIG_SCALING*shape_cb[rind*subvect_size+m];
                   q=subvect_size-m;
                   for (n=subvect_size*(i+1);n<nsf;n++,q++)
                      t[n] -= g*r[q];
@@ -290,7 +290,7 @@ int   complexity
       }
 
       for (j=0;j<subvect_size;j++)
-         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
+         e[subvect_size*i+j]=sign*0.03125*SIG_SCALING*shape_cb[rind*subvect_size+j];
    }   
    /* Update excitation */
    for (j=0;j<nsf;j++)
index 59cea94..2c8cd05 100644 (file)
@@ -117,7 +117,7 @@ int          p
  */
 #include <stdio.h>
 void _spx_autocorr(
-const float *x,   /*  in: [0...n-1] samples x   */
+const spx_word16_t *x,   /*  in: [0...n-1] samples x   */
 spx_word16_t       *ac,  /* out: [0...lag-1] ac values */
 int          lag, 
 int          n
@@ -129,7 +129,7 @@ int          n
    int shift, ac_shift;
    
    for (j=0;j<n;j++)
-      ac0 += floor(x[j]*x[j])/256;
+      ac0 += MULT16_16(x[j],x[j])/256;
    ac0 += n;
    shift = 8;
    while (shift && ac0<0x40000000)
@@ -150,7 +150,7 @@ int          n
       d=0;
       for (j=i;j<n;j++)
       {
-         d += ((int)(floor(x[j]) * floor(x[j-i]))) >> shift;
+         d += MULT16_16(x[j],x[j-i]) >> shift;
       }
       
       ac[i] = d >> ac_shift;
@@ -212,7 +212,7 @@ int          p
  * for lags between 0 and lag-1, and x == 0 outside 0...n-1
  */
 void _spx_autocorr(
-const float *x,   /*  in: [0...n-1] samples x   */
+const spx_word16_t *x,   /*  in: [0...n-1] samples x   */
 float       *ac,  /* out: [0...lag-1] ac values */
 int          lag, 
 int          n
index 08d029b..6050447 100644 (file)
@@ -36,7 +36,7 @@
 #include "misc.h"
 
 void _spx_autocorr(
-              const float * x,   /*  in: [0...n-1] samples x   */
+              const spx_word16_t * x,   /*  in: [0...n-1] samples x   */
               spx_word16_t *ac,   /* out: [0...lag-1] ac values */
               int lag, int   n);
 
index c9a287a..71fc6b1 100644 (file)
@@ -54,6 +54,12 @@ typedef float   spx_sig_t;
 #define LPC_SCALING  8192.
 #define SIG_SCALING  16384.
 
+#define LPC_SHIFT    13
+#define SIG_SHIFT    14
+
+#define SHR(a,shift) ((a) >> (shift))
+
+#define MULT16_16(a,b)     (((signed int)(a))*(b))
 #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))
 
@@ -79,6 +85,14 @@ typedef float spx_word32_t;
 
 #define LPC_SCALING  1.
 #define SIG_SCALING  1.
+
+#define LPC_SHIFT    0
+#define SIG_SHIFT    0
+
+#define SHR(a,shift)       (a)
+#define MULT16_16(a,b)     ((a)*(b))
+
+
 #endif
 
 #ifndef RELEASE
index 236ddaa..93318b8 100644 (file)
@@ -121,11 +121,11 @@ void *nb_encoder_init(SpeexMode *m)
       int part1, part2;
       part1=st->frameSize - (st->subframeSize>>1);
       part2=(st->frameSize>>1) + (st->subframeSize>>1);
-      st->window = PUSH(st->stack, st->windowSize, float);
+      st->window = PUSH(st->stack, st->windowSize, spx_word16_t);
       for (i=0;i<part1;i++)
-         st->window[i]=.54-.46*cos(M_PI*i/part1);
+         st->window[i]=SIG_SCALING*(.54-.46*cos(M_PI*i/part1));
       for (i=0;i<part2;i++)
-         st->window[part1+i]=.54+.46*cos(M_PI*i/part2);
+         st->window[part1+i]=SIG_SCALING*(.54+.46*cos(M_PI*i/part2));
    }
    /* Create the window for autocorrelation (lag-windowing) */
    st->lagWindow = PUSH(st->stack, st->lpcSize+1, float);
@@ -223,13 +223,16 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
    speex_move(st->swBuf, st->swBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
 
 
-   /* Window for analysis */
-   for (i=0;i<st->windowSize;i++)
-      st->buf2[i] = st->frame[i] * st->window[i] / SIG_SCALING;
-
-   /* Compute auto-correlation */
-   _spx_autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
-
+   {
+      spx_word16_t *w_sig;
+      w_sig = PUSH(stack, st->windowSize, spx_word16_t);
+      /* Window for analysis */
+      for (i=0;i<st->windowSize;i++)
+         w_sig[i] = SHR(MULT16_16(SHR((spx_word32_t)(st->frame[i]),SIG_SHIFT),st->window[i]),SIG_SHIFT);
+
+      /* Compute auto-correlation */
+      _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
+   }
    st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
@@ -815,9 +818,8 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
 
          /* Normalize innovation */
          for (i=0;i<st->subframeSize;i++)
-            target[i]*=ener_1/SIG_SCALING;
+            target[i]*=ener_1;
          
-         FLOAT_SIGNAL;
          for (i=0;i<st->subframeSize;i++)
             syn_resp[i]/=SIG_SCALING;
 
@@ -831,7 +833,7 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
             
             /* De-normalize innovation and update excitation */
             for (i=0;i<st->subframeSize;i++)
-               innov[i]*=ener*SIG_SCALING;
+               innov[i]*=ener;
             for (i=0;i<st->subframeSize;i++)
                exc[i] += innov[i];
          } else {
@@ -850,17 +852,16 @@ int nb_encode(void *state, float *in, SpeexBits *bits)
                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
                                       innov2, syn_resp, bits, tmp_stack, st->complexity);
             for (i=0;i<st->subframeSize;i++)
-               innov2[i]*=ener*(1/2.2)*SIG_SCALING;
+               innov2[i]*=ener*(1/2.2);
             for (i=0;i<st->subframeSize;i++)
                exc[i] += innov2[i];
          }
 
-         FIXED_SIGNAL;
          for (i=0;i<st->subframeSize;i++)
             syn_resp[i]*=SIG_SCALING;
 
          for (i=0;i<st->subframeSize;i++)
-            target[i]*=ener*SIG_SCALING;
+            target[i]*=ener;
 
       }
 
index d684076..426e52c 100644 (file)
@@ -79,7 +79,7 @@ typedef struct EncState {
    float *swBuf;          /**< Weighted signal buffer */
    float *sw;             /**< Start of weighted signal frame */
    float *innov;          /**< Innovation for the frame */
-   float *window;         /**< Temporary (Hanning) window */
+   spx_word16_t *window;         /**< Temporary (Hanning) window */
    float *buf2;           /**< 2nd temporary buffer */
    spx_word16_t *autocorr;       /**< auto-correlation */
    float *lagWindow;      /**< Window applied to auto-correlation */
index d181b3d..71c3e02 100644 (file)
@@ -181,11 +181,11 @@ void *sb_encoder_init(SpeexMode *m)
       int part1, part2;
       part1 = st->subframeSize*7/2;
       part2 = st->subframeSize*5/2;
-      st->window = PUSH(st->stack, st->windowSize, float);
+      st->window = PUSH(st->stack, st->windowSize, spx_word16_t);
       for (i=0;i<part1;i++)
-         st->window[i]=.54-.46*cos(M_PI*i/part1);
+         st->window[i]=SIG_SCALING*(.54-.46*cos(M_PI*i/part1));
       for (i=0;i<part2;i++)
-         st->window[part1+i]=.54+.46*cos(M_PI*i/part2);
+         st->window[part1+i]=SIG_SCALING*(.54+.46*cos(M_PI*i/part2));
    }
 
    st->lagWindow = PUSH(st->stack, st->lpcSize+1, float);
@@ -282,12 +282,16 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
    else
       dtx=0;
 
-   /* Start encoding the high-band */
-   for (i=0;i<st->windowSize;i++)
-      st->buf[i] = st->high[i] * st->window[i] / SIG_SCALING;
-
-   /* Compute auto-correlation */
-   _spx_autocorr(st->buf, st->autocorr, st->lpcSize+1, st->windowSize);
+   {
+      spx_word16_t *w_sig;
+      w_sig = PUSH(stack, st->windowSize, spx_word16_t);
+      /* Window for analysis */
+      for (i=0;i<st->windowSize;i++)
+         w_sig[i] = SHR(MULT16_16(SHR((spx_word32_t)(st->high[i]),SIG_SHIFT),st->window[i]),SIG_SHIFT);
+
+      /* Compute auto-correlation */
+      _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
+   }
 
    st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
@@ -599,9 +603,8 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
 
 
          for (i=0;i<st->subframeSize;i++)
-            target[i]*=scale_1/SIG_SCALING;
+            target[i]*=scale_1;
 
-         FLOAT_SIGNAL;
          for (i=0;i<st->subframeSize;i++)
             syn_resp[i]/=SIG_SCALING;
 
@@ -616,7 +619,7 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
          /*print_vec(target, st->subframeSize, "after");*/
 
          for (i=0;i<st->subframeSize;i++)
-            exc[i] += innov[i]*scale*SIG_SCALING;
+            exc[i] += innov[i]*scale;
 
          if (SUBMODE(double_codebook)) {
             char *tmp_stack=stack;
@@ -629,12 +632,11 @@ int sb_encode(void *state, float *in, SpeexBits *bits)
                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
                                       innov2, syn_resp, bits, tmp_stack, (st->complexity+1)>>1);
             for (i=0;i<st->subframeSize;i++)
-               innov2[i]*=scale*(1/2.5)*SIG_SCALING;
+               innov2[i]*=scale*(1/2.5);
             for (i=0;i<st->subframeSize;i++)
                exc[i] += innov2[i];
          }
 
-         FIXED_SIGNAL;
          for (i=0;i<st->subframeSize;i++)
             syn_resp[i]/=SIG_SCALING;
 
index 811f5db..b938d9d 100644 (file)
@@ -69,7 +69,7 @@ typedef struct SBEncState {
    float *res;                 /**< Zero-input response (ringing) */
    float *sw;                  /**< Perceptually weighted signal */
    float *target;              /**< Weighted target signal (analysis by synthesis) */
-   float *window;              /**< LPC analysis window */
+   spx_word16_t *window;              /**< LPC analysis window */
    float *lagWindow;           /**< Auto-correlation window */
    spx_word16_t *autocorr;            /**< Auto-correlation (for LPC analysis) */
    spx_coef_t *lpc;                 /**< LPC coefficients */
index a2e04c3..877c32a 100644 (file)
@@ -46,7 +46,7 @@ int main(int argc, char **argv)
    speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);
    tmp=0;
    speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);
-   tmp=10;
+   tmp=4;
    speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);
    tmp=5;
    speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp);