Index: third_party/opus/src/silk/float/LPC_inv_pred_gain_FLP.c |
diff --git a/third_party/opus/src/silk/float/LPC_inv_pred_gain_FLP.c b/third_party/opus/src/silk/float/LPC_inv_pred_gain_FLP.c |
index 25178bacdde4610be09a31b59fff79b35f71e033..2be2122d61408afffb1dbfd8cd06723fb28229b9 100644 |
--- a/third_party/opus/src/silk/float/LPC_inv_pred_gain_FLP.c |
+++ b/third_party/opus/src/silk/float/LPC_inv_pred_gain_FLP.c |
@@ -31,8 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. |
#include "SigProc_FIX.h" |
#include "SigProc_FLP.h" |
- |
-#define RC_THRESHOLD 0.9999f |
+#include "define.h" |
/* compute inverse of LPC prediction gain, and */ |
/* test if LPC coefficients are stable (all poles within unit circle) */ |
@@ -43,34 +42,32 @@ silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction ga |
) |
{ |
opus_int k, n; |
- double invGain, rc, rc_mult1, rc_mult2; |
- silk_float Atmp[ 2 ][ SILK_MAX_ORDER_LPC ]; |
- silk_float *Aold, *Anew; |
+ double invGain, rc, rc_mult1, rc_mult2, tmp1, tmp2; |
+ silk_float Atmp[ SILK_MAX_ORDER_LPC ]; |
- Anew = Atmp[ order & 1 ]; |
- silk_memcpy( Anew, A, order * sizeof(silk_float) ); |
+ silk_memcpy( Atmp, A, order * sizeof(silk_float) ); |
invGain = 1.0; |
for( k = order - 1; k > 0; k-- ) { |
- rc = -Anew[ k ]; |
- if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { |
+ rc = -Atmp[ k ]; |
+ rc_mult1 = 1.0f - rc * rc; |
+ invGain *= rc_mult1; |
+ if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { |
return 0.0f; |
} |
- rc_mult1 = 1.0f - rc * rc; |
rc_mult2 = 1.0f / rc_mult1; |
- invGain *= rc_mult1; |
- /* swap pointers */ |
- Aold = Anew; |
- Anew = Atmp[ k & 1 ]; |
- for( n = 0; n < k; n++ ) { |
- Anew[ n ] = (silk_float)( ( Aold[ n ] - Aold[ k - n - 1 ] * rc ) * rc_mult2 ); |
+ for( n = 0; n < (k + 1) >> 1; n++ ) { |
+ tmp1 = Atmp[ n ]; |
+ tmp2 = Atmp[ k - n - 1 ]; |
+ Atmp[ n ] = (silk_float)( ( tmp1 - tmp2 * rc ) * rc_mult2 ); |
+ Atmp[ k - n - 1 ] = (silk_float)( ( tmp2 - tmp1 * rc ) * rc_mult2 ); |
} |
} |
- rc = -Anew[ 0 ]; |
- if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { |
- return 0.0f; |
- } |
+ rc = -Atmp[ 0 ]; |
rc_mult1 = 1.0f - rc * rc; |
invGain *= rc_mult1; |
+ if( invGain * MAX_PREDICTION_POWER_GAIN < 1.0f ) { |
+ return 0.0f; |
+ } |
return (silk_float)invGain; |
} |