Think DTX now works for wideband too
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 20 Dec 2002 05:20:28 +0000 (05:20 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 20 Dec 2002 05:20:28 +0000 (05:20 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@4161 0101bb08-14d6-0310-b084-bc0e0c8e3800

TODO
libspeex/modes.c
libspeex/nb_celp.c
libspeex/sb_celp.c
libspeex/vbr.c
src/speexdec.c

diff --git a/TODO b/TODO
index ab87705..12a1a53 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,8 +1,6 @@
 Features
 Features
-*Average bit-rate VBR
 -Add maximum/minimum bit-rate control for VBR
 -Get the encoder to use the rate of packet loss (more conservative pitch gains)
 -Add maximum/minimum bit-rate control for VBR
 -Get the encoder to use the rate of packet loss (more conservative pitch gains)
--No transmission when constant noise/silence
 
 Long-term quality improvements
 -Improve perceptual enhancement (including wideband)
 
 Long-term quality improvements
 -Improve perceptual enhancement (including wideband)
@@ -15,7 +13,6 @@ Standards
 *required for 1.0
 
 ideas:
 *required for 1.0
 
 ideas:
-peelable stream (double codebook, higher bands, stereo)
-DTX in Ogg? (painful)
+Peelable stream (double codebook, higher bands, stereo)
 LPC from spectral domain
 LPC from spectral domain
-Masking curve from Vorbis
+Better psycho-acoustics? Masking curve from Vorbis
index b7433df..660ab72 100644 (file)
@@ -446,7 +446,7 @@ static SpeexSBMode sb_wb_mode = {
    0.0,    /*preemph*/
    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
    3,
    0.0,    /*preemph*/
    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
    3,
-   {0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7},
+   {1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7},
    {0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
    vbr_hb_thresh,
    5
    {0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
    vbr_hb_thresh,
    5
index b144d21..6d09c05 100644 (file)
@@ -297,7 +297,7 @@ void nb_encode(void *state, float *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=0;
    for (i=0;i<st->lpcSize;i++)
       lsp_dist += (st->old_lsp[i] - st->lsp[i])*(st->old_lsp[i] - st->lsp[i]);
-   printf ("%f\n", lsp_dist);
+   /*printf ("%f\n", lsp_dist);*/
 
    /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
    {
 
    /* Whole frame analysis (open-loop estimation of pitch and excitation gain) */
    {
@@ -428,12 +428,15 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
       } else {
          /*VAD only case*/
          int mode;
       } else {
          /*VAD only case*/
          int mode;
-         if (st->relative_quality<2)
+         if (st->relative_quality<4)
          {
             if (st->submodeID>1 || lsp_dist>.05 || !st->dtx_enabled)
                mode=1;
             else
          {
             if (st->submodeID>1 || lsp_dist>.05 || !st->dtx_enabled)
                mode=1;
             else
+            {
                mode=0;
                mode=0;
+               fprintf (stderr, "tata\n");
+            }
          } else
             mode=st->submodeSelect;
          /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
          } else
             mode=st->submodeSelect;
          /*speex_encoder_ctl(state, SPEEX_SET_MODE, &mode);*/
@@ -1101,7 +1104,7 @@ int nb_decode(void *state, SpeexBits *bits, float *out)
    if (st->submodes[st->submodeID] == NULL)
    {
       float *lpc;
    if (st->submodes[st->submodeID] == NULL)
    {
       float *lpc;
-      lpc = PUSH(st->stack,11, float);
+      lpc = PUSH(stack,11, float);
       bw_lpc(.93, st->interp_qlpc, lpc, 10);
       /*for (i=0;i<st->frameSize;i++)
         st->exc[i]=0;*/
       bw_lpc(.93, st->interp_qlpc, lpc, 10);
       /*for (i=0;i<st->frameSize;i++)
         st->exc[i]=0;*/
@@ -1618,6 +1621,10 @@ void nb_decoder_ctl(void *state, int request, void *ptr)
    st=(DecState*)state;
    switch(request)
    {
    st=(DecState*)state;
    switch(request)
    {
+   case SPEEX_GET_LOW_MODE:
+   case SPEEX_GET_MODE:
+      (*(int*)ptr) = st->submodeID;
+      break;
    case SPEEX_SET_ENH:
       st->lpc_enh_enabled = *((int*)ptr);
       break;
    case SPEEX_SET_ENH:
       st->lpc_enh_enabled = *((int*)ptr);
       break;
index ba94bec..d819433 100644 (file)
@@ -278,6 +278,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    float *mem, *innov, *syn_resp;
    float *low_pi_gain, *low_exc, *low_innov;
    SpeexSBMode *mode;
    float *mem, *innov, *syn_resp;
    float *low_pi_gain, *low_exc, *low_innov;
    SpeexSBMode *mode;
+   int dtx;
 
    st = (SBEncState*)state;
    stack=st->stack;
 
    st = (SBEncState*)state;
    stack=st->stack;
@@ -305,6 +306,13 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    speex_encoder_ctl(st->st_low, SPEEX_GET_EXC, low_exc);
    speex_encoder_ctl(st->st_low, SPEEX_GET_INNOV, low_innov);
    
    speex_encoder_ctl(st->st_low, SPEEX_GET_EXC, low_exc);
    speex_encoder_ctl(st->st_low, SPEEX_GET_INNOV, low_innov);
    
+   speex_encoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, &dtx);
+
+   if (dtx==0)
+      dtx=1;
+   else
+      dtx=0;
+
    /* Start encoding the high-band */
    for (i=0;i<st->windowSize;i++)
       st->buf[i] = st->high[i] * st->window[i];
    /* Start encoding the high-band */
    for (i=0;i<st->windowSize;i++)
       st->buf[i] = st->high[i] * st->window[i];
@@ -343,7 +351,8 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
       st->lsp[i] = acos(st->lsp[i]);
 
    /* VBR code */
       st->lsp[i] = acos(st->lsp[i]);
 
    /* VBR code */
-   if (st->vbr_enabled || st->vad_enabled){
+   if ((st->vbr_enabled || st->vad_enabled) && !dtx)
+   {
       float e_low=0, e_high=0;
       float ratio;
       if (st->abr_enabled)
       float e_low=0, e_high=0;
       float ratio;
       if (st->abr_enabled)
@@ -425,10 +434,13 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    }
 
    speex_bits_pack(bits, 1, 1);
    }
 
    speex_bits_pack(bits, 1, 1);
-   speex_bits_pack(bits, st->submodeID, SB_SUBMODE_BITS);
+   if (dtx)
+      speex_bits_pack(bits, 0, SB_SUBMODE_BITS);
+   else
+      speex_bits_pack(bits, st->submodeID, SB_SUBMODE_BITS);
 
    /* If null mode (no transmission), just set a couple things to zero*/
 
    /* If null mode (no transmission), just set a couple things to zero*/
-   if (st->submodes[st->submodeID] == NULL)
+   if (dtx || st->submodes[st->submodeID] == NULL)
    {
       for (i=0;i<st->frame_size;i++)
          st->exc[i]=st->sw[i]=0;
    {
       for (i=0;i<st->frame_size;i++)
          st->exc[i]=st->sw[i]=0;
@@ -786,13 +798,18 @@ void sb_decoder_destroy(void *state)
    speex_free(state);
 }
 
    speex_free(state);
 }
 
-static void sb_decode_lost(SBDecState *st, float *out, void *stack)
+static void sb_decode_lost(SBDecState *st, float *out, int dtx, void *stack)
 {
    int i;
    float *awk1, *awk2, *awk3;
 {
    int i;
    float *awk1, *awk2, *awk3;
-   for (i=0;i<st->frame_size;i++)
-      st->exc[i]*=0.8;
-   
+   int saved_modeid=0;
+
+   if (dtx)
+   {
+      saved_modeid=st->submodeID;
+      st->submodeID=1;
+   }
+
    st->first=1;
    
    awk1=PUSH(stack, st->lpcSize+1, float);
    st->first=1;
    
    awk1=PUSH(stack, st->lpcSize+1, float);
@@ -821,10 +838,15 @@ static void sb_decode_lost(SBDecState *st, float *out, void *stack)
    
    
    /* Final signal synthesis from excitation */
    
    
    /* Final signal synthesis from excitation */
-   for (i=0;i<st->frame_size;i++)
-      st->exc[i] *= .9;
+   if (!dtx)
+   {
+      for (i=0;i<st->frame_size;i++)
+         st->exc[i] *= .9;
+   }
+
    for (i=0;i<st->frame_size;i++)
       st->high[i]=st->exc[i];
    for (i=0;i<st->frame_size;i++)
       st->high[i]=st->exc[i];
+
    if (st->lpc_enh_enabled)
    {
       /* Use enhanced LPC filter */
    if (st->lpc_enh_enabled)
    {
       /* Use enhanced LPC filter */
@@ -849,6 +871,11 @@ static void sb_decode_lost(SBDecState *st, float *out, void *stack)
    for (i=0;i<st->full_frame_size;i++)
       out[i]=2*(st->y0[i]-st->y1[i]);
    
    for (i=0;i<st->full_frame_size;i++)
       out[i]=2*(st->y0[i]-st->y1[i]);
    
+   if (dtx)
+   {
+      st->submodeID=saved_modeid;
+   }
+
    return;
 }
 
    return;
 }
 
@@ -861,13 +888,20 @@ int sb_decode(void *state, SpeexBits *bits, float *out)
    void *stack;
    float *low_pi_gain, *low_exc, *low_innov;
    float *awk1, *awk2, *awk3;
    void *stack;
    float *low_pi_gain, *low_exc, *low_innov;
    float *awk1, *awk2, *awk3;
-
+   float dtx;
+   
    st = (SBDecState*)state;
    stack=st->stack;
 
    /* Decode the low-band */
    ret = speex_decode(st->st_low, bits, st->x0d);
 
    st = (SBDecState*)state;
    stack=st->stack;
 
    /* Decode the low-band */
    ret = speex_decode(st->st_low, bits, st->x0d);
 
+   speex_decoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, &dtx);
+   if (dtx==0)
+      dtx=1;
+   else
+      dtx=0;
+
    /* If error decoding the narrowband part, propagate error */
    if (ret!=0)
    {
    /* If error decoding the narrowband part, propagate error */
    if (ret!=0)
    {
@@ -876,7 +910,7 @@ int sb_decode(void *state, SpeexBits *bits, float *out)
 
    if (!bits)
    {
 
    if (!bits)
    {
-      sb_decode_lost(st, out, stack);
+      sb_decode_lost(st, out, 0, stack);
       return 0;
    }
 
       return 0;
    }
 
@@ -893,6 +927,12 @@ int sb_decode(void *state, SpeexBits *bits, float *out)
       st->submodeID = 0;
    }
 
       st->submodeID = 0;
    }
 
+   if (dtx)
+   {
+      sb_decode_lost(st, out, 1, stack);
+      return 0;      
+   }
+
    for (i=0;i<st->frame_size;i++)
       st->exc[i]=0;
 
    for (i=0;i<st->frame_size;i++)
       st->exc[i]=0;
 
@@ -1097,7 +1137,16 @@ void sb_encoder_ctl(void *state, int request, void *ptr)
       st->submodeSelect = st->submodeID = (*(int*)ptr);
       break;
    case SPEEX_SET_LOW_MODE:
       st->submodeSelect = st->submodeID = (*(int*)ptr);
       break;
    case SPEEX_SET_LOW_MODE:
-      speex_encoder_ctl(st->st_low, SPEEX_SET_MODE, ptr);
+      speex_encoder_ctl(st->st_low, SPEEX_SET_LOW_MODE, ptr);
+      break;
+   case SPEEX_SET_DTX:
+      speex_encoder_ctl(st->st_low, SPEEX_SET_DTX, ptr);
+      break;
+   case SPEEX_GET_DTX:
+      speex_encoder_ctl(st->st_low, SPEEX_GET_DTX, ptr);
+      break;
+   case SPEEX_GET_LOW_MODE:
+      speex_encoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, ptr);
       break;
    case SPEEX_SET_MODE:
       speex_encoder_ctl(st, SPEEX_SET_QUALITY, ptr);
       break;
    case SPEEX_SET_MODE:
       speex_encoder_ctl(st, SPEEX_SET_QUALITY, ptr);
@@ -1272,6 +1321,9 @@ void sb_decoder_ctl(void *state, int request, void *ptr)
    st=(SBDecState*)state;
    switch(request)
    {
    st=(SBDecState*)state;
    switch(request)
    {
+   case SPEEX_GET_LOW_MODE:
+      speex_encoder_ctl(st->st_low, SPEEX_GET_LOW_MODE, ptr);
+      break;
    case SPEEX_GET_FRAME_SIZE:
       (*(int*)ptr) = st->full_frame_size;
       break;
    case SPEEX_GET_FRAME_SIZE:
       (*(int*)ptr) = st->full_frame_size;
       break;
index a304f10..bb14365 100644 (file)
@@ -46,7 +46,7 @@
 
 
 float vbr_nb_thresh[8][11]={
 
 
 float vbr_nb_thresh[8][11]={
-   {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0}, /* silence */
+   {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0}, /*   CNG   */
    {-.01, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -0.9, -1.0}, /*  2 kbps */
    { 8.5,  5.6,  4.7,  4.2,  3.9,  3.5,  3.0,  2.5,  2.0,  1.0,  0.0}, /*  6 kbps */
    {11.0,  8.5,  7.5,  6.5,  5.0,  3.9,  3.9,  3.9,  3.5,  3.0,  1.0}, /*  8 kbps */
    {-.01, -0.2, -0.3, -0.4, -0.5, -0.6, -0.7, -0.8, -0.9, -0.9, -1.0}, /*  2 kbps */
    { 8.5,  5.6,  4.7,  4.2,  3.9,  3.5,  3.0,  2.5,  2.0,  1.0,  0.0}, /*  6 kbps */
    {11.0,  8.5,  7.5,  6.5,  5.0,  3.9,  3.9,  3.9,  3.5,  3.0,  1.0}, /*  8 kbps */
index 346d055..2780f84 100644 (file)
@@ -48,6 +48,7 @@
 #include <io.h>
 #include <fcntl.h>
 #endif
 #include <io.h>
 #include <fcntl.h>
 #endif
+#include <math.h>
 
 #ifdef HAVE_SYS_SOUNDCARD_H
 #include <sys/soundcard.h>
 
 #ifdef HAVE_SYS_SOUNDCARD_H
 #include <sys/soundcard.h>
@@ -551,7 +552,7 @@ int main(int argc, char **argv)
                   }
                   /*Convert to short and save to output file*/
                   for (i=0;i<frame_size*channels;i++)
                   }
                   /*Convert to short and save to output file*/
                   for (i=0;i<frame_size*channels;i++)
-                     out[i]=(short)le_short((short)output[i]);
+                     out[i]=(short)le_short((short)floor(.5+output[i]));
 #if defined WIN32 || defined _WIN32
                   if (strlen(outFile)==0)
                       WIN_Play_Samples (out, sizeof(short) * frame_size*channels);
 #if defined WIN32 || defined _WIN32
                   if (strlen(outFile)==0)
                       WIN_Play_Samples (out, sizeof(short) * frame_size*channels);