fixed-point: LSPs are now stored quantized
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Oct 2003 03:54:37 +0000 (03:54 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 9 Oct 2003 03:54:37 +0000 (03:54 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5443 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/lsp.c
libspeex/lsp.h
libspeex/misc.h
libspeex/modes.h
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/quant_lsp.c
libspeex/quant_lsp.h
libspeex/sb_celp.c
libspeex/sb_celp.h

index 12fc20f..b68dbd6 100644 (file)
@@ -57,8 +57,8 @@ Modified by Jean-Marc Valin
 #endif
 
 #ifdef FIXED_POINT
-#define ANGLE2X(a) (cos(a))
-#define X2ANGLE(x) (acos(x))
+#define ANGLE2X(a) (cos((a)/LSP_SCALING))
+#define X2ANGLE(x) (acos(x)*LSP_SCALING)
 #else
 #define ANGLE2X(a) (cos(a))
 #define X2ANGLE(x) (acos(x))
@@ -165,7 +165,7 @@ static float cheb_poly_eva(spx_word32_t *coef,float x,int m,char *stack)
 \*---------------------------------------------------------------------------*/
 
 
-int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *stack)
+int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,float delta, char *stack)
 /*  float *a                   lpc coefficients                        */
 /*  int lpcrdr                 order of LPC coefficients (10)          */
 /*  float *freq                LSP frequencies in the x domain         */
@@ -328,7 +328,7 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,float *freq,int nb,float delta, char *s
 
 #ifdef FIXED_POINT
 
-void lsp_to_lpc(float *freq,spx_coef_t *ak,int lpcrdr, char *stack)
+void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 /*  float *freq        array of LSP frequencies in the x domain        */
 /*  float *ak          array of LPC coefficients                       */
 /*  int lpcrdr         order of LPC coefficients                       */
@@ -400,7 +400,7 @@ void lsp_to_lpc(float *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 }
 #else
 
-void lsp_to_lpc(float *freq,spx_coef_t *ak,int lpcrdr, char *stack)
+void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 /*  float *freq        array of LSP frequencies in the x domain        */
 /*  float *ak          array of LPC coefficients                       */
 /*  int lpcrdr         order of LPC coefficients                       */
