Fixed interpolation bugs, ...
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 4 Apr 2002 23:36:21 +0000 (23:36 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Thu, 4 Apr 2002 23:36:21 +0000 (23:36 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3218 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/sb_celp.c
libspeex/sb_celp.h

index 6bb4907..e814bb6 100644 (file)
 #include "lsp.h"
 #include <stdio.h>
 #include "stack_alloc.h"
+#include "cb_search.h"
 
 #ifndef M_PI
 #define M_PI           3.14159265358979323846  /* pi */
 #endif
 
+extern float stoc[];
+
 #define sqr(x) ((x)*(x))
 
 #if 0
@@ -154,10 +157,10 @@ void sb_encoder_init(SBEncState *st, SpeexMode *mode)
    st->subframeSize = 40;
    st->nbSubframes = 4;
    st->windowSize = mode->windowSize;
-   st->lpcSize=8;
+   st->lpcSize=12;
 
-   st->lag_factor = .01;
-   st->lpc_floor = 1.001;
+   st->lag_factor = .002;
+   st->lpc_floor = 1.0001;
    st->gamma1=.9;
    st->gamma2=.6;
    st->first=1;
@@ -181,6 +184,7 @@ void sb_encoder_init(SBEncState *st, SpeexMode *mode)
    st->exc=st->excBuf+st->frame_size;
 
    st->res=calloc(st->frame_size, sizeof(float));
+   st->sw=calloc(st->frame_size, sizeof(float));
    st->target=calloc(st->frame_size, sizeof(float));
    st->window=calloc(st->windowSize, sizeof(float));
    for (i=0;i<st->windowSize;i++)
@@ -227,6 +231,7 @@ void sb_encoder_destroy(SBEncState *st)
    free(st->buf);
    free(st->window);
    free(st->excBuf);
+   free(st->sw);
    free(st->res);
    free(st->target);
    free(st->lagWindow);
@@ -318,12 +323,15 @@ void sb_encode(SBEncState *st, float *in, FrameBits *bits)
    
    for (sub=0;sub<st->nbSubframes;sub++)
    {
-      float *exc, *sp, *mem, tmp;
+      float *exc, *sp, *mem, *res, *target, *sw, tmp;
       int offset;
       
       offset = st->subframeSize*sub;
       sp=st->high+offset;
-      exc=st->exc+offset;
+      exc=st->excBuf+offset;
+      res=st->res+offset;
+      target=st->target+offset;
+      sw=st->sw+offset;
 
       mem=PUSH(st->stack, st->lpcSize);
       
@@ -345,7 +353,7 @@ void sb_encode(SBEncState *st, float *in, FrameBits *bits)
 
       bw_lpc(st->gamma1, st->interp_lpc, st->bw_lpc1, st->lpcSize);
       bw_lpc(st->gamma2, st->interp_lpc, st->bw_lpc2, st->lpcSize);
-      
+#if 0
       for (i=0;i<st->lpcSize;i++)
          mem[i]=st->mem_sp[i];
       residue_mem(sp, st->interp_qlpc, exc, st->subframeSize, st->lpcSize, mem);
@@ -368,8 +376,95 @@ void sb_encode(SBEncState *st, float *in, FrameBits *bits)
             printf (" %f", exc[i]);
          printf ("\n");
       }
+#else
+      /* Reset excitation */
+      for (i=0;i<st->subframeSize;i++)
+         exc[i]=0;
+
+      /* Compute zero response of A(z/g1) / ( A(z/g2) * Aq(z) ) */
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sp[i];
+      syn_filt_mem(exc, st->interp_qlpc, exc, st->subframeSize, st->lpcSize, mem);
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sp[i];
+      residue_mem(exc, st->bw_lpc1, res, st->subframeSize, st->lpcSize, mem);
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sw[i];
+      syn_filt_mem(res, st->bw_lpc2, res, st->subframeSize, st->lpcSize, mem);
+
+      /* Compute weighted signal */
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sp[i];
+      residue_mem(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize, mem);
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sw[i];
+      syn_filt_mem(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, mem);
+
+      /* Compute target signal */
+      for (i=0;i<st->subframeSize;i++)
+         target[i]=sw[i]-res[i];
+      if (0)
+      {
+         syn_filt_zero(target, st->bw_lpc1, exc, st->subframeSize, st->lpcSize);
+         residue_zero(exc, st->interp_qlpc, exc, st->subframeSize, st->lpcSize);
+         residue_zero(exc, st->bw_lpc2, exc, st->subframeSize, st->lpcSize);
+         printf ("exca");
+         for (i=0;i<st->subframeSize;i++)
+            printf (" %f", exc[i]);
+         printf ("\n");
+      } else {
+         int ind,k,N=1;
+         float gain;
+         for (i=0;i<st->subframeSize;i++)
+            exc[i]=0;
+#if 1
+         overlap_cb_search(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
+                           &stoc[0], 512, &gain, &ind, st->lpcSize,
+                           st->subframeSize);
+         for (i=0;i<st->subframeSize;i++)
+            exc[i]=gain*stoc[ind+i];
+#else
+for (k=0;k<N;k++)
+         {
+            int of=k*st->subframeSize/N;
+         overlap_cb_search(target+of, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
+                           &stoc[0], 512, &gain, &ind, st->lpcSize,
+                           st->subframeSize/N);
+         for (i=0;i<st->subframeSize;i++)
+            res[i]=0;
+         for (i=0;i<st->subframeSize/N;i++)
+            res[of+i]=gain*stoc[ind+i];
+         residue_zero(res, st->bw_lpc1, res, st->subframeSize, st->lpcSize);
+         syn_filt_zero(res, st->interp_qlpc, res, st->subframeSize, st->lpcSize);
+         syn_filt_zero(res, st->bw_lpc2, res, st->subframeSize, st->lpcSize);
+         for (i=0;i<st->subframeSize;i++)
+            target[i]-=res[i];
+         for (i=0;i<st->subframeSize/N;i++)
+            exc[of+i]+=gain*stoc[ind+i];
+         }
+
+#endif
+      }
+#endif
+
+      printf ("sp");
+      for (i=0;i<st->subframeSize;i++)
+         printf (" %f", sp[i]);
+      printf("\n");
+      printf ("lpc");
+      for (i=0;i<st->lpcSize;i++)
+         printf (" %f", st->interp_lpc[i]);
+      printf("\n");
+      /*Keep the previous memory*/
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sp[i];
+      /* Final signal synthesis from excitation */
       syn_filt_mem(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
 
+      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
+      residue_mem(sp, st->bw_lpc1, sw, st->subframeSize, st->lpcSize, mem);
+      syn_filt_mem(sw, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw);
+
       POP(st->stack);
    }
 
@@ -387,5 +482,10 @@ void sb_encode(SBEncState *st, float *in, FrameBits *bits)
    for (i=0;i<st->full_frame_size;i++)
       in[i]=2*(st->y0[i]-st->y1[i]);
 
+   for (i=0;i<st->lpcSize;i++)
+      st->old_lsp[i] = st->lsp[i];
+   for (i=0;i<st->lpcSize;i++)
+      st->old_qlsp[i] = st->qlsp[i];
+
    st->first=0;
 }
index 5c678d9..ac3fe43 100644 (file)
@@ -49,6 +49,7 @@ typedef struct SBEncState {
    float *exc;
    float *buf;
    float *res;
+   float *sw;
    float *target;
    float *window;
    float *lagWindow;