Think I figuring out the filter stuff
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Feb 2002 17:29:06 +0000 (17:29 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 26 Feb 2002 17:29:06 +0000 (17:29 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3103 0101bb08-14d6-0310-b084-bc0e0c8e3800

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

index 551fd3b..7536ae0 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <stdlib.h>
 #include <cb_search.h>
+#include "filters.h"
 
 #define min(a,b) ((a) < (b) ? (a) : (b))
 
@@ -32,7 +33,8 @@
 void overlap_cb_search(
 float target[],                        /* target vector */
 float ak[],                    /* LPCs for this subframe */
-float awk[],                   /* Weighted LPCs for this subframe */
+float awk1[],                  /* Weighted LPCs for this subframe */
+float awk2[],                  /* Weighted LPCs for this subframe */
 float codebook[],              /* overlapping codebook */
 int   entries,                 /* number of overlapping entries to search */
 float *gain,                   /* gain of optimum entry */
@@ -50,64 +52,44 @@ int   nsf                       /* number of samples in subframe */
 
   /* Initialise */
   
-  resp = (float*)malloc(sizeof(float)*(p+nsf));
-  h = (float*)malloc(sizeof(float)*(p+nsf));
-  impulse = (float*)malloc(sizeof(float)*(p+nsf));
+  resp = (float*)malloc(sizeof(float)*nsf);
+  h = (float*)malloc(sizeof(float)*nsf);
+  impulse = (float*)malloc(sizeof(float)*nsf);
 
-  for(i=0; i<p+nsf; i++)
+  for(i=0; i<nsf; i++)
     impulse[i] = 0.0;
-  for(i=0; i<p; i++) {
-    h[i] = 0.0;
-    resp[i] = 0.0;
-  }  
    
   *gain = 0.0;
   *index = 0;
   bscore = 0.0;
-  impulse[p] = 1.0;
-
-  /*synthesis_filter(impulse,ak,nsf,p,&h[p]);*/
-  for (i=0;i<nsf;i++)
-  {
-     h[p+i] = impulse[p+i];
-     for (k=1;k<=p;k++)
-        h[p+i] += awk[k]*impulse[p+i-k] - ak[k]*h[p+i-k];
-  }
-
-  for (i=0;i<nsf;i++)
-  {
-     resp[p+i] = codebook[entries-1];
-     for (k=1;k<=min(p,i);k++)
-        resp[p+i] += awk[k]*codebook[entries-1+i-k];
-     for (k=1;k<p+1;k++)
-        resp[p+i] -= ak[k]*resp[p+i-k];
-  }
+  impulse[0] = 1.0;
 
-  /*synthesis_filter(&codebook[entries-1],ak,nsf,p,&resp[p]);  */  
+  /* 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);
+  
+  /* 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);
     
   /* Search codebook backwards using end correction for synthesis */
   
   for(k=entries-1; k>=0; k--) {
 
-     /*FIXME: This is horribly slow, but I've got problems with the faster version.
-      This loop should not be there at all once the bug is fixed*/
-     for (i=0;i<nsf;i++)
-     {
-        resp[p+i] = codebook[k];
-        for (j=1;j<=min(p,i);j++)
-           resp[p+i] += awk[j]*codebook[k+i-j];
-        for (j=1;j<p+1;j++)
-           resp[p+i] -= ak[j]*resp[p+i-j];
-     }
-
+     /* 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[p+i];
-      e += resp[p+i]*resp[p+i];
+      d += target[i]*resp[i];
+      e += resp[i]*resp[i]+1;
     }
     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;
@@ -118,8 +100,8 @@ int   nsf                       /* number of samples in subframe */
     
     if (k) {
       for(i=nsf-1; i>=1; i--)
-        resp[i+p] = resp[i+p-1] + codebook[k-1]*h[p+i];
-      resp[p] = codebook[k-1]*h[p];
+        resp[i] = resp[i-1] + codebook[k-1]*h[i];
+      resp[0] = codebook[k-1]*h[0];
     }
   }
 
index 777e8cf..dd3f08f 100644 (file)
@@ -23,7 +23,8 @@
 void overlap_cb_search(
 float target[],                        /* target vector */
 float ak[],                    /* LPCs for this subframe */
-float awk[],                   /* Weighted LPCs for this subframe */
+float awk1[],                  /* Weighted LPCs for this subframe */
+float awk2[],                  /* Weighted LPCs for this subframe */
 float codebook[],              /* overlapping codebook */
 int   entries,                 /* number of overlapping entries to search */
 float *gain,                   /* gain of optimum entry */
index 36da7a0..f6baf53 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "filters.h"
 
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
 void syn_filt(float *x, float *a, float *y, int N, int ord)
 {
    int i,j;
@@ -30,14 +32,66 @@ void syn_filt(float *x, float *a, float *y, int N, int ord)
    }
 }
 
+void syn_filt_zero(float *x, float *a, float *y, int N, int ord)
+{
+   int i,j;
+   for (i=0;i<N;i++)
+   {
+      y[i]=x[i];
+      for (j=1;j<=min(ord,i);j++)
+         y[i] -= a[j]*y[i-j];
+   }
+}
 
-void residue(float *x, float *a, float *y, int N, int ord)
+void syn_filt_mem(float *x, float *a, float *y, int N, int ord, float *mem)
 {
    int i,j;
    for (i=0;i<N;i++)
    {
       y[i]=x[i];
+      for (j=1;j<=min(ord,i);j++)
+         y[i] -= a[j]*y[i-j];
+      for (j=i+1;j<=ord;j++)
+         y[i] -= a[j]*mem[j-i-1];
+   }
+   for (i=0;i<ord;i++)
+      mem[i]=y[N-i-1];
+}
+
+
+void residue(float *x, float *a, float *y, int N, int ord)
+{
+   int i,j;
+   for (i=N-1;i>=0;i--)
+   {
+      y[i]=x[i];
       for (j=1;j<=ord;j++)
          y[i] += a[j]*x[i-j];
    }
 }
+
+void residue_zero(float *x, float *a, float *y, int N, int ord)
+{
+   int i,j;
+   for (i=N-1;i>=0;i--)
+   {
+      y[i]=x[i];
+      for (j=1;j<=min(ord,i);j++)
+         y[i] += a[j]*x[i-j];
+   }
+}
+
+void residue_mem(float *x, float *a, float *y, int N, int ord, float *mem)
+{
+   int i,j;
+   for (i=N-1;i>=0;i--)
+   {
+      y[i]=x[i];
+      for (j=1;j<=min(ord,i);j++)
+         y[i] += a[j]*x[i-j];
+      for (j=i+1;j<=ord;j++)
+         y[i] += a[j]*mem[j-i-1];
+   }
+   for (i=0;i<ord;i++)
+      mem[i]=x[N-i-1];
+}
index 0cf922c..d4e8de0 100644 (file)
 #define FILTERS_H
 
 void syn_filt(float *x, float *a, float *y, int N, int ord);
+void syn_filt_zero(float *x, float *a, float *y, int N, int ord);
+void syn_filt_mem(float *x, float *a, float *y, int N, int ord, float *mem);
 
 void residue(float *x, float *a, float *y, int N, int ord);
-
+void residue_zero(float *x, float *a, float *y, int N, int ord);
+void residue_mem(float *x, float *a, float *y, int N, int ord, float *mem);
 
 #endif
index 5189eba..08eaec3 100644 (file)
@@ -99,6 +99,14 @@ void encoder_init(EncState *st)
    st->interp_qlsp = malloc(st->lpcSize*sizeof(float));
    st->rc = malloc(st->lpcSize*sizeof(float));
    st->first = 1;
+   
+   st->mem1 = calloc(st->lpcSize, sizeof(float));
+   st->mem2 = calloc(st->lpcSize, sizeof(float));
+   st->mem3 = calloc(st->lpcSize, sizeof(float));
+   st->mem4 = calloc(st->lpcSize, sizeof(float));
+   st->mem5 = calloc(st->lpcSize, sizeof(float));
+   st->mem6 = calloc(st->lpcSize, sizeof(float));
+   st->mem7 = calloc(st->lpcSize, sizeof(float));
 }
 
 void encoder_destroy(EncState *st)
@@ -226,39 +234,47 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
          tmp *= st->gamma2;
       }
       /* Compute residue */
-      residue(sp, st->interp_qlpc, res, st->subframeSize, st->lpcSize);
+      /*residue(sp, st->interp_qlpc, res, st->subframeSize, st->lpcSize);*/
 
       /* Compute weighted signal */
-      residue(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize);
-      syn_filt(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize);
+      residue_mem(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize, st->mem1);
+
+      /*syn_filt(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize);*/
       
       /* Reset excitation */
       for (i=0;i<st->subframeSize;i++)
          exc[i]=0;
 
       /* Compute zero response of A(z/g1) / ( A(z/g2) * Aq(z) ) */
-      residue(exc, st->bw_lpc1, target, st->subframeSize, st->lpcSize);
-      syn_filt(target, st->bw_lpc2, target, st->subframeSize, st->lpcSize);
-      syn_filt(target, st->interp_qlpc, target, st->subframeSize, st->lpcSize);
+      residue_mem(exc, st->bw_lpc1, exc, st->subframeSize, st->lpcSize, st->mem2);
+      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->mem4);
 
       /* Compute target signal */
       for (i=0;i<st->subframeSize;i++)
