Saturates the last RC to 0.99 when Schur blows up
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 17 May 2013 03:09:34 +0000 (23:09 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 17 May 2013 03:14:46 +0000 (23:14 -0400)
This is a follow-up on ac76b15. When Schur blows up, we set the last RC to
+/- 0.99 instead of eliminating it.

silk/fixed/schur64_FIX.c
silk/fixed/schur_FIX.c

index c75f96a..1701d5b 100644 (file)
@@ -58,6 +58,12 @@ opus_int32 silk_schur64(                            /* O    returns residual ene
     for( k = 0; k < order; k++ ) {
         /* Check that we won't be getting an unstable rc, otherwise stop here. */
         if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) {
+           if ( C[ k + 1 ][ 0 ] > 0 ) {
+              rc_Q16[ k ] = -SILK_FIX_CONST( .99f, 16 );
+           } else {
+              rc_Q16[ k ] = SILK_FIX_CONST( .99f, 16 );
+           }
+           k++;
            break;
         }
 
index 788ad3f..37dc42c 100644 (file)
@@ -70,6 +70,12 @@ opus_int32 silk_schur(                              /* O    Returns residual ene
     for( k = 0; k < order; k++ ) {
         /* Check that we won't be getting an unstable rc, otherwise stop here. */
         if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) {
+           if ( C[ k + 1 ][ 0 ] > 0 ) {
+              rc_Q15[ k ] = -SILK_FIX_CONST( .99f, 15 );
+           } else {
+              rc_Q15[ k ] = SILK_FIX_CONST( .99f, 15 );
+           }
+           k++;
            break;
         }