Compute impulse response of "perceptual synthesis filter" globally and
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 23 Oct 2002 16:35:37 +0000 (16:35 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 23 Oct 2002 16:35:37 +0000 (16:35 +0000)
use it in pitch prediction to reduce some calculations.

git-svn-id: http://svn.xiph.org/trunk/speex@4041 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/cb_search.c
libspeex/cb_search.h
libspeex/ltp.c
libspeex/ltp.h
libspeex/modes.h
libspeex/nb_celp.c
libspeex/sb_celp.c

index 85d00a7..af85375 100644 (file)
@@ -60,6 +60,7 @@ void *par,                      /* Codebook/search parameters*/
 int   p,                        /* number of LPC coeffs */
 int   nsf,                      /* number of samples in subframe */
 float *exc,
+float *r,
 SpeexBits *bits,
 float *stack,
 int   complexity
@@ -67,7 +68,7 @@ int   complexity
 {
    int i,j,k,m,n,q;
    float *resp;
-   float *t, *r, *e, *E;
+   float *t, *e, *E;
    /*FIXME: Should make this dynamic*/
    float *tmp, *_ot[20], *_nt[20];
    float *ndist, *odist;
@@ -101,7 +102,6 @@ int   complexity
    have_sign = params->have_sign;
    resp = PUSH(stack, shape_cb_size*subvect_size);
    t = PUSH(stack, nsf);
-   r = PUSH(stack, nsf);
    e = PUSH(stack, nsf);
    E = PUSH(stack, shape_cb_size);
    /*FIXME: This breaks if sizeof(int) != sizeof(float) */
@@ -141,11 +141,6 @@ int   complexity
    for (i=0;i<nsf;i++)
       t[i]=target[i];
 
-   e[0]=1;
-   for (i=1;i<nsf;i++)
-      e[i]=0;
-   syn_percep_zero(e, ak, awk1, awk2, r, nsf,p, stack);
-
    /* Pre-compute codewords response and energy */
    for (i=0;i<shape_cb_size;i++)
    {
@@ -380,6 +375,7 @@ void *par,                      /* Codebook/search parameters*/
 int   p,                        /* number of LPC coeffs */
 int   nsf,                      /* number of samples in subframe */
 float *exc,
+float *r,
 SpeexBits *bits,
 float *stack,
 int   complexity
index 1709ac9..a2b8512 100644 (file)
@@ -53,6 +53,7 @@ void *par,                      /* Codebook/search parameters*/
 int   p,                        /* number of LPC coeffs */
 int   nsf,                      /* number of samples in subframe */
 float *exc,
+float *r,
 SpeexBits *bits,
 float *stack,
 int   complexity
@@ -76,6 +77,7 @@ void *par,                      /* Codebook/search parameters*/
 int   p,                        /* number of LPC coeffs */
 int   nsf,                      /* number of samples in subframe */
 float *exc,
+float *r,
 SpeexBits *bits,
 float *stack,
 int   complexity
index d06d73b..23a3b30 100644 (file)
@@ -151,6 +151,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int  *cdbk_index
 )
 {
@@ -164,6 +165,7 @@ int  *cdbk_index
    int   gain_cdbk_size;
    float *gain_cdbk;
    float err1,err2;
+
    ltp_params *params;
    params = (ltp_params*) par;
    gain_cdbk=params->gain_cdbk;
@@ -179,7 +181,7 @@ int  *cdbk_index
    e[1]=tmp2+nsf;
    e[2]=tmp2+2*nsf;
    
-   for (i=0;i<3;i++)
+   for (i=2;i>=0;i--)
    {
       int pp=pitch+1-i;
       for (j=0;j<nsf;j++)
@@ -192,7 +194,15 @@ int  *cdbk_index
             e[i][j]=0;
       }
 
-      syn_percep_zero(e[i], ak, awk1, awk2, x[i], nsf, p, stack);
+      if (i==2)
+         syn_percep_zero(e[i], ak, awk1, awk2, x[i], nsf, p, stack);
+      else {
+         for (j=0;j<nsf-1;j++)
+            x[i][j+1]=x[i+1][j];
+         x[i][0]=0;
+         for (j=0;j<nsf;j++)
+            x[i][j]+=e[i][0]*r[j];
+      }
    }
 
    for (i=0;i<3;i++)
@@ -327,6 +337,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int complexity
 )
 {
@@ -362,7 +373,7 @@ int complexity
       for (j=0;j<nsf;j++)
          exc[j]=0;
       err=pitch_gain_search_3tap(target, ak, awk1, awk2, exc, par, pitch, p, nsf,
-                                 bits, stack, exc2, &cdbk_index);
+                                 bits, stack, exc2, r, &cdbk_index);
       if (err<best_err || best_err<0)
       {
          for (j=0;j<nsf;j++)
@@ -453,8 +464,14 @@ int lost)
          {
             if (j-pp<0)
                e[i][j]=exc[j-pp];
-            else
+            else if (j-pp-pitch<0)
                e[i][j]=exc[j-pp-pitch];
+            else
+               e[i][j]=0;
+         /*if (j-pp<0)
+               e[i][j]=exc[j-pp];
+            else
+            e[i][j]=exc[j-pp-pitch];*/
          }
       }
       for (i=0;i<nsf;i++)
@@ -481,6 +498,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int complexity
 )
 {
index 4230eb3..819f240 100644 (file)
@@ -60,6 +60,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int   complexity
 );
 