-         target[i]=sw[i]-target[i];
-
-      /* Perform adaptive codebook search (pitch prediction) */
+         target[i]=sw[i]-res[i];
+
+      if (1) {
+         float gain;
+         int index;
+         /* Perform adaptive codebook search (pitch prediction) */
+         overlap_cb_search(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
+                           &exc[-120], 100, &gain, &index, st->lpcSize,
+                           st->subframeSize);
+         printf ("gain = %f, pitch = %d\n",gain, 120-index);
+      }
 
       /* Update target for adaptive codebook contribution */
       
       /* Perform stochastic codebook search */
 
-      /* Calculate the synthesis (coded) speech*/
-      syn_filt(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize);
+      /* I'm cheating! Computing excitation directly from target */
+      residue_zero(target, st->bw_lpc2, exc, st->subframeSize, st->lpcSize);
+      residue_zero(target, st->interp_qlpc, exc, st->subframeSize, st->lpcSize);
+      syn_filt_zero(exc, st->bw_lpc1, exc, st->subframeSize, st->lpcSize);
 
-#if 0
-      /* I'm cheating! */
-      residue(sw, st->bw_lpc2, sp, st->subframeSize, st->lpcSize);
-      syn_filt(sp, st->bw_lpc1, sp, st->subframeSize, st->lpcSize);
-#endif
+      /* Final signal synthesis from excitation */
+      syn_filt_mem(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem5);
 
    }
 
@@ -267,8 +283,10 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
       st->old_lsp[i] = st->lsp[i];
    for (i=0;i<st->lpcSize;i++)
       st->old_qlsp[i] = st->qlsp[i];
+
    /* The next frame will not by the first (Duh!) */
    st->first = 0;
+
    /* Replace input by synthesized speech */
    for (i=0;i<st->frameSize;i++)
      in[i]=st->frame[i];
index 5f3842c..ae8526e 100644 (file)
@@ -57,6 +57,7 @@ typedef struct EncState {
    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 *rc;             /* Reflection coefficients */
+   float *mem1, *mem2, *mem3, *mem4, *mem5, *mem6, *mem7;
 } EncState;
 
 typedef struct DecState {