Fixed (hopefully) once and for all the LSP root-finding problem. We now
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 2 Oct 2002 04:24:37 +0000 (04:24 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 2 Oct 2002 04:24:37 +0000 (04:24 +0000)
try twice and if it still fails, we "create" a flat filter.

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

libspeex/lsp.c
libspeex/nb_celp.c
libspeex/sb_celp.c
libspeex/speex.h

index d1d71bf..02822f1 100644 (file)
@@ -179,8 +179,13 @@ 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)){
+           float dd;
            /* Modified by JMV to provide smaller steps around x=+-1 */
-           xr = xl - (delta*(1-.9*xl*xl)) ;                    /* interval spacing     */
+           dd=(delta*(1-.9*xl*xl));
+           if (fabs(psuml)<.2)
+              dd *= .5;
+
+           xr = xl - dd;                               /* interval spacing     */
            psumr = cheb_poly_eva(pt,xr,lpcrdr,stack);/* poly(xl-delta_x)       */
            temp_psumr = psumr;
            temp_xr = xr;
index 20921a9..5052126 100644 (file)
@@ -236,13 +236,22 @@ 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, 10, 0.01, st->stack);
+   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 15, 0.2, st->stack);
    if (roots!=st->lpcSize)
    {
-      fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);
-      exit(1);
+      roots = lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 11, 0.02, st->stack);
+      if (roots!=st->lpcSize) {
+         /*fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);*/
+
+         /*If we can't find all LSP's, do some damage control and use a flat filter*/
+         for (i=0;i<st->lpcSize;i++)
+         {
+            st->lsp[i]=cos(M_PI*((float)(i+1))/(st->lpcSize+1));
+         }
+      }
    }
 
+
    /* LSP x-domain to angle domain*/
    for (i=0;i<st->lpcSize;i++)
       st->lsp[i] = acos(st->lsp[i]);
index 66c790e..7f4393a 100644 (file)
@@ -303,11 +303,19 @@ 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.01, st->stack);
+   roots=lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 15, 0.2, st->stack);
    if (roots!=st->lpcSize)
    {
-      fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);
-      exit(1);
+      roots = lpc_to_lsp (st->lpc, st->lpcSize, st->lsp, 11, 0.02, st->stack);
+      if (roots!=st->lpcSize) {
+         /*fprintf (stderr, "roots!=st->lpcSize (found only %d roots)\n", roots);*/
+
+         /*If we can't find all LSP's, do some damage control and use a flat filter*/
+         for (i=0;i<st->lpcSize;i++)
+         {
+            st->lsp[i]=cos(M_PI*((float)(i+1))/(st->lpcSize+1));
+         }
+      }
    }
 
    /* x-domain to angle domain*/
index 69d6ee7..068969c 100644 (file)
@@ -79,6 +79,14 @@ extern "C" {
 /** Get current bit-rate used by the encoder or decoder */
 #define SPEEX_GET_BITRATE 19
 
+/**Define a handler function for in-band Speex request*/
+#define SPEEX_SET_HANDLER 20
+
+
+/**Define a handler function for in-band user-defined request*/
+#define SPEEX_SET_USER_HANDLER 22
+
+
 
 /* Preserving compatibility:*/
 /** Equivalent to SPEEX_SET_ENH */