Fixes a bug in the handling of the first packet after DTX
[opus.git] / src_SigProc_FIX / SKP_Silk_A2NLSF.c
index 23c1760..592c88c 100644 (file)
@@ -1,5 +1,5 @@
 /***********************************************************************\r
-Copyright (c) 2006-2010, Skype Limited. All rights reserved. \r
+Copyright (c) 2006-2011, Skype Limited. All rights reserved. \r
 Redistribution and use in source and binary forms, with or without \r
 modification, (subject to the limitations in the disclaimer below) \r
 are permitted provided that the following conditions are met:\r
@@ -34,9 +34,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "SKP_Silk_SigProc_FIX.h"\r
 \r
 /* Number of binary divisions, when not in low complexity mode */\r
-#define BIN_DIV_STEPS_A2NLSF_FIX      2 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */\r
+#define BIN_DIV_STEPS_A2NLSF_FIX      3 /* must be no higher than 16 - log2( LSF_COS_TAB_SZ_FIX ) */\r
 #define QPoly                        16\r
-#define MAX_ITERATIONS_A2NLSF_FIX    50\r
+#define MAX_ITERATIONS_A2NLSF_FIX    30\r
 \r
 /* Flag for using 2x as many cosine sampling points, reduces the risk of missing a root */\r
 #define OVERSAMPLE_COSINE_TABLE       0\r
@@ -61,7 +61,7 @@ SKP_INLINE void SKP_Silk_A2NLSF_trans_poly(
 /* Polynomial evaluation                             */\r
 SKP_INLINE SKP_int32 SKP_Silk_A2NLSF_eval_poly(    /* return the polynomial evaluation, in QPoly */\r
     SKP_int32        *p,    /* I    Polynomial, QPoly        */\r
-    const SKP_int32    x,   /* I    Evaluation point, Q12    */\r
+    const SKP_int32   x,    /* I    Evaluation point, Q12    */\r
     const SKP_int    dd     /* I    Order                    */\r
 )\r
 {\r
@@ -78,9 +78,9 @@ SKP_INLINE SKP_int32 SKP_Silk_A2NLSF_eval_poly(    /* return the polynomial eval
 \r
 SKP_INLINE void SKP_Silk_A2NLSF_init(\r
      const SKP_int32    *a_Q16,\r
-     SKP_int32            *P, \r
-     SKP_int32            *Q, \r
-     const SKP_int        dd\r
+     SKP_int32          *P, \r
+     SKP_int32          *Q, \r
+     const SKP_int      dd\r
 ) \r
 {\r
     SKP_int k;\r
@@ -117,7 +117,7 @@ SKP_INLINE void SKP_Silk_A2NLSF_init(
 /* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients        */\r
 /* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence.    */\r
 void SKP_Silk_A2NLSF(\r
-    SKP_int          *NLSF,                 /* O    Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d]    */\r
+    SKP_int16        *NLSF,                 /* O    Normalized Line Spectral Frequencies, Q15 (0 - (2^15-1)), [d]    */\r
     SKP_int32        *a_Q16,                /* I/O  Monic whitening filter coefficients in Q16 [d]                   */\r
     const SKP_int    d                      /* I    Filter order (must be even)                                      */\r
 )\r
@@ -210,9 +210,9 @@ void SKP_Silk_A2NLSF(
                 ffrac += SKP_DIV32( ylo, SKP_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) );\r
             }\r
 #if OVERSAMPLE_COSINE_TABLE\r
-            NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 7 ) + ffrac, SKP_int16_MAX ); \r
+            NLSF[ root_ix ] = (SKP_int16)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 7 ) + ffrac, SKP_int16_MAX ); \r
 #else\r
-            NLSF[ root_ix ] = (SKP_int)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 8 ) + ffrac, SKP_int16_MAX ); \r
+            NLSF[ root_ix ] = (SKP_int16)SKP_min_32( SKP_LSHIFT( (SKP_int32)k, 8 ) + ffrac, SKP_int16_MAX ); \r
 #endif\r
 \r
             SKP_assert( NLSF[ root_ix ] >=     0 );\r
@@ -249,15 +249,15 @@ void SKP_Silk_A2NLSF(
                 i++;\r
                 if( i > MAX_ITERATIONS_A2NLSF_FIX ) {\r
                     /* Set NLSFs to white spectrum and exit */\r
-                    NLSF[ 0 ] = SKP_DIV32_16( 1 << 15, d + 1 );\r
+                    NLSF[ 0 ] = (SKP_int16)SKP_DIV32_16( 1 << 15, d + 1 );\r
                     for( k = 1; k < d; k++ ) {\r
-                        NLSF[ k ] = SKP_SMULBB( k + 1, NLSF[ 0 ] );\r
+                        NLSF[ k ] = (SKP_int16)SKP_SMULBB( k + 1, NLSF[ 0 ] );\r
                     }\r
                     return;\r
                 }\r
 \r
                 /* Error: Apply progressively more bandwidth expansion and run again */\r
-                SKP_Silk_bwexpander_32( a_Q16, d, 65536 - SKP_SMULBB( 66, i ) ); // 66_Q16 = 0.001\r
+                SKP_Silk_bwexpander_32( a_Q16, d, 65536 - SKP_SMULBB( 10 + i, i ) ); // 10_Q16 = 0.00015\r
 \r
                 SKP_Silk_A2NLSF_init( a_Q16, P, Q, dd );\r
                 p = P;                            /* Pointer to polynomial */\r
@@ -268,9 +268,9 @@ void SKP_Silk_A2NLSF(
                     NLSF[ 0 ] = 0;\r
                     p = Q;                        /* Pointer to polynomial */\r
                     ylo = SKP_Silk_A2NLSF_eval_poly( p, xlo, dd );\r
-                    root_ix = 1;                /* Index of current root */\r
+                    root_ix = 1;                  /* Index of current root */\r
                 } else {\r
-                    root_ix = 0;                /* Index of current root */\r
+                    root_ix = 0;                  /* Index of current root */\r
                 }\r
                 k = 1;                            /* Reset loop counter */\r
             }\r