Integrated "ultra-wideband" with encoder/decoder.
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 4 Nov 2002 03:00:52 +0000 (03:00 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 4 Nov 2002 03:00:52 +0000 (03:00 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@4080 0101bb08-14d6-0310-b084-bc0e0c8e3800

doc/manual.lyx
libspeex/modes.c
libspeex/sb_celp.c
libspeex/speex.h
libspeex/testenc_uwb.c
src/speexenc.c
src/wav_io.c

index c61fcc7..efc67dc 100644 (file)
@@ -3037,7 +3037,7 @@ Bit allocation for high-band in wideband mode
 
 
 \layout Section
-
+\pagebreak_top 
 Command-line encoder/decoder
 \layout Standard
 
index 98a36d6..805fc6b 100644 (file)
@@ -41,7 +41,7 @@
 #include "sb_celp.h"
 #include "nb_celp.h"
 
-SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode};
+SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
 
 /* Extern declarations for all codebooks we use here */
 extern float gain_cdbk_nb[];
index 9600ac5..7cbefce 100644 (file)
@@ -463,10 +463,6 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
 
          g *= filter_ratio;
 
-         if (st->full_frame_size==640)
-         {
-            printf ("encode: %f %f %f %f %f\n", g, rl, rh, el, eh);
-         }
          /* Gain quantization */
          {
             int quant = (int) floor(.5 + 27 + 8.0 * log((g+.0001)));
@@ -842,15 +838,11 @@ int sb_decode(void *state, SpeexBits *bits, float *out)
       {
          float g;
          int quant;
-         printf ("subframes: %d\n", st->subframeSize);
+
          for (i=0;i<st->subframeSize;i++)
             el+=sqr(low_innov[offset+i]);
          quant = speex_bits_unpack_unsigned(bits, 5);
          g= exp(((float)quant-27)/8.0);
-         if (st->full_frame_size==640)
-         {
-            printf ("decode: %f %f %f %f\n", g, rl, rh, el);
-         }
          
          /*printf ("unquant folding gain: %f\n", g);*/
          g /= filter_ratio;
index 5b6b72c..9c627c8 100644 (file)
@@ -122,7 +122,7 @@ extern "C" {
 
 
 /** Number of defined modes in Speex */
-#define SPEEX_NB_MODES 2
+#define SPEEX_NB_MODES 3
 
 struct SpeexMode;
 
index 38a7131..9d83263 100644 (file)
@@ -24,8 +24,8 @@ int main(int argc, char **argv)
    st = speex_encoder_init(&speex_uwb_mode);
    dec = speex_decoder_init(&speex_uwb_mode);
    
-   /*tmp=0;
-   speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);
+   tmp=0;
+   /*speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);
    tmp=0;
    speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);
    tmp=10;
index 8b4e3ed..9c4f4c6 100644 (file)
@@ -139,8 +139,8 @@ void usage()
    printf ("Options:\n");
    printf (" -n, --narrowband   Narrowband (8 kHz) input file\n"); 
    printf (" -w, --wideband     Wideband (16 kHz) input file\n"); 
+   printf (" -u, --ultra-wideband \"Ultra-Wideband\" (32 kHz) input file\n"); 
    printf (" --quality n        Encoding quality (0-10), default 3\n"); 
-   printf (" --lbr              Low bit-rate mode (equivalent to --quality 3)\n"); 
    printf (" --vbr              Enable variable bit-rate (VBR)\n"); 
    printf (" --comp n           Set encoding complexity (0-10), default 3\n"); 
    printf (" --nframes n        Number of frames per Ogg packet (1-10), default 1\n"); 
@@ -168,7 +168,7 @@ int main(int argc, char **argv)
 {
    int c;
    int option_index = 0;
-   int narrowband=0, wideband=0;
+   int narrowband=0, wideband=0, ultrawide=0;
    char *inFile, *outFile;
    FILE *fin, *fout;
    float input[MAX_FRAME_SIZE];
@@ -182,8 +182,8 @@ int main(int argc, char **argv)
    struct option long_options[] =
    {
       {"wideband", no_argument, NULL, 0},
+      {"ultra-wideband", no_argument, NULL, 0},
       {"narrowband", no_argument, NULL, 0},
-      {"lbr", no_argument, NULL, 0},
       {"vbr", no_argument, NULL, 0},
       {"quality", required_argument, NULL, 0},
       {"nframes", required_argument, NULL, 0},
@@ -205,7 +205,6 @@ int main(int argc, char **argv)
    int fmt=16;
    int quality=-1;
    float vbr_quality=-1;
-   int lbr=0;
    int lsb=1;
    ogg_stream_state os;
    ogg_page             og;
@@ -238,8 +237,8 @@ int main(int argc, char **argv)
             narrowband=1;
          else if (strcmp(long_options[option_index].name,"wideband")==0)
                wideband=1;
-         else if (strcmp(long_options[option_index].name,"lbr")==0)
-               lbr=1;
+         else if (strcmp(long_options[option_index].name,"ultra-wideband")==0)
+               ultrawide=1;
          else if (strcmp(long_options[option_index].name,"vbr")==0)
                vbr_enabled=1;
          else if (strcmp(long_options[option_index].name,"quality")==0)
@@ -305,6 +304,9 @@ int main(int argc, char **argv)
       case 'w':
          wideband=1;
          break;
+      case 'u':
+         ultrawide=1;
+         break;
       case '?':
          usage();
          exit(1);
@@ -319,9 +321,9 @@ int main(int argc, char **argv)
    inFile=argv[optind];
    outFile=argv[optind+1];
 
-   if (wideband && narrowband)
+   if ((wideband && narrowband) || (wideband && ultrawide) || (ultrawide && narrowband))
    {
-      fprintf (stderr,"Cannot specify both wideband and narrowband at the same time\n");
+      fprintf (stderr,"Cannot specify two modes at the same time\n");
       exit(1);
    };
 
@@ -380,6 +382,23 @@ int main(int argc, char **argv)
       fprintf (stderr,"Warning: Speex is not optimized for 22.05 kHz sampling rate. Your mileage may vary\n");
       if (narrowband)
          fprintf (stderr,"Warning: encoding a wideband file in narrowband\n");
+   } else if (rate==32000)
+   {
+      ultrawide=1;
+      if (wideband)
+         fprintf (stderr,"Warning: encoding a narrowband file in wideband\n");
+   } else if (rate==44100)
+   {
+      fprintf (stderr,"Warning: Speex is not optimized for 44.1 kHz sampling rate. Your mileage may vary\n");
+      ultrawide=1;
+      if (wideband)
+         fprintf (stderr,"Warning: encoding a narrowband file in wideband\n");
+   } else if (rate==48000)
+   {
+      fprintf (stderr,"Warning: Speex is not optimized for 48 kHz sampling rate. Your mileage may vary\n");
+      ultrawide=1;
+      if (wideband)
+         fprintf (stderr,"Warning: encoding a narrowband file in wideband\n");
    } else if (rate==11025)
    {
       fprintf (stderr,"Warning: Speex is not optimized for 11.025 kHz sampling rate. Your mileage may vary\n");
@@ -402,6 +421,12 @@ int main(int argc, char **argv)
          rate = 16000;
       mode=&speex_wb_mode;
    }
+   if (ultrawide)
+   {
+      if (!rate)
+         rate = 32000;
+      mode=&speex_uwb_mode;
+   }
 
    speex_init_header(&header, rate, 1, mode);
    header.frames_per_packet=nframes;
index 4e789da..afac8fd 100644 (file)
@@ -96,7 +96,7 @@ int read_wav_header(FILE *file, int *rate, int *channels, int *format, int *size
    fread(&itmp, 4, 1, file);
    itmp = le_int(itmp);
    *rate = itmp;
-   if (*rate != 8000 && *rate != 16000 && *rate != 11025 && *rate != 22050)
+   if (*rate != 8000 && *rate != 16000 && *rate != 11025 && *rate != 22050 && *rate != 32000 && *rate != 44100 && *rate != 48000)
    {
       fprintf (stderr, "Only 8 kHz (narrowband) and 16 kHz (wideband) supported (plus 11.025 kHz and 22.05 kHz, but your mileage may vary)\n");
       return -1;