lpc floor converted to fixed-point
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 10 Oct 2005 04:01:55 +0000 (04:01 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 10 Oct 2005 04:01:55 +0000 (04:01 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@10143 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/arch.h
libspeex/fixed_generic.h
libspeex/modes.c
libspeex/modes.h
libspeex/nb_celp.c
libspeex/nb_celp.h
libspeex/sb_celp.c
libspeex/sb_celp.h

index b476244..d6c6a59 100644 (file)
@@ -119,6 +119,9 @@ typedef float spx_word64_t;
 #define VERY_LARGE32 1e15f
 #define VERY_LARGE16 1e15f
 
 #define VERY_LARGE32 1e15f
 #define VERY_LARGE16 1e15f
 
+#define QCONST16(x,bits) (x)
+#define QCONST32(x,bits) (x)
+
 #define NEG16(x) (-(x))
 #define NEG32(x) (-(x))
 #define EXTRACT16(x) (x)
 #define NEG16(x) (-(x))
 #define NEG32(x) (-(x))
 #define EXTRACT16(x) (x)
index 8546e4a..61496dc 100644 (file)
@@ -35,6 +35,9 @@
 #ifndef FIXED_GENERIC_H
 #define FIXED_GENERIC_H
 
 #ifndef FIXED_GENERIC_H
 #define FIXED_GENERIC_H
 
+#define QCONST16(x,bits) ((spx_word16_t)((x)*(1<<(bits))+(1<<((bits)-1))))
+#define QCONST32(x,bits) ((spx_word32_t)((x)*(1<<(bits))+(1<<((bits)-1))))
+
 #define NEG16(x) (-(x))
 #define NEG32(x) (-(x))
 #define EXTRACT16(x) ((spx_word16_t)x)
 #define NEG16(x) (-(x))
 #define NEG32(x) (-(x))
 #define EXTRACT16(x) ((spx_word16_t)x)
index 671e82a..aa15729 100644 (file)
@@ -387,7 +387,7 @@ static const SpeexNBMode nb_mode = {
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .012,   /*lag_factor*/
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .012,   /*lag_factor*/
-   .0002, /*lpc_floor*/
+   QCONST16(.0002,15), /*lpc_floor*/
 #ifdef EPIC_48K
    0,
 #endif
 #ifdef EPIC_48K
    0,
 #endif
@@ -543,7 +543,7 @@ static const SpeexSBMode sb_wb_mode = {
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .001,   /*lag_factor*/
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .001,   /*lag_factor*/
-   .0001, /*lpc_floor*/
+   QCONST16(.0001,15), /*lpc_floor*/
    0.9,
    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
    3,
    0.9,
    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
    3,
@@ -589,7 +589,7 @@ static const SpeexSBMode sb_uwb_mode = {
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .002,   /*lag_factor*/
    0.9, 0.6, /* gamma1, gamma2 */
 #endif
    .002,   /*lag_factor*/
-   .0001, /*lpc_floor*/
+   QCONST16(.0001,15), /*lpc_floor*/
    0.7,
    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
    1,
    0.7,
    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
    1,
@@ -677,7 +677,7 @@ static const SpeexNBMode nb_48k_mode = {
    0.9,    /*gamma1*/
    0.6,    /*gamma2*/
    .01,   /*lag_factor*/
    0.9,    /*gamma1*/
    0.6,    /*gamma2*/
    .01,   /*lag_factor*/
-   .0003, /*lpc_floor*/
+   QCONST16(.0003,15), /*lpc_floor*/
    1,
    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
    2,
    1,
    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
    2,
index e1c9468..945d004 100644 (file)
@@ -111,7 +111,7 @@ typedef struct SpeexNBMode {
    spx_word16_t gamma1;    /**< Perceptual filter parameter #1 */
    spx_word16_t gamma2;    /**< Perceptual filter parameter #2 */
    float   lag_factor;     /**< Lag-windowing parameter */
    spx_word16_t gamma1;    /**< Perceptual filter parameter #1 */
    spx_word16_t gamma2;    /**< Perceptual filter parameter #2 */
    float   lag_factor;     /**< Lag-windowing parameter */
-   float   lpc_floor;      /**< Noise floor for LPC analysis */
+   spx_word16_t   lpc_floor;      /**< Noise floor for LPC analysis */
 
 #ifdef EPIC_48K
    int     lbr48k;         /**< 1 for the special 4.8 kbps mode */
 
 #ifdef EPIC_48K
    int     lbr48k;         /**< 1 for the special 4.8 kbps mode */
@@ -133,7 +133,7 @@ typedef struct SpeexSBMode {
    spx_word16_t gamma1;   /**< Perceptual filter parameter #1 */
    spx_word16_t gamma2;   /**< Perceptual filter parameter #1 */
    float   lag_factor;    /**< Lag-windowing parameter */
    spx_word16_t gamma1;   /**< Perceptual filter parameter #1 */
    spx_word16_t gamma2;   /**< Perceptual filter parameter #1 */
    float   lag_factor;    /**< Lag-windowing parameter */
-   float   lpc_floor;     /**< Noise floor for LPC analysis */
+   spx_word16_t   lpc_floor;     /**< Noise floor for LPC analysis */
    float   folding_gain;
 
    const SpeexSubmode *submodes[SB_SUBMODES]; /**< Sub-mode data for the mode */
    float   folding_gain;
 
    const SpeexSubmode *submodes[SB_SUBMODES]; /**< Sub-mode data for the mode */
index c27c7ae..6b109da 100644 (file)
@@ -297,7 +297,7 @@ int nb_encode(void *state, void *vin, SpeexBits *bits)
       /* Compute auto-correlation */
       _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
    }
       /* Compute auto-correlation */
       _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
    }
-   st->autocorr[0] = ADD16(st->autocorr[0],(spx_word16_t) (st->autocorr[0]*st->lpc_floor)); /* Noise floor in auto-correlation domain */
+   st->autocorr[0] = ADD16(st->autocorr[0],MULT16_16_Q15(st->autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
index 9e3a291..b1132ea 100644 (file)
@@ -67,7 +67,7 @@ typedef struct EncState {
    spx_word16_t  gamma1;         /**< Perceptual filter: A(z/gamma1) */
    spx_word16_t  gamma2;         /**< Perceptual filter: A(z/gamma2) */
    float  lag_factor;     /**< Lag windowing Gaussian width */
    spx_word16_t  gamma1;         /**< Perceptual filter: A(z/gamma1) */
    spx_word16_t  gamma2;         /**< Perceptual filter: A(z/gamma2) */
    float  lag_factor;     /**< Lag windowing Gaussian width */
-   float  lpc_floor;      /**< Noise floor multiplier for A[0] in LPC analysis*/
+   spx_word16_t  lpc_floor;      /**< Noise floor multiplier for A[0] in LPC analysis*/
    char  *stack;          /**< Pseudo-stack allocation for temporary memory */
    spx_sig_t *inBuf;          /**< Input buffer (original signal) */
    spx_sig_t *frame;          /**< Start of original frame */
    char  *stack;          /**< Pseudo-stack allocation for temporary memory */
    spx_sig_t *inBuf;          /**< Input buffer (original signal) */
    spx_sig_t *frame;          /**< Start of original frame */
index 4d3f7f3..5adf44d 100644 (file)
@@ -445,8 +445,7 @@ int sb_encode(void *state, void *vin, SpeexBits *bits)
       /* Compute auto-correlation */
       _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
    }
       /* Compute auto-correlation */
       _spx_autocorr(w_sig, st->autocorr, st->lpcSize+1, st->windowSize);
    }
-   
-   st->autocorr[0] = ADD16(st->autocorr[0],(spx_word16_t) (st->autocorr[0]*st->lpc_floor)); /* Noise floor in auto-correlation domain */
+   st->autocorr[0] = ADD16(st->autocorr[0],MULT16_16_Q15(st->autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
 
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
index 7a5cc97..c283109 100644 (file)
@@ -53,7 +53,7 @@ typedef struct SBEncState {
    int    bufSize;             /**< Buffer size */
    int    first;               /**< First frame? */
    float  lag_factor;          /**< Lag-windowing control parameter */
    int    bufSize;             /**< Buffer size */
    int    first;               /**< First frame? */
    float  lag_factor;          /**< Lag-windowing control parameter */
-   float  lpc_floor;           /**< Controls LPC analysis noise floor */
+   spx_word16_t  lpc_floor;           /**< Controls LPC analysis noise floor */
    spx_word16_t  gamma1;              /**< Perceptual weighting coef 1 */
    spx_word16_t  gamma2;              /**< Perceptual weighting coef 2 */
 
    spx_word16_t  gamma1;              /**< Perceptual weighting coef 1 */
    spx_word16_t  gamma2;              /**< Perceptual weighting coef 2 */