| 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;
|
| }
|
|
|