Fixed a couple bugs (notably in buffer) and added LSP interpolation
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Feb 2002 06:10:14 +0000 (06:10 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Feb 2002 06:10:14 +0000 (06:10 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3054 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/speex.c
libspeex/speex.h

index 090a79e..9dd96dd 100644 (file)
@@ -19,8 +19,9 @@ void encoder_init(EncState *st)
    st->nbSubframes=4;
    st->subframeSize=32;
    st->lpcSize = 10;
    st->nbSubframes=4;
    st->subframeSize=32;
    st->lpcSize = 10;
-   st->bufSize = 256;
+   st->bufSize = 512;
    st->inBuf = malloc(st->bufSize*sizeof(float));
    st->inBuf = malloc(st->bufSize*sizeof(float));
+   st->frame = st->inBuf + st->bufSize - st->windowSize;
    for (i=0;i<st->bufSize;i++)
       st->inBuf[i]=0;
    st->window = malloc(st->windowSize*sizeof(float));
    for (i=0;i<st->bufSize;i++)
       st->inBuf[i]=0;
    st->window = malloc(st->windowSize*sizeof(float));
@@ -29,6 +30,7 @@ void encoder_init(EncState *st)
       st->window[i]=.5*(1-cos(2*M_PI*i/st->windowSize));
    st->buf2 = malloc(st->windowSize*sizeof(float));
    st->lpc = malloc((st->lpcSize+1)*sizeof(float));
       st->window[i]=.5*(1-cos(2*M_PI*i/st->windowSize));
    st->buf2 = malloc(st->windowSize*sizeof(float));
    st->lpc = malloc((st->lpcSize+1)*sizeof(float));
+   st->interp_lpc = malloc((st->lpcSize+1)*sizeof(float));
    st->autocorr = malloc((st->lpcSize+1)*sizeof(float));
    /* Create the window for autocorrelation (lag-windowing) */
    st->lagWindow = malloc((st->lpcSize+1)*sizeof(float));
    st->autocorr = malloc((st->lpcSize+1)*sizeof(float));
    /* Create the window for autocorrelation (lag-windowing) */
    st->lagWindow = malloc((st->lpcSize+1)*sizeof(float));
@@ -36,6 +38,7 @@ void encoder_init(EncState *st)
       st->lagWindow[i]=exp(-.5*sqr(2*M_PI*.01*i));
    st->lsp = malloc(st->lpcSize*sizeof(float));
    st->old_lsp = malloc(st->lpcSize*sizeof(float));
       st->lagWindow[i]=exp(-.5*sqr(2*M_PI*.01*i));
    st->lsp = malloc(st->lpcSize*sizeof(float));
    st->old_lsp = malloc(st->lpcSize*sizeof(float));
+   st->interp_lsp = malloc(st->lpcSize*sizeof(float));
    st->rc = malloc(st->lpcSize*sizeof(float));
    st->first = 1;
 }
    st->rc = malloc(st->lpcSize*sizeof(float));
    st->first = 1;
 }
