Think I have the LPC->LSP->LPC right this time
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 14 Feb 2002 23:46:56 +0000 (23:46 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 14 Feb 2002 23:46:56 +0000 (23:46 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3052 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/speex.c
libspeex/speex.h

index 0a4b8f9..37884b9 100644 (file)
@@ -9,12 +9,15 @@
 #define M_PI           3.14159265358979323846  /* pi */
 #endif
 
+#define sqr(x) ((x)*(x))
+
 void encoder_init(EncState *st)
 {
    int i;
    st->frameSize = 128;
    st->windowSize = 256;
-   st->subframeSize=64;
+   st->nbSubframes=4;
+   st->subframeSize=32;
    st->lpcSize = 10;
    st->bufSize = 256;
    st->inBuf = malloc(st->bufSize*sizeof(float));
@@ -25,8 +28,12 @@ void encoder_init(EncState *st)
    for (i=0;i<st->windowSize;i++)
       st->window[i]=.5*(1-cos(2*M_PI*i/st->windowSize));
    st->buf2 = malloc(st->windowSize*sizeof(float));
-   st->lpc = malloc(st->lpcSize*sizeof(float));
+   st->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));
+   for (i=0;i<st->lpcSize+1;i++)
+      st->lagWindow[i]=exp(-.5*sqr(2*M_PI*.01*i));
    st->lsp = malloc(st->lpcSize*sizeof(float));
    st->rc = malloc(st->lpcSize*sizeof(float));
 }
@@ -38,6 +45,7 @@ void encoder_destroy(EncState *st)
    free(st->buf2);
    free(st->lpc);
    free(st->autocorr);
+   free(st->lagWindow);
    free(st->lsp);
    free(st->rc);
 }
@@ -55,18 +63,37 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
    /* Window for analysis */
    for (i=0;i<st->windowSize;i++)
       st->buf2[i] = st->inBuf[i] * st->window[i];
-   
+   /* Compute auto-correlation */
    autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
-   st->autocorr[0] += 1;        /* prevents nan */
+   st->autocorr[0] += 1;        /* prevents NANs */
    st->autocorr[0] *= 1.0001;   /* 40 dB noise floor */
-   /*Should do lag windowing here */
-   error = wld(st->lpc, st->autocorr, st->rc, st->lpcSize);
-   printf ("prediction error = %f, R[0] = %f, gain = %f\n", error, st->autocorr[0], 
+   /* Perform lag windowing here, equivalent to filtering in the power-spectrum domain */
+   for (i=0;i<st->lpcSize+1;i++)
+      st->autocorr[i] *= st->lagWindow[i];
+   /* Levinson-Durbin */
+   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);
-   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 4, 0.02);
+   /* LPC to LSPs (x-domain) transform */
+   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.02);
    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 */
 }
 
 
index 1aedc14..a745f5b 100644 (file)
@@ -12,6 +12,7 @@ typedef struct EncState {
    int    windowSize;
    float *buf2;
    float *autocorr;
+   float *lagWindow;
    float *lpc;
    float *lsp;
    float *rc;