Integrating the modes and bitstream.
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 1 Mar 2002 15:40:57 +0000 (15:40 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 1 Mar 2002 15:40:57 +0000 (15:40 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3119 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/Makefile.am
libspeex/bits.c
libspeex/bits.h
libspeex/modes.c
libspeex/modes.h
libspeex/speex.c
libspeex/speex.h
libspeex/testenc.c

index d519a63..b1b7793 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in. -*-Makefile-*-
 
-# $Id: Makefile.am,v 1.6 2002/02/28 01:32:05 jmvalin Exp $
+# $Id: Makefile.am,v 1.7 2002/03/01 15:40:57 jmvalin Exp $
 
 # Disable automatic dependency tracking if using other tools than gcc and gmake
 #AUTOMAKE_OPTIONS = no-dependencies
@@ -21,7 +21,9 @@ libspeex_la_SOURCES = speex.c \
        bits.c \
        modes.c
 
-include_HEADERS = speex.h
+include_HEADERS = speex.h \
+       bits.h \
+       modes.h
 
 noinst_HEADERS = lsp.h \
        lpc.h \
@@ -29,9 +31,7 @@ noinst_HEADERS = lsp.h \
        quant_lsp.h \
        cb_search.h \
        filters.h \
-       stack_alloc.h \
-       bits.h \
-       modes.h
+       stack_alloc.h
        
        
 libspeex_la_LDFLAGS = -release $(LT_RELEASE)
index b9bf910..a1dd6e3 100644 (file)
@@ -37,6 +37,16 @@ void frame_bits_destroy(FrameBits *bits)
    /* Will do something once the allocation is dynamic */
 }
 
+void frame_bits_reset(FrameBits *bits)
+{
+   int i;
+   for (i=0;i<MAX_BYTES_PER_FRAME;i++)
+      bits->bytes[i]=0;
+   bits->nbBits=0;
+   bits->bytePtr=0;
+   bits->bitPtr=0;
+}
+
 void frame_bits_init_from(FrameBits *bits, char *bytes, int len)
 {
    int i;
index b30c2b9..f14a5b9 100644 (file)
@@ -35,6 +35,8 @@ void frame_bits_init(FrameBits *bits);
 
 void frame_bits_destroy(FrameBits *bits);
 
+void frame_bits_reset(FrameBits *bits);
+
 void frame_bits_init_from(FrameBits *bits, char *bytes, int len);
 
 void frame_bits_write(FrameBits *bits, char *bytes, int max_len);
index 4782d19..e8e5f46 100644 (file)
 SpeexMode nb_mode = {
    160,    /*frameSize*/
    40,     /*subframeSize*/
+   320,    /*windowSize*/
    10,     /*lpcSize*/
+   640,    /*bufSize*/
+   20,     /*pitchStart*/
+   140,    /*pitchEnd*/
    0.9,    /*gamma1*/
    0.5     /*gamma2*/
 };
index 9c36941..6490c12 100644 (file)
 typedef struct SpeexMode {
    int     frameSize;
    int     subframeSize;
+   int     windowSize;
    int     lpcSize;
+   int     bufSize;
+   int     pitchStart;
+   int     pitchEnd;
    float   gamma1;
    float   gamma2;
+   /* Should add info about LSP quantization, pitch gain quantization 
+      and other codebooks */
 } SpeexMode;
 
 extern SpeexMode nb_mode;
index 54bf800..5d09695 100644 (file)
@@ -37,18 +37,19 @@ extern float stoc[];
 #define sqr(x) ((x)*(x))
 #define min(a,b) ((a) < (b) ? (a) : (b))
 
-void encoder_init(EncState *st)
+void encoder_init(EncState *st, SpeexMode *mode)
 {
    int i;
    /* Codec parameters, should eventually have several "modes"*/
-   st->frameSize = 160;
-   st->windowSize = 320;
-   st->nbSubframes=4;
-   st->subframeSize=40;
-   st->lpcSize = 10;
-   st->bufSize = 640;
-   st->gamma1=.9;
-   st->gamma2=.5;
+   st->frameSize = mode->frameSize;
+   st->windowSize = mode->windowSize;
+   st->nbSubframes=mode->frameSize/mode->subframeSize;
+   st->subframeSize=mode->subframeSize;
+   st->lpcSize = mode->lpcSize;
+   st->bufSize = mode->bufSize;
+   st->gamma1=mode->gamma1;
+   st->gamma2=mode->gamma2;
+
 
    st->inBuf = malloc(st->bufSize*sizeof(float));
    st->frame = st->inBuf + st->bufSize - st->windowSize;
@@ -147,7 +148,7 @@ void encoder_destroy(EncState *st)
    free(st->mem7);
 }
 
-void encode(EncState *st, float *in, int *outSize, void *bits)
+void encode(EncState *st, float *in, FrameBits *bits)
 {
    int i, j, sub, roots;
    float error;
@@ -203,6 +204,7 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
    for (sub=0;sub<st->nbSubframes;sub++)
    {
       float tmp, tmp1,tmp2,gain[3];
+      float esig=0, enoise=0, snr;
       int pitch, offset, pitch_gain_index;
       float *sp, *sw, *res, *exc, *target;
       
@@ -265,9 +267,9 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
          st->mem4[i]=st->mem2[i];
       syn_filt_mem(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem4);
 
-      /*for (i=0;i<st->lpcSize;i++)
-        st->mem3[i]=sw[st->subframeSize-i-1];*/
-
+      for (i=0;i<st->subframeSize;i++)
+         esig+=sw[i]*sw[i];
+      
       /* Compute target signal */
       for (i=0;i<st->subframeSize;i++)
          target[i]=sw[i]-res[i];
@@ -307,6 +309,11 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
          target[i]-=gain[0]*res[i];
 
 
+      for (i=0;i<st->subframeSize;i++)
+         enoise += target[i]*target[i];
+      snr = 10*log10((esig+1)/(enoise+1));
+      printf ("seg SNR = %f\n", snr);
+
 #else
 
 #if 0 /* Code to calculate the exact excitation after pitch prediction  */
@@ -348,6 +355,7 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
       /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
       residue_mem(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize, st->mem1);
       syn_filt_mem(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem2);
+
    }
 
    /* Store the LSPs for interpolation in the next frame */
@@ -365,7 +373,7 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
 }
 
 
-void decoder_init(DecState *st)
+void decoder_init(DecState *st, SpeexMode *mode)
 {
 }
 
@@ -373,6 +381,6 @@ void decoder_destroy(DecState *st)
 {
 }
 
-void decode(DecState *st, float *bits, float *out)
+void decode(DecState *st, FrameBits *bits, float *out)
 {
 }
index a76f90c..79f14b4 100644 (file)
@@ -20,6 +20,9 @@
 #ifndef SPEEX_H
 #define SPEEX_H
 
+#include "modes.h"
+#include "bits.h"
+
 /**Structure representing the full state of the encoder*/
 typedef struct EncState {
    int    first;          /* Is this the first frame? */
@@ -82,15 +85,15 @@ typedef struct DecState {
 } DecState;
 
 /**Initializes encoder state*/
-void encoder_init(EncState *st);
+void encoder_init(EncState *st, SpeexMode *mode);
 /**De-allocates encoder state resources*/
 void encoder_destroy(EncState *st);
 /**Encodes one frame*/
-void encode(EncState *st, float *in, int *outSize, void *bits);
+void encode(EncState *st, float *in, FrameBits *bits);
 
-void decoder_init(DecState *st);
+void decoder_init(DecState *st, SpeexMode *mode);
 void decoder_destroy(DecState *st);
-void decode(DecState *st, float *bits, float *out);
+void decode(DecState *st, FrameBits *bits, float *out);
 
 
 
index 5606e33..b7f0497 100644 (file)
@@ -12,8 +12,9 @@ int main(int argc, char **argv)
    float input[FRAME_SIZE];
    int i;
    EncState st;
+   FrameBits bits;
 
-   encoder_init(&st);
+   encoder_init(&st, &nb_mode);
    if (argc != 3)
    {
       fprintf (stderr, "Usage: encode [in file] [out file]\n");
@@ -23,12 +24,15 @@ int main(int argc, char **argv)
    fin = fopen(inFile, "r");
    outFile = argv[2];
    fout = fopen(outFile, "w");
+   frame_bits_init(&bits);
    while (!feof(fin))
    {
       fread(in, sizeof(short), FRAME_SIZE, fin);
       for (i=0;i<FRAME_SIZE;i++)
          input[i]=in[i];
-      encode(&st, input, NULL, NULL);
+      encode(&st, input, &bits);
+      /* Save the bits here */
+      frame_bits_reset(&bits);
       for (i=0;i<FRAME_SIZE;i++)
          in[i]=input[i];
       fwrite(in, sizeof(short), FRAME_SIZE, fout);