Fixed pre-emphasis/de-emphasis in the decoder for wideband
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Mar 2002 20:48:01 +0000 (20:48 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Mar 2002 20:48:01 +0000 (20:48 +0000)
(and narrowband). Now both should work (really!)

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

libspeex/modes.c
libspeex/mpulse.c
libspeex/speex.c
libspeex/speex.h
libspeex/testenc_wb.c

index 1c05904..a49bad5 100644 (file)
@@ -165,10 +165,10 @@ SpeexMode mp_wb_mode = {
    35,     /*pitchStart*/
    290,    /*pitchEnd*/
    0.9,    /*gamma1*/
-   -1.0,    /*gamma2*/
+   -0.2,    /*gamma2*/
    .002,   /*lag_factor*/
    1.0001,/*lpc_floor*/
-   0.7,    /*preemph*/
+   0.55,    /*preemph*/
 
    /*LSP quantization*/
    lsp_quant_wb,
index f16512d..d39572c 100644 (file)
@@ -413,7 +413,9 @@ float *stack
    
    quant_gain=frame_bits_unpack_unsigned(bits, 7);
    g=exp((quant_gain/8.0)+1);
-
+   /*Removes glitches when energy is near-zero*/
+   if (g<3)
+      g=0;
    for (i=0;i<nb_tracks;i++)
    {
       int ind;
index eef675e..0719533 100644 (file)
@@ -219,8 +219,7 @@ void encode(EncState *st, float *in, FrameBits *bits)
    printf ("QLSP ");
    for (i=0;i<st->lpcSize;i++)
       printf ("%f ", st->qlsp[i]);
-   printf ("\n");
-   return;*/
+   printf ("\n");*/
    /* Special case for first frame */
    if (st->first)
    {
@@ -426,7 +425,9 @@ void decoder_init(DecState *st, SpeexMode *mode)
    st->gamma2=mode->gamma2;
    st->min_pitch=mode->pitchStart;
    st->max_pitch=mode->pitchEnd;
+   st->preemph = mode->preemph;
 
+   st->pre_mem=0;
    st->lsp_unquant = mode->lsp_unquant;
    st->ltp_unquant = mode->ltp_unquant;
    st->ltp_params = mode->ltp_params;
@@ -480,11 +481,6 @@ void decode(DecState *st, FrameBits *bits, float *out)
          st->old_qlsp[i] = st->qlsp[i];
    }
 
-   printf ("decode LSPs: ");
-   for (i=0;i<st->lpcSize;i++)
-      printf ("%f ", st->qlsp[i]);
-   printf ("\n");
-
    /*Loop on subframes */
    for (sub=0;sub<st->nbSubframes;sub++)
    {
@@ -527,6 +523,12 @@ void decode(DecState *st, FrameBits *bits, float *out)
    for (i=0;i<st->frameSize;i++)
       out[i]=st->frame[i];
 
+   out[0] = st->frame[0] + st->preemph*st->pre_mem;
+   for (i=1;i<st->frameSize;i++)
+     out[i]=st->frame[i] + st->preemph*out[i-1];
+   st->pre_mem=out[st->frameSize-1];
+
+
    /* Store the LSPs for interpolation in the next frame */
    for (i=0;i<st->lpcSize;i++)
       st->old_qlsp[i] = st->qlsp[i];
index 1741c3f..4452c4f 100644 (file)
@@ -92,6 +92,8 @@ typedef struct DecState {
    int    max_pitch;      /* Maximum pitch value allowed */
    float  gamma1;         /* Perceptual filter: A(z/gamma1) */
    float  gamma2;         /* Perceptual filter: A(z/gamma2) */
+   float  preemph;        /* Pre-emphasis: P(z) = 1 - a*z^-1*/
+   float  pre_mem;        /* 1-element memory for pre-emphasis */
    float *stack;
    float *inBuf;          /* Input buffer (original signal) */
    float *frame;          /* Start of original frame */
index 95bfedd..588735e 100644 (file)
@@ -57,7 +57,6 @@ int main(int argc, char **argv)
          snr = 10*log10((esig+1)/(enoise+1));
          printf ("real SNR = %f\n", snr);
       }
-
       frame_bits_rewind(&bits);
       
       decode(&dec, &bits, input);