@@ -463,19 +463,19 @@ void lsp_to_lpc(float *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 
 /*Added by JMV
   Makes sure the LSPs are stable*/
-void lsp_enforce_margin(float *lsp, int len, float margin)
+void lsp_enforce_margin(spx_lsp_t *lsp, int len, float margin)
 {
    int i;
-   if (lsp[0]<margin)
-      lsp[0]=margin;
-   if (lsp[len-1]>M_PI-margin)
-      lsp[len-1]=M_PI-margin;
+   if (lsp[0]<LSP_SCALING*margin)
+      lsp[0]=LSP_SCALING*margin;
+   if (lsp[len-1]>LSP_SCALING*(M_PI-margin))
+      lsp[len-1]=LSP_SCALING*(M_PI-margin);
    for (i=1;i<len-1;i++)
    {
-      if (lsp[i]<lsp[i-1]+margin)
-         lsp[i]=lsp[i-1]+margin;
+      if (lsp[i]<lsp[i-1]+LSP_SCALING*margin)
+         lsp[i]=lsp[i-1]+LSP_SCALING*margin;
 
-      if (lsp[i]>lsp[i+1]-margin)
-         lsp[i]= .5* (lsp[i] + lsp[i+1]-margin);
+      if (lsp[i]>lsp[i+1]-LSP_SCALING*margin)
+         lsp[i]= .5* (lsp[i] + lsp[i+1]-LSP_SCALING*margin);
    }
 }
index a0ecac0..cfb4d7a 100644 (file)
@@ -49,10 +49,10 @@ Modified by Jean-Marc Valin
 \r
 #include "misc.h"\r
 \r
-int lpc_to_lsp (spx_coef_t *a, int lpcrdr, float *freq, int nb, float delta, char *stack);\r
-void lsp_to_lpc(float *freq, spx_coef_t *ak, int lpcrdr, char *stack);\r
+int lpc_to_lsp (spx_coef_t *a, int lpcrdr, spx_lsp_t *freq, int nb, float delta, char *stack);\r
+void lsp_to_lpc(spx_lsp_t *freq, spx_coef_t *ak, int lpcrdr, char *stack);\r
 \r
 /*Added by JMV*/\r
-void lsp_enforce_margin(float *lsp, int len, float margin);\r
+void lsp_enforce_margin(spx_lsp_t *lsp, int len, float margin);\r
 \r
 #endif /* __AK2LSPD__ */\r
index 836fbe0..af8c2ab 100644 (file)
@@ -45,10 +45,12 @@ typedef signed short spx_word16_t;
 typedef signed int   spx_word32_t;
 typedef spx_word32_t spx_mem_t;
 typedef spx_word16_t spx_coef_t;
+typedef spx_word16_t spx_lsp_t;
 typedef spx_word32_t spx_sig_t;
 
 #define LPC_SCALING  8192.
 #define SIG_SCALING  16384
+#define LSP_SCALING  8192.
 
 #define LPC_SHIFT    13
 #define SIG_SHIFT    14
@@ -78,12 +80,14 @@ typedef spx_word32_t spx_sig_t;
 
 typedef float spx_mem_t;
 typedef float spx_coef_t;
+typedef float spx_lsp_t;
 typedef float spx_sig_t;
 typedef float spx_word16_t;
 typedef float spx_word32_t;
 
 #define LPC_SCALING  1.
 #define SIG_SCALING  1.
+#define LSP_SCALING  1.
 
 #define LPC_SHIFT    0
 #define SIG_SHIFT    0
index 1586ecb..7f1e041 100644 (file)
 
 
 /** Quantizes LSPs */
-typedef void (*lsp_quant_func)(float *, float *, int, SpeexBits *);
+typedef void (*lsp_quant_func)(spx_lsp_t *, spx_lsp_t *, int, SpeexBits *);
 
 /** Decodes quantized LSPs */
-typedef void (*lsp_unquant_func)(float *, int, SpeexBits *);
+typedef void (*lsp_unquant_func)(spx_lsp_t *, int, SpeexBits *);
 
 
 /** Long-term predictor quantization */
index 8bedaa3..4dab1cb 100644 (file)
@@ -144,17 +144,17 @@ void *nb_encoder_init(SpeexMode *m)
    st->bw_lpc1 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->bw_lpc2 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
 
-   st->lsp = PUSH(st->stack, st->lpcSize, float);
-   st->qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_lsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_lsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_qlsp = PUSH(st->stack, st->lpcSize, float);
+   st->lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
 
    st->first = 1;
    for (i=0;i<st->lpcSize;i++)
    {
-      st->lsp[i]=8192*(M_PI*((float)(i+1)))/(st->lpcSize+1);
+      st->lsp[i]=LSP_SCALING*(M_PI*((float)(i+1)))/(st->lpcSize+1);
    }
 
    st->mem_sp = PUSH(st->stack, st->lpcSize, spx_mem_t);
@@ -267,6 +267,7 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
    lsp_dist=0;
    for (i=0;i<st->lpcSize;i++)
       lsp_dist += (st->old_lsp[i] - st->lsp[i])*(st->old_lsp[i] - st->lsp[i]);
+   lsp_dist /= LSP_SCALING*LSP_SCALING;
 
    /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
    {
@@ -948,9 +949,9 @@ void *nb_decoder_init(SpeexMode *m)
    st->innov = PUSH(st->stack, st->frameSize, spx_sig_t);
 
    st->interp_qlpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
-   st->qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_qlsp = PUSH(st->stack, st->lpcSize, float);
+   st->qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
    st->mem_sp = PUSH(st->stack, 5*st->lpcSize, spx_mem_t);
    st->comb_mem = PUSHS(st->stack, CombFilterMem);
    comp_filter_mem_init (st->comb_mem);
@@ -1261,6 +1262,7 @@ int nb_decode(void *state, SpeexBits *bits, short *out)
       float lsp_dist=0, fact;
       for (i=0;i<st->lpcSize;i++)
          lsp_dist += fabs(st->old_qlsp[i] - st->qlsp[i]);
+      lsp_dist /= LSP_SCALING*LSP_SCALING;
       fact = .6*exp(-.2*lsp_dist);
       for (i=0;i<2*st->lpcSize;i++)
          st->mem_sp[i] = (spx_mem_t)(st->mem_sp[i]*fact);
index 1b16f04..f111975 100644 (file)
@@ -84,12 +84,12 @@ typedef struct EncState {
    spx_word16_t *autocorr;       /**< auto-correlation */
    float *lagWindow;      /**< Window applied to auto-correlation */
    spx_coef_t *lpc;            /**< LPCs for current frame */
-   float *lsp;            /**< LSPs for current frame */
-   float *qlsp;           /**< Quantized LSPs for current frame */
-   float *old_lsp;        /**< LSPs for previous frame */
-   float *old_qlsp;       /**< Quantized LSPs for previous frame */
-   float *interp_lsp;     /**< Interpolated LSPs */
-   float *interp_qlsp;    /**< Interpolated quantized LSPs */
+   spx_lsp_t *lsp;            /**< LSPs for current frame */
+   spx_lsp_t *qlsp;           /**< Quantized LSPs for current frame */
+   spx_lsp_t *old_lsp;        /**< LSPs for previous frame */
+   spx_lsp_t *old_qlsp;       /**< Quantized LSPs for previous frame */
+   spx_lsp_t *interp_lsp;     /**< Interpolated LSPs */
+   spx_lsp_t *interp_qlsp;    /**< Interpolated quantized LSPs */
    spx_coef_t *interp_lpc;     /**< Interpolated LPCs */
    spx_coef_t *interp_qlpc;    /**< Interpolated quantized LPCs */
    spx_coef_t *bw_lpc1;        /**< LPCs after bandwidth expansion by gamma1 for perceptual weighting*/
@@ -149,9 +149,9 @@ typedef struct DecState {
    spx_sig_t *excBuf;         /**< Excitation buffer */
    spx_sig_t *exc;            /**< Start of excitation frame */
    spx_sig_t *innov;          /**< Innovation for the frame */
-   float *qlsp;           /**< Quantized LSPs for current frame */
-   float *old_qlsp;       /**< Quantized LSPs for previous frame */
-   float *interp_qlsp;    /**< Interpolated quantized LSPs */
+   spx_lsp_t *qlsp;           /**< Quantized LSPs for current frame */
+   spx_lsp_t *old_qlsp;       /**< Quantized LSPs for previous frame */
+   spx_lsp_t *interp_qlsp;    /**< Interpolated quantized LSPs */
    spx_coef_t *interp_qlpc;    /**< Interpolated quantized LPCs */
    spx_mem_t *mem_sp;         /**< Filter memory for synthesis signal */
    float *pi_gain;        /**< Gain of LPC filter at theta=pi (fe/2) */
index b9db2b0..63d4742 100644 (file)
 
 #include "quant_lsp.h"
 #include <math.h>
+
 #include "misc.h"
 
 /* FIXME: Get rid of this kludge quick before someone gets hurt */
-static spx_word16_t quant_weight[MAX_LSP_SIZE];
 
 #ifdef FIXED_POINT
-#define LSP_SCALE 8192
-#define LSP_OVERSCALE 32
+#define LSP_SCALE (8192./LSP_SCALING)
+#define LSP_OVERSCALE (32./LSP_SCALING)
 #else
 #define LSP_SCALE 256
 #define LSP_OVERSCALE 1
 #endif
 
+static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order)
+{
+   int i;
+   float tmp1, tmp2;
+   quant_weight[0] = 10/((qlsp[1]-qlsp[0])/LSP_SCALING);
+   quant_weight[order-1] = 10/((qlsp[order-1]-qlsp[order-2])/LSP_SCALING);
+   for (i=1;i<order-1;i++)
+   {
+#if 1
+      tmp1 = 10/((.15+(qlsp[i]-qlsp[i-1])/LSP_SCALING)*(.15+(qlsp[i]-qlsp[i-1])/LSP_SCALING));
+      tmp2 = 10/((.15+(qlsp[i+1]-qlsp[i])/LSP_SCALING)*(.15+(qlsp[i+1]-qlsp[i])/LSP_SCALING));
+#else
+      tmp1 = 10/(qlsp[i]-qlsp[i-1]);
+      tmp2 = 10/(qlsp[i+1]-qlsp[i]);
+#endif
+      quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
+   }
+
+}
+
 /* Note: x is modified*/
 static int lsp_quant(spx_word16_t *x, signed char *cdbk, int nbVec, int nbDim)
 {
@@ -105,32 +125,21 @@ static int lsp_weight_quant(spx_word16_t *x, spx_word16_t *weight, signed char *
 }
 
 
-void lsp_quant_nb(float *lsp, float *qlsp, int order, SpeexBits *bits)
+void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
 {
    int i;
-   float tmp1, tmp2;
    int id;
    /* FIXME: get rid of that static allocation */
+   spx_word16_t quant_weight[10];
    spx_word16_t nlsp[10];
    
    for (i=0;i<order;i++)
       qlsp[i]=lsp[i];
 
-   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
-   quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]);
-   for (i=1;i<order-1;i++)
-   {
-#if 1
-      tmp1 = 10/((.15+qlsp[i]-qlsp[i-1])*(.15+qlsp[i]-qlsp[i-1]));
-      tmp2 = 10/((.15+qlsp[i+1]-qlsp[i])*(.15+qlsp[i+1]-qlsp[i]));
-#else
-      tmp1 = 10/(qlsp[i]-qlsp[i-1]);
-      tmp2 = 10/(qlsp[i+1]-qlsp[i]);
-#endif
-      quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
-   }
+   compute_quant_weights(qlsp, quant_weight, order);
+
    for (i=0;i<order;i++)
-      qlsp[i]-=(.25*i+.25);
+      qlsp[i]-=LSP_SCALING*(.25*i+.25);
 
 #ifdef FIXED_POINT
    for (i=0;i<order;i++)
@@ -170,71 +179,59 @@ void lsp_quant_nb(float *lsp, float *qlsp, int order, SpeexBits *bits)
       qlsp[i]=lsp[i]-qlsp[i];
 }
 
-void lsp_unquant_nb(float *lsp, int order, SpeexBits *bits)
+void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=.25*i+.25;
+      lsp[i]=LSP_SCALING*(.25*i+.25);
 
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<10;i++)
-      lsp[i] += 0.0039062*cdbk_nb[id*10+i];
+      lsp[i] += LSP_SCALING*(0.0039062*cdbk_nb[id*10+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] += 0.0019531 * cdbk_nb_low1[id*5+i];
+      lsp[i] += LSP_SCALING*(0.0019531 * cdbk_nb_low1[id*5+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] +=  0.00097656 * cdbk_nb_low2[id*5+i];
+      lsp[i] += LSP_SCALING*(0.00097656 * cdbk_nb_low2[id*5+i]);
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += 0.0019531 * cdbk_nb_high1[id*5+i];
+      lsp[i+5] += LSP_SCALING*(0.0019531 * cdbk_nb_high1[id*5+i]);
    
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += 0.00097656 * cdbk_nb_high2[id*5+i];
+      lsp[i+5] += LSP_SCALING*(0.00097656 * cdbk_nb_high2[id*5+i]);
 }
 
 
-void lsp_quant_lbr(float *lsp, float *qlsp, int order, SpeexBits *bits)
+void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
 {
    int i;
-   float tmp1, tmp2;
    int id;
+   spx_word16_t quant_weight[10];
    spx_word16_t nlsp[10];
 
    for (i=0;i<order;i++)
       qlsp[i]=lsp[i];
 
-   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
-   quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]);
-   for (i=1;i<order-1;i++)
-   {
-#if 1
-      tmp1 = 10/((.15+qlsp[i]-qlsp[i-1])*(.15+qlsp[i]-qlsp[i-1]));
-      tmp2 = 10/((.15+qlsp[i+1]-qlsp[i])*(.15+qlsp[i+1]-qlsp[i]));
-#else
-      tmp1 = 10/(qlsp[i]-qlsp[i-1]);
-      tmp2 = 10/(qlsp[i+1]-qlsp[i]);
-#endif
-      quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
-   }
+   compute_quant_weights(qlsp, quant_weight, order);
 
    for (i=0;i<order;i++)
-      qlsp[i]-=(.25*i+.25);
+      qlsp[i]-=LSP_SCALING*(.25*i+.25);
 #ifdef FIXED_POINT
    for (i=0;i<order;i++)
       nlsp[i]=floor(.5+qlsp[i]*LSP_SCALE);
 #else
    for (i=0;i<order;i++)
       nlsp[i]=qlsp[i]*LSP_SCALE;
-#endif   
+#endif
    id = lsp_quant(nlsp, cdbk_nb, NB_CDBK_SIZE, order);
    speex_bits_pack(bits, id, 6);
-
+   
    for (i=0;i<order;i++)
       nlsp[i]*=2;
    
@@ -251,24 +248,24 @@ void lsp_quant_lbr(float *lsp, float *qlsp, int order, SpeexBits *bits)
       qlsp[i]=lsp[i]-qlsp[i];
 }
 