@@ -91,6 +92,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int  *cdbk_index
 );
 
@@ -112,6 +114,7 @@ int   nsf,                      /* Number of samples in subframe */
 SpeexBits *bits,
 float *stack,
 float *exc2,
+float *r,
 int complexity
 );
 
index d1a2e1c..59874b3 100644 (file)
@@ -57,7 +57,7 @@ typedef void (*lsp_unquant_func)(float *, int, SpeexBits *);
 /** Long-term predictor quantization */
 typedef int (*ltp_quant_func)(float *, float *, float *, float *, 
                               float *, float *, void *, int, int, float, 
-                              int, int, SpeexBits*, float *, float *, int);
+                              int, int, SpeexBits*, float *, float *, float *, int);
 
 /** Long-term un-quantize */
 typedef void (*ltp_unquant_func)(float *, int, int, float, void *, int, int *,
@@ -66,7 +66,7 @@ typedef void (*ltp_unquant_func)(float *, int, int, float, void *, int, int *,
 
 /** Innovation quantization function */
 typedef void (*innovation_quant_func)(float *, float *, float *, float *, void *, int, int, 
-                                      float *, SpeexBits *, float *, int);
+                                      float *, float *, SpeexBits *, float *, int);
 
 /** Innovation unquantization function */
 typedef void (*innovation_unquant_func)(float *, void *, int, SpeexBits*, float *);
index aa38f08..916fa20 100644 (file)
@@ -217,6 +217,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
    float delta_qual=0;
    float *res, *target, *mem;
    float *stack;
+   float *syn_resp;
 
    st=state;
    stack=st->stack;
@@ -442,6 +443,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
    res = PUSH(stack, st->subframeSize);
    /* Target signal */
    target = PUSH(stack, st->subframeSize);
+   syn_resp = PUSH(stack, st->subframeSize);
    mem = PUSH(stack, st->lpcSize);
 
    /* Loop on sub-frames */
@@ -506,6 +508,11 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
             st->bw_lpc2[i]=0;
       }
 
+      for (i=0;i<st->subframeSize;i++)
+         exc[i]=0;
+      exc[0]=1;
+      syn_percep_zero(exc, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, syn_resp, st->subframeSize, st->lpcSize, stack);
+
       /* Reset excitation */
       for (i=0;i<st->subframeSize;i++)
          exc[i]=0;
@@ -567,7 +574,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
          pitch = SUBMODE(ltp_quant)(target, sw, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
                                     exc, SUBMODE(ltp_params), pit_min, pit_max, ol_pitch_coef,
                                     st->lpcSize, st->subframeSize, bits, stack, 
-                                    exc2, st->complexity);
+                                    exc2, syn_resp, st->complexity);
 
          /*printf ("cl_pitch: %d\n", pitch);*/
          st->pitch[sub]=pitch;
@@ -651,7 +658,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
             /* Normal quantization */
             SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, 
                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
-                                      innov, bits, stack, st->complexity);
+                                      innov, syn_resp, bits, stack, st->complexity);
             for (i=0;i<st->subframeSize;i++)
                innov[i]*=ener;
             for (i=0;i<st->subframeSize;i++)
@@ -669,7 +676,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
                target[i]*=2.2;
             SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, 
                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
-                                      innov2, bits, tmp_stack, st->complexity);
+                                      innov2, syn_resp, bits, tmp_stack, st->complexity);
             for (i=0;i<st->subframeSize;i++)
                innov2[i]*=ener*(1/2.2);
             for (i=0;i<st->subframeSize;i++)
index 671cbc3..5a318e8 100644 (file)
@@ -270,7 +270,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    SBEncState *st;
    int i, roots, sub;
    float *stack;
-   float *mem, *innov;
+   float *mem, *innov, *syn_resp;
 
    st = state;
    stack=st->stack;
@@ -395,6 +395,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    }
    
    mem=PUSH(stack, st->lpcSize);
+   syn_resp=PUSH(stack, st->subframeSize);
    innov = PUSH(stack, st->subframeSize);
 
    for (sub=0;sub<st->nbSubframes;sub++)
@@ -516,6 +517,11 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
             }
          }
 
+         for (i=0;i<st->subframeSize;i++)
+            exc[i]=0;
+         exc[0]=1;
+         syn_percep_zero(exc, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, syn_resp, st->subframeSize, st->lpcSize, stack);
+         
          /* Reset excitation */
          for (i=0;i<st->subframeSize;i++)
             exc[i]=0;
@@ -569,7 +575,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
          /*print_vec(target, st->subframeSize, "\ntarget");*/
          SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, 
                                    SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
-                                   innov, bits, stack, (st->complexity+1)>>1);
+                                   innov, syn_resp, bits, stack, (st->complexity+1)>>1);
          /*print_vec(target, st->subframeSize, "after");*/
 
          for (i=0;i<st->subframeSize;i++)
@@ -584,7 +590,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
                target[i]*=2.5;
             SUBMODE(innovation_quant)(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2, 
                                       SUBMODE(innovation_params), st->lpcSize, st->subframeSize, 
-                                      innov2, bits, tmp_stack, (st->complexity+1)>>1);
+                                      innov2, syn_resp, bits, tmp_stack, (st->complexity+1)>>1);
             for (i=0;i<st->subframeSize;i++)
                innov2[i]*=scale*(1/2.5);
             for (i=0;i<st->subframeSize;i++)