speeded up lpc_to_lsp and open-loop pitch estimation
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 27 Aug 2002 07:29:56 +0000 (07:29 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 27 Aug 2002 07:29:56 +0000 (07:29 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3880 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters.c
libspeex/filters.h
libspeex/lsp.c
libspeex/ltp.c
libspeex/modes.c
libspeex/nb_celp.c
libspeex/sb_celp.c

index b47c12d..cfdf8c9 100644 (file)
@@ -157,15 +157,6 @@ void pole_zero_mem(float *x, float *num, float *den, float *y, int N, int ord, f
    POP(stack);
 }
 
-float xcorr(float *x, float *y, int len)
-{
-   int i;
-   float sum=0;
-   for (i=0;i<len;i++)
-      sum += x[i]*y[i];
-   return sum;
-}
-
 
 /*
 void fir_mem(float *x, float *a, float *y, int N, int M, float *mem)
index 512bd18..ba09dff 100644 (file)
@@ -50,9 +50,6 @@ 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);
 
-/* Cross correlation */
-float xcorr(float *x, float *y, int len);
-
 /* FIR filter */
 void fir_mem(float *x, float *a, float *y, int N, int M, float *mem);
 
index 48810e7..d1d71bf 100644 (file)
@@ -179,7 +179,8 @@ int lpc_to_lsp (float *a,int lpcrdr,float *freq,int nb,float delta, float *stack
        psuml = cheb_poly_eva(pt,xl,lpcrdr,stack);      /* evals poly. at xl    */
        flag = 1;
        while(flag && (xr >= -1.0)){
-           xr = xl - delta ;                   /* interval spacing     */
+           /* Modified by JMV to provide smaller steps around x=+-1 */
+           xr = xl - (delta*(1-.9*xl*xl)) ;                    /* interval spacing     */
            psumr = cheb_poly_eva(pt,xr,lpcrdr,stack);/* poly(xl-delta_x)       */
            temp_psumr = psumr;
            temp_xr = xr;
index f32b03f..ef2f31f 100644 (file)
 #include "filters.h"
 #include "speex_bits.h"
 
-#define abs(x) ((x)<0 ? -(x) : (x))
+
+static float inner_prod(float *x, float *y, int len)
+{
+   int i;
+   float sum1=0,sum2=0,sum3=0,sum4=0;
+   for (i=0;i<len;)
+   {
+      sum1 += x[i]*y[i];
+      sum2 += x[i+1]*y[i+1];
+      sum3 += x[i+2]*y[i+2];
+      sum4 += x[i+3]*y[i+3];
+      i+=4;
+   }
+   return sum1+sum2+sum3+sum4;
+}
+
+/*Original, non-optimized version*/
+/*static float inner_prod(float *x, float *y, int len)
+{
+   int i;
+   float sum=0;
+   for (i=0;i<len;i++)
+      sum += x[i]*y[i];
+   return sum;
+}
+*/
 
 
 void open_loop_nbest_pitch(float *sw, int start, int end, int len, int *pitch, float *gain, int N, float *stack)
 {
    int i,j,k;
-   float corr;
+   float corr=0;
    float energy;
-   float score, *best_score;
+   float score=0, *best_score;
    float e0;
 
    best_score = PUSH(stack,N);
    for (i=0;i<N;i++)
         best_score[i]=-1;
-   energy=xcorr(sw-start, sw-start, len);
-   e0=xcorr(sw, sw, len);
+   energy=inner_prod(sw-start, sw-start, len);
+   e0=inner_prod(sw, sw, len);
    for (i=start;i<=end;i++)
    {
-      corr=xcorr(sw, sw-i, len);
-      score=corr*corr/(energy+1);
+      if (0&&score < .3*best_score[N-1])
+         score = .9*best_score[N-1];
+      else
+      {
+         corr=inner_prod(sw, sw-i, len);
+         score=corr*corr/(energy+1);
+      }
       if (score>best_score[N-1])
       {
          float g1, g;
@@ -146,11 +176,11 @@ int  *cdbk_index
    }
 
    for (i=0;i<3;i++)
-      corr[i]=xcorr(x[i],target,nsf);
+      corr[i]=inner_prod(x[i],target,nsf);
    
    for (i=0;i<3;i++)
       for (j=0;j<=i;j++)
-         A[i][j]=A[j][i]=xcorr(x[i],x[j],nsf);
+         A[i][j]=A[j][i]=inner_prod(x[i],x[j],nsf);
    
    {
       int j;
index 7454ee4..3331b0d 100644 (file)
@@ -294,7 +294,7 @@ static SpeexNBMode nb_mode = {
    144,    /*pitchEnd*/
    0.9,    /*gamma1*/
    0.6,    /*gamma2*/
-   .005,   /*lag_factor*/
+   .01,   /*lag_factor*/
    1.0001, /*lpc_floor*/
    0.0,    /*preemph*/
    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
index e11655e..5212653 100644 (file)
@@ -207,12 +207,12 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
       st->inBuf[st->bufSize-st->frameSize+i] = in[i] - st->preemph*in[i-1];
    st->pre_mem = in[st->frameSize-1];
 
+   /* Move signals 1 frame towards the past */
    speex_move(st->exc2Buf, st->exc2Buf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
    speex_move(st->excBuf, st->excBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
    speex_move(st->swBuf, st->swBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
 
 
-
    /* Window for analysis */
    for (i=0;i<st->windowSize;i++)
       st->buf2[i] = st->frame[i] * st->window[i];
@@ -222,6 +222,7 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
 
    st->autocorr[0] += 10;        /* prevents NANs */
    st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
+
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
       st->autocorr[i] *= st->lagWindow[i];
@@ -231,14 +232,14 @@ void nb_encode(void *state, float *in, SpeexBits *bits)
    st->lpc[0]=1;
 
    /* LPC to LSPs (x-domain) transform */
-   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.002, st->stack);
+   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 10, 0.01, st->stack);
    if (roots!=st->lpcSize)
    {
       fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);
       exit(1);
    }
 
-   /* x-domain to angle domain*/
+   /* LSP x-domain to angle domain*/
    for (i=0;i<st->lpcSize;i++)
       st->lsp[i] = acos(st->lsp[i]);
    /*print_vec(st->lsp, 10, "LSP:");*/
index e9aea90..7b81522 100644 (file)
@@ -303,7 +303,7 @@ void sb_encode(void *state, float *in, SpeexBits *bits)
    st->lpc[0]=1;
 
    /* LPC to LSPs (x-domain) transform */
-   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.002, st->stack);
+   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 6, 0.01, st->stack);
    if (roots!=st->lpcSize)
    {
       fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);