-void lsp_unquant_lbr(float *lsp, int order, SpeexBits *bits)
+void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=.25*i+.25;
+      lsp[i]=LSP_SCALING*(.25*i+.25);
 
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<10;i++)
-      lsp[i] += 0.0039062*cdbk_nb[id*10+i];
+      lsp[i] += LSP_SCALING*0.0039062*cdbk_nb[id*10+i];
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i] += 0.0019531*cdbk_nb_low1[id*5+i];
+      lsp[i] += LSP_SCALING*0.0019531*cdbk_nb_low1[id*5+i];
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<5;i++)
-      lsp[i+5] += 0.0019531*cdbk_nb_high1[id*5+i];
+      lsp[i+5] += LSP_SCALING*0.0019531*cdbk_nb_high1[id*5+i];
    
 }
 
@@ -277,27 +274,29 @@ extern signed char high_lsp_cdbk[];
 extern signed char high_lsp_cdbk2[];
 
 
-void lsp_quant_high(float *lsp, float *qlsp, int order, SpeexBits *bits)
+void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
 {
    int i;
-   float tmp1, tmp2;
    int id;
+   spx_word16_t quant_weight[10];
    spx_word16_t nlsp[10];
 
    for (i=0;i<order;i++)
       qlsp[i]=lsp[i];
 
-   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
+   compute_quant_weights(qlsp, quant_weight, order);
+
+   /*   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
    quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]);
    for (i=1;i<order-1;i++)
    {
       tmp1 = 10/(qlsp[i]-qlsp[i-1]);
       tmp2 = 10/(qlsp[i+1]-qlsp[i]);
       quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
-   }
+      }*/
 
    for (i=0;i<order;i++)
-      qlsp[i]-=(.3125*i+.75);
+      qlsp[i]-=LSP_SCALING*(.3125*i+.75);
 #ifdef FIXED_POINT
    for (i=0;i<order;i++)
       nlsp[i] = floor(.5+qlsp[i]*LSP_SCALE);
@@ -321,22 +320,22 @@ void lsp_quant_high(float *lsp, float *qlsp, int order, SpeexBits *bits)
       qlsp[i]=lsp[i]-qlsp[i];
 }
 