@@ -55,17 +58,17 @@ void encoder_destroy(EncState *st)
 
 void encode(EncState *st, float *in, int *outSize, void *bits)
 {
 
 void encode(EncState *st, float *in, int *outSize, void *bits)
 {
-   int i, roots;
+   int i, j, sub, roots;
    float error;
 
    /* Copy new data in input buffer */
    float error;
 
    /* Copy new data in input buffer */
-   memmove(st->inBuf, st->inBuf+st->bufSize-st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
+   memmove(st->inBuf, st->inBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
    for (i=0;i<st->frameSize;i++)
       st->inBuf[st->bufSize-st->frameSize+i] = in[i];
 
    /* Window for analysis */
    for (i=0;i<st->windowSize;i++)
    for (i=0;i<st->frameSize;i++)
       st->inBuf[st->bufSize-st->frameSize+i] = in[i];
 
    /* Window for analysis */
    for (i=0;i<st->windowSize;i++)
-      st->buf2[i] = st->inBuf[i] * st->window[i];
+      st->buf2[i] = st->frame[i] * st->window[i];
    /* Compute auto-correlation */
    autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
    st->autocorr[0] += 1;        /* prevents NANs */
    /* Compute auto-correlation */
    autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
    st->autocorr[0] += 1;        /* prevents NANs */
@@ -74,30 +77,49 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
    for (i=0;i<st->lpcSize+1;i++)
       st->autocorr[i] *= st->lagWindow[i];
    /* Levinson-Durbin */
    for (i=0;i<st->lpcSize+1;i++)
       st->autocorr[i] *= st->lagWindow[i];
    /* Levinson-Durbin */
+   for (i=0;i<st->lpcSize+1;i++)
+      printf("%f ", st->autocorr[i]);
+   printf ("\n");
+
    error = wld(st->lpc+1, st->autocorr, st->rc, st->lpcSize);
    st->lpc[0]=1;
    for (i=0;i<st->lpcSize+1;i++)
       printf("%f ", st->lpc[i]);
    error = wld(st->lpc+1, st->autocorr, st->rc, st->lpcSize);
    st->lpc[0]=1;
    for (i=0;i<st->lpcSize+1;i++)
       printf("%f ", st->lpc[i]);
-   printf ("\nprediction error = %f, R[0] = %f, gain = %f\n", error, st->autocorr[0], 
-           st->autocorr[0]/error);
+   printf ("\nprediction error = %f, R[0] = %f, gain = %f\n", error, st->autocorr[0], st->autocorr[0]/error);
+
    /* LPC to LSPs (x-domain) transform */
    roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.02);
    /* LPC to LSPs (x-domain) transform */
    roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.02);
+   if (roots!=st->lpcSize)
+   {
+      fprintf ("roots!=st->lpcSize\n");
+      exit(1);
+   }
    for (i=0;i<roots;i++)
       printf("%f ", st->lsp[i]);
    printf ("\nfound %d roots\n", roots);
 
    /* Quantize LSPs */
 
    for (i=0;i<roots;i++)
       printf("%f ", st->lsp[i]);
    printf ("\nfound %d roots\n", roots);
 
    /* Quantize LSPs */
 
-   /* Back to "quantized" LPC */
-   lsp_to_lpc(st->lsp, st->lpc, roots);
-   for (i=0;i<st->lpcSize+1;i++)
-      printf("%f ", st->lpc[i]);
-   printf ("\n\n");
-
-   /* Compute "weighted" residue */
-
-   /* Find pitch */
-
+   for (sub=0;sub<st->nbSubframes;sub++)
+   {
+      float fact;
+      /* LSP interpolation */
+      fact = (.5 + sub)/st->nbSubframes;
+      for (i=0;i<st->lpcSize;i++)
+         st->interp_lsp[i] = (1-fact)*st->old_lsp[i] + fact*st->lsp[i];
+
+      /* Compute interpolated LPCs */
+      lsp_to_lpc(st->interp_lsp, st->interp_lpc, st->lpcSize);
+      for (i=0;i<st->lpcSize+1;i++)
+         printf("%f ", st->interp_lpc[i]);
+      printf ("\n");
+      
+      /* Compute "weighted" residue */
+      
+      /* Find pitch */
+   }
+
+   printf ("\n");
    for (i=0;i<st->lpcSize;i++)
       st->old_lsp[i] = st->lsp[i];
    st->first = 0;
    for (i=0;i<st->lpcSize;i++)
       st->old_lsp[i] = st->lsp[i];
    st->first = 0;
index 7d275f8..60ab4a2 100644 (file)
@@ -1,22 +1,25 @@
 #ifndef SPEEX_H
 #define SPEEX_H
 
 #ifndef SPEEX_H
 #define SPEEX_H
 
-
+/**Structure representing the full state of the encoder*/
 typedef struct EncState {
    int    frameSize;      /* Size of frames */
    int    subframeSize;   /* Size of sub-frames */
    int    nbSubframes;    /* Number of sub-frames */
 typedef struct EncState {
    int    frameSize;      /* Size of frames */
    int    subframeSize;   /* Size of sub-frames */
    int    nbSubframes;    /* Number of sub-frames */
+   int    windowSize;     /* Analysis (LPC) window length */
    int    lpcSize;        /* LPC order */
    int    bufSize;        /* Buffer size */
    float *inBuf;          /* Input buffer */
    int    lpcSize;        /* LPC order */
    int    bufSize;        /* Buffer size */
    float *inBuf;          /* Input buffer */
+   float *frame;          /* Start of encoded frame */
    float *window;         /* Temporary (Hanning) window */
    float *window;         /* Temporary (Hanning) window */
-   int    windowSize;     /* Window length */
    float *buf2;           /* 2nd temporary buffer */
    float *autocorr;       /* auto-correlation */
    float *lagWindow;      /* Window applied to auto-correlation */
    float *lpc;            /* LPCs for current frame */
    float *lsp;            /* LSPs for current frame */
    float *old_lsp;        /* LSPs for previous frame */
    float *buf2;           /* 2nd temporary buffer */
    float *autocorr;       /* auto-correlation */
    float *lagWindow;      /* Window applied to auto-correlation */
    float *lpc;            /* LPCs for current frame */
    float *lsp;            /* LSPs for current frame */
    float *old_lsp;        /* LSPs for previous frame */
+   float *interp_lsp;     /* Interpolated LSPs */
+   float *interp_lpc;     /* Interpolated LPCs */
    float *rc;             /* Reflection coefficients */
    int    first;          /* Is this the first frame? */
 } EncState;
    float *rc;             /* Reflection coefficients */
    int    first;          /* Is this the first frame? */
 } EncState;
@@ -24,8 +27,11 @@ typedef struct EncState {
 typedef struct DecState {
 } DecState;
 
 typedef struct DecState {
 } DecState;
 
+/**Initializes encoder state*/
 void encoder_init(EncState *st);
 void encoder_init(EncState *st);
+/**De-allocates encoder state resources*/
 void encoder_destroy(EncState *st);
 void encoder_destroy(EncState *st);
+/**Encodes one frame*/
 void encode(EncState *st, float *in, int *outSize, void *bits);
 
 void decoder_init(DecState *st);
 void encode(EncState *st, float *in, int *outSize, void *bits);
 
 void decoder_init(DecState *st);