Think the filter stuff works with W(z)=A(z/.9)/A(z/.5)
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Feb 2002 21:35:32 +0000 (21:35 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Feb 2002 21:35:32 +0000 (21:35 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3106 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/filters.h
libspeex/speex.c
libspeex/speex.h

index 9004261..ad6ef4c 100644 (file)
@@ -48,7 +48,7 @@ int   nsf                       /* number of samples in subframe */
   float *impulse;              /* excitation vector containing one impulse */
   float d,e,g,score;           /* codebook searching variables */
   float bscore;                        /* score of "best" vector so far */
-  int i,j,k;                   /* loop variables */
+  int i,k;                     /* loop variables */
 
   /* Initialise */
   
@@ -67,21 +67,17 @@ int   nsf                       /* number of samples in subframe */
   /* Calculate impulse response of  A(z/g2) / ( A(z)*(z/g1) ) */
   residue_zero(impulse, awk1, h, nsf, p);
   syn_filt_zero(h, ak, h, nsf, p);
-  /*syn_filt_zero(h, awk2, h, nsf,p);*/
+  syn_filt_zero(h, awk2, h, nsf,p);
   
   /* Calculate codebook zero-response */
   residue_zero(&codebook[entries-1],awk1,resp,nsf,p);
   syn_filt_zero(resp,ak,resp,nsf,p);
-  /*syn_filt_zero(resp,awk2,resp,nsf,p);*/
+  syn_filt_zero(resp,awk2,resp,nsf,p);
     
   /* Search codebook backwards using end correction for synthesis */
   
   for(k=entries-1; k>=0; k--) {
 
-     /* residue_zero(&codebook[k],awk1,resp,nsf,p);
-  syn_filt_zero(resp,ak,resp,nsf,p);
-  syn_filt_zero(resp,awk2,resp,nsf,p);
-     */
     d = 0.0; e = 0.0;
     for(i=0; i<nsf; i++) {
       d += target[i]*resp[i];
@@ -89,7 +85,7 @@ int   nsf                       /* number of samples in subframe */
     }
     g = d/e;
     score = g*d;
-    printf ("score: %f %f %f %f\n", target[0],d,e,score);
+    /*printf ("score: %f %f %f %f\n", target[0],d,e,score);*/
     if (score >= bscore) {
       bscore = score;
       *gain = g;
index d4e8de0..dbbb017 100644 (file)
 #ifndef FILTERS_H
 #define FILTERS_H
 
+/* Synthesis filter using the past of y[n] (negative indices) as memory */
 void syn_filt(float *x, float *a, float *y, int N, int ord);
+
+/* Synthesis filter using zero memory */
 void syn_filt_zero(float *x, float *a, float *y, int N, int ord);
+
+/* Synthesis filter using memory */
 void syn_filt_mem(float *x, float *a, float *y, int N, int ord, float *mem);
 
+/* Analysis (FIR) filter using the past of x[n] (negative indices) as memory */
 void residue(float *x, float *a, float *y, int N, int ord);
+
+/* Analysis (FIR) filter using zero memory */
 void residue_zero(float *x, float *a, float *y, int N, int ord);
+
+/* Analysis (FIR) filter using memory */
 void residue_mem(float *x, float *a, float *y, int N, int ord, float *mem);
 
 #endif
index 2ceb97e..41421fa 100644 (file)
@@ -90,6 +90,7 @@ void encoder_init(EncState *st)
    st->interp_qlpc = malloc((st->lpcSize+1)*sizeof(float));
    st->bw_lpc1 = malloc((st->lpcSize+1)*sizeof(float));
    st->bw_lpc2 = malloc((st->lpcSize+1)*sizeof(float));
+   st->bw_az = malloc((st->lpcSize*2+1)*sizeof(float));
 
    st->lsp = malloc(st->lpcSize*sizeof(float));
    st->qlsp = malloc(st->lpcSize*sizeof(float));
@@ -126,6 +127,7 @@ void encoder_destroy(EncState *st)
 
    free(st->bw_lpc1);
    free(st->bw_lpc2);
+   free(st->bw_az);
    free(st->autocorr);
    free(st->lagWindow);
    free(st->lsp);
@@ -135,6 +137,14 @@ void encoder_destroy(EncState *st)
    free(st->old_qlsp);
    free(st->interp_qlsp);
    free(st->rc);
+
+   free(st->mem1);
+   free(st->mem2);
+   free(st->mem3);
+   free(st->mem4);
+   free(st->mem5);
+   free(st->mem6);
+   free(st->mem7);
 }
 
 void encode(EncState *st, float *in, int *outSize, void *bits)
@@ -235,10 +245,6 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
       }
       /* Compute residue */
       /*residue(sp, st->interp_qlpc, res, st->subframeSize, st->lpcSize);*/
-
-      /* Compute weighted signal */
-      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);*/
       
       /* Reset excitation */
       for (i=0;i<st->subframeSize;i++)
@@ -246,15 +252,23 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
 
       /* Compute zero response of A(z/g1) / ( A(z/g2) * Aq(z) ) */
       residue(exc, st->bw_lpc1, exc, st->subframeSize, st->lpcSize);
-      /*syn_filt_mem(exc, st->bw_lpc2, exc, st->subframeSize, st->lpcSize, st->mem3);*/
+      syn_filt_mem(exc, st->interp_qlpc, res, st->subframeSize, st->lpcSize, st->mem3);
+      syn_filt_mem(exc, st->bw_lpc2, exc, st->subframeSize, st->lpcSize, st->mem4);
+
+
+      /* Compute weighted signal */
+      residue_mem(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize, st->mem1);
       for (i=0;i<st->lpcSize;i++)
-        st->mem4[i]=sw[-i-1];
-      syn_filt_mem(exc, st->interp_qlpc, res, st->subframeSize, st->lpcSize, st->mem4);
+        st->mem3[i]=sw[st->subframeSize-i-1];
+      syn_filt_mem(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem2);
+      for (i=0;i<st->lpcSize;i++)
+        st->mem4[i]=sw[st->subframeSize-i-1];
+
 
       /* Compute target signal */
       for (i=0;i<st->subframeSize;i++)
          target[i]=sw[i]-res[i];
-#if 0
+#if 1
       /* Perform adaptive codebook search (pitch prediction) */
       overlap_cb_search(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
                         &exc[-120], 100, &gain[0], &pitch, st->lpcSize,
@@ -267,6 +281,7 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
       /* Perform stochastic codebook search */
 
       residue_zero(target, st->interp_qlpc, exc, st->subframeSize, st->lpcSize);
+      residue_zero(target, st->bw_lpc2, exc, st->subframeSize, st->lpcSize);
       syn_filt_zero(exc, st->bw_lpc1, exc, st->subframeSize, st->lpcSize);
 
       /* Final signal synthesis from excitation */
index ae8526e..616aa52 100644 (file)
@@ -56,8 +56,10 @@ typedef struct EncState {
    float *interp_qlpc;    /* Interpolated quantized LPCs */
    float *bw_lpc1;        /* LPCs after bandwidth expansion by gamma1 for perceptual weighting*/
    float *bw_lpc2;        /* LPCs after bandwidth expansion by gamma2 for perceptual weighting*/
+   float *bw_az;          /* Convolution of bw_lpc2 and interp_qlpc */
    float *rc;             /* Reflection coefficients */
    float *mem1, *mem2, *mem3, *mem4, *mem5, *mem6, *mem7;
+   float *dmem1, *dmem2;
 } EncState;
 
 typedef struct DecState {