-void lsp_unquant_high(float *lsp, int order, SpeexBits *bits)
+void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
 
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=.3125*i+.75;
+      lsp[i]=LSP_SCALING*(.3125*i+.75);
 
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<order;i++)
-      lsp[i] += 0.0039062*high_lsp_cdbk[id*order+i];
+      lsp[i] += LSP_SCALING*0.0039062*high_lsp_cdbk[id*order+i];
 
 
    id=speex_bits_unpack_unsigned(bits, 6);
    for (i=0;i<order;i++)
-      lsp[i] += 0.0019531*high_lsp_cdbk2[id*order+i];
+      lsp[i] += LSP_SCALING*0.0019531*high_lsp_cdbk2[id*order+i];
 }
 
 
@@ -345,32 +344,20 @@ void lsp_unquant_high(float *lsp, int order, SpeexBits *bits)
 extern signed char cdbk_lsp_vlbr[5120];
 extern signed char cdbk_lsp2_vlbr[160];
 
-void lsp_quant_48k(float *lsp, float *qlsp, int order, SpeexBits *bits)
+void lsp_quant_48k(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
 {
    int i;
-   float tmp1, tmp2;
    int id;
+   spx_word16_t quant_weight[10];
    spx_word16_t nlsp[10];
 
    for (i=0;i<order;i++)
       qlsp[i]=lsp[i];
 
-   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
-   quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]);
-   for (i=1;i<order-1;i++)
-   {
-#if 1
-      tmp1 = 10/((.15+qlsp[i]-qlsp[i-1])*(.15+qlsp[i]-qlsp[i-1]));
-      tmp2 = 10/((.15+qlsp[i+1]-qlsp[i])*(.15+qlsp[i+1]-qlsp[i]));
-#else
-      tmp1 = 10/(qlsp[i]-qlsp[i-1]);
-      tmp2 = 10/(qlsp[i+1]-qlsp[i]);
-#endif
-      quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
-   }
+   compute_quant_weights(qlsp, quant_weight, order);
 
    for (i=0;i<order;i++)
