added perceptual weighting filter, bug fixes, fixed warnings
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Feb 2002 07:15:43 +0000 (07:15 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Feb 2002 07:15:43 +0000 (07:15 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3055 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/lsp.c
libspeex/speex.c
libspeex/speex.h
libspeex/testenc.c

index a4b884b..7d1d93f 100644 (file)
@@ -98,7 +98,7 @@ int lpc_to_lsp (float *a,int lpcrdr,float *freq,int nb,float delta)
 {
 
     float psuml,psumr,psumm,temp_xr,xl,xr,xm;
-    float temp_psumr,temp_qsumr;
+    float temp_psumr/*,temp_qsumr*/;
     int i,j,m,flag,k;
     float *Q;                  /* ptrs for memory allocation           */
     float *P;
index 9dd96dd..6f11b36 100644 (file)
@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <math.h>
 #include "speex.h"
@@ -20,10 +21,15 @@ void encoder_init(EncState *st)
    st->subframeSize=32;
    st->lpcSize = 10;
    st->bufSize = 512;
+   st->gamma=.9;
    st->inBuf = malloc(st->bufSize*sizeof(float));
    st->frame = st->inBuf + st->bufSize - st->windowSize;
+   st->wBuf = malloc(st->bufSize*sizeof(float));
+   st->wframe = st->wBuf + st->bufSize - st->windowSize;
    for (i=0;i<st->bufSize;i++)
       st->inBuf[i]=0;
+   for (i=0;i<st->bufSize;i++)
+      st->wBuf[i]=0;
    st->window = malloc(st->windowSize*sizeof(float));
    /* Hanning window */
    for (i=0;i<st->windowSize;i++)
@@ -31,6 +37,7 @@ void encoder_init(EncState *st)
    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->bw_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));
@@ -46,13 +53,17 @@ void encoder_init(EncState *st)
 void encoder_destroy(EncState *st)
 {
    free(st->inBuf);
+   free(st->wBuf);
    free(st->window);
    free(st->buf2);
    free(st->lpc);
+   free(st->interp_lpc);
+   free(st->bw_lpc);
    free(st->autocorr);
    free(st->lagWindow);
    free(st->lsp);
    free(st->old_lsp);
+   free(st->interp_lsp);
    free(st->rc);
 }
 
@@ -65,6 +76,7 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
    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];
+   memmove(st->wBuf, st->wBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
 
    /* Window for analysis */
    for (i=0;i<st->windowSize;i++)
@@ -77,46 +89,66 @@ 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++)
+   /*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]);
-   printf ("\nprediction error = %f, R[0] = %f, gain = %f\n", error, st->autocorr[0], st->autocorr[0]/error);
+   /*for (i=0;i<st->lpcSize+1;i++)
+     printf("%f ", st->lpc[i]);
+   printf ("\n");*/
+   printf ("prediction 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);
    if (roots!=st->lpcSize)
    {
-      fprintf ("roots!=st->lpcSize\n");
+      fprintf (stderr, "roots!=st->lpcSize\n");
       exit(1);
    }
-   for (i=0;i<roots;i++)
+   /*for (i=0;i<roots;i++)
       printf("%f ", st->lsp[i]);
-   printf ("\nfound %d roots\n", roots);
+      printf ("\n\n");*/
 
    /* Quantize LSPs */
 
    for (sub=0;sub<st->nbSubframes;sub++)
    {
-      float fact;
+      float tmp;
       /* LSP interpolation */
-      fact = (.5 + sub)/st->nbSubframes;
+      tmp = (.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];
+         st->interp_lsp[i] = (1-tmp)*st->old_lsp[i] + tmp*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++)
+
+      /*for (i=0;i<st->lpcSize+1;i++)
          printf("%f ", st->interp_lpc[i]);
       printf ("\n");
-      
-      /* Compute "weighted" residue */
-      
-      /* Find pitch */
+      */
+
+      /* Compute bandwidth-expanded LPCs for perceptual weighting*/
+      tmp=1;
+      for (i=0;i<st->lpcSize+1;i++)
+      {
+         st->bw_lpc[i] = tmp * st->interp_lpc[i];
+         tmp *= st->gamma;
+      }
+      /*for (i=0;i<st->lpcSize+1;i++)
+         printf("%f ", st->bw_lpc[i]);
+         printf ("\n");*/
+
+      /* Compute perceptualy weighted residue */      
+      for (i=0;i<st->frameSize;i++)
+      {
+         st->wframe[i]=st->frame[i];
+         for (j=1;j<st->lpcSize+1;j++)
+            st->wframe[i] += st->frame[i-j]*st->bw_lpc[j];
+      }
+
+      /* Find pitch gain and delay */
    }
 
    printf ("\n");
index 60ab4a2..59bbf82 100644 (file)
@@ -3,14 +3,18 @@
 
 /**Structure representing the full state of the encoder*/
 typedef struct EncState {
+   int    first;          /* Is this the first frame? */
    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 */
-   float *frame;          /* Start of encoded frame */
+   float  gamma;          /* Perceptual filter: A(z/gamma) */
+   float *inBuf;          /* Input buffer (original signal) */
+   float *frame;          /* Start of original frame */
+   float *wBuf;           /* "Weighted" buffer */
+   float *wframe;         /* Start of "weighted" frame */
    float *window;         /* Temporary (Hanning) window */
    float *buf2;           /* 2nd temporary buffer */
    float *autocorr;       /* auto-correlation */
@@ -20,8 +24,8 @@ typedef struct EncState {
    float *old_lsp;        /* LSPs for previous frame */
    float *interp_lsp;     /* Interpolated LSPs */
    float *interp_lpc;     /* Interpolated LPCs */
+   float *bw_lpc;         /* LPCs after bandwidth expansion for perceptual weighting*/
    float *rc;             /* Reflection coefficients */
-   int    first;          /* Is this the first frame? */
 } EncState;
 
 typedef struct DecState {
index 53e34d3..6a4c188 100644 (file)
@@ -4,7 +4,7 @@
 
 #define FRAME_SIZE 128
 
-main(int argc, char **argv)
+int main(int argc, char **argv)
 {
    char *inFile, *outFile;
    FILE *fin, *fout;
@@ -30,4 +30,6 @@ main(int argc, char **argv)
          input[i]=in[i];
       encode(&st, input, NULL, NULL);
    }
+   encoder_destroy(&st);
+   return 1;
 }