-      qlsp[i]-=(.25*i+.3125);
+      qlsp[i]-=LSP_SCALING*(.25*i+.3125);
    for (i=0;i<order;i++)
       nlsp[i]=qlsp[i]*LSP_SCALE;
    
@@ -390,20 +377,20 @@ void lsp_quant_48k(float *lsp, float *qlsp, int order, SpeexBits *bits)
       qlsp[i]=lsp[i]-qlsp[i];
 }
 
-void lsp_unquant_48k(float *lsp, int order, SpeexBits *bits)
+void lsp_unquant_48k(spx_lsp_t *lsp, int order, SpeexBits *bits)
 {
    int i, id;
    for (i=0;i<order;i++)
-      lsp[i]=.25*i+.3125;
+      lsp[i]=LSP_SCALING*(.25*i+.3125);
 
 
    id=speex_bits_unpack_unsigned(bits, 9);
    for (i=0;i<10;i++)
-      lsp[i] += 0.0039062*cdbk_lsp_vlbr[id*10+i];
+      lsp[i] += LSP_SCALING*0.0039062*cdbk_lsp_vlbr[id*10+i];
 
    id=speex_bits_unpack_unsigned(bits, 4);
    for (i=0;i<10;i++)
-      lsp[i] += 0.00097655*cdbk_lsp2_vlbr[id*10+i];
+      lsp[i] += LSP_SCALING*0.00097655*cdbk_lsp2_vlbr[id*10+i];
    
 }
 
index a624ccb..c4265c8 100644 (file)
@@ -34,6 +34,7 @@
 #define QUANT_LSP_H
 
 #include "speex_bits.h"
+#include "misc.h"
 
 #define MAX_LSP_SIZE 20
 
@@ -51,29 +52,29 @@ extern signed char cdbk_nb_high1[];
 extern signed char cdbk_nb_high2[];
 
 /* Quantizes narrowband LSPs with 30 bits */
-void lsp_quant_nb(float *lsp, float *qlsp, int order, SpeexBits *bits);
+void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits);
 
 /* Decodes quantized narrowband LSPs */
-void lsp_unquant_nb(float *lsp, int order, SpeexBits *bits);
+void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits);
 
 /* Quantizes low bit-rate narrowband LSPs with 18 bits */
-void lsp_quant_lbr(float *lsp, float *qlsp, int order, SpeexBits *bits);
+void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits);
 
 /* Decodes quantized low bit-rate narrowband LSPs */
-void lsp_unquant_lbr(float *lsp, int order, SpeexBits *bits);
+void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits);
 
 /* Quantizes high-band LSPs with 12 bits */
-void lsp_quant_high(float *lsp, float *qlsp, int order, SpeexBits *bits);
+void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits);
 
 /* Decodes high-band LSPs */
-void lsp_unquant_high(float *lsp, int order, SpeexBits *bits);
+void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits);
 
 #ifdef EPIC_48K
 /* Quantizes narrowband LSPs with 14 bits */
-void lsp_quant_48k(float *lsp, float *qlsp, int order, SpeexBits *bits);
+void lsp_quant_48k(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits);
 
 /* Decodes quantized narrowband LSPs (14 bits) */
-void lsp_unquant_48k(float *lsp, int order, SpeexBits *bits);
+void lsp_unquant_48k(spx_lsp_t *lsp, int order, SpeexBits *bits);
 #endif
 
 
index 20cbd48..0432d55 100644 (file)
@@ -205,12 +205,12 @@ void *sb_encoder_init(SpeexMode *m)
    st->lpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->bw_lpc1 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->bw_lpc2 = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
-   st->lsp = PUSH(st->stack, st->lpcSize, float);
-   st->qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_lsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_lsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_qlsp = PUSH(st->stack, st->lpcSize, float);
+   st->lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_lsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
    st->interp_lpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->interp_qlpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
    st->pi_gain = PUSH(st->stack, st->nbSubframes, float);
@@ -710,9 +710,9 @@ void *sb_decoder_init(SpeexMode *m)
 
    st->exc=PUSH(st->stack, st->frame_size, spx_sig_t);
 
-   st->qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->old_qlsp = PUSH(st->stack, st->lpcSize, float);
-   st->interp_qlsp = PUSH(st->stack, st->lpcSize, float);
+   st->qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->old_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
+   st->interp_qlsp = PUSH(st->stack, st->lpcSize, spx_lsp_t);
    st->interp_qlpc = PUSH(st->stack, st->lpcSize+1, spx_coef_t);
 
    st->pi_gain = PUSH(st->stack, st->nbSubframes, float);
index 0b08352..8a46197 100644 (file)
@@ -74,12 +74,12 @@ typedef struct SBEncState {
    float *lagWindow;           /**< Auto-correlation window */
    spx_word16_t *autocorr;            /**< Auto-correlation (for LPC analysis) */
    spx_coef_t *lpc;                 /**< LPC coefficients */
-   float *lsp;                 /**< LSP coefficients */
-   float *qlsp;                /**< Quantized LSPs */
-   float *old_lsp;             /**< LSPs of previous frame */
-   float *old_qlsp;            /**< Quantized LSPs of previous frame */
-   float *interp_lsp;          /**< Interpolated LSPs for current sub-frame */
-   float *interp_qlsp;         /**< Interpolated quantized LSPs for current sub-frame */
+   spx_lsp_t *lsp;                 /**< LSP coefficients */
+   spx_lsp_t *qlsp;                /**< Quantized LSPs */
+   spx_lsp_t *old_lsp;             /**< LSPs of previous frame */
+   spx_lsp_t *old_qlsp;            /**< Quantized LSPs of previous frame */
+   spx_lsp_t *interp_lsp;          /**< Interpolated LSPs for current sub-frame */
+   spx_lsp_t *interp_qlsp;         /**< Interpolated quantized LSPs for current sub-frame */
    spx_coef_t *interp_lpc;          /**< Interpolated LPCs for current sub-frame */
    spx_coef_t *interp_qlpc;         /**< Interpolated quantized LPCs for current sub-frame */
    spx_coef_t *bw_lpc1;             /**< Bandwidth-expanded version of LPCs (#1) */
@@ -129,9 +129,9 @@ typedef struct SBDecState {
    spx_word32_t *g0_mem, *g1_mem;
 
    spx_sig_t *exc;
-   float *qlsp;
-   float *old_qlsp;
-   float *interp_qlsp;
+   spx_lsp_t *qlsp;
+   spx_lsp_t *old_qlsp;
+   spx_lsp_t *interp_qlsp;
    spx_coef_t *interp_qlpc;
 
    spx_mem_t *mem_sp;