Index: silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h |
diff --git a/silk/fixed/noise_shape_analysis_FIX.c b/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h |
similarity index 78% |
copy from silk/fixed/noise_shape_analysis_FIX.c |
copy to silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h |
index e24d2e9d338c95fe956866a128d025bde8798aba..c30481e43751dc00fea02593cf34302ed639779f 100644 |
--- a/silk/fixed/noise_shape_analysis_FIX.c |
+++ b/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h |
@@ -25,122 +25,12 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGE. |
***********************************************************************/ |
-#ifdef HAVE_CONFIG_H |
-#include "config.h" |
-#endif |
- |
-#include "main_FIX.h" |
-#include "stack_alloc.h" |
-#include "tuning_parameters.h" |
- |
-/* Compute gain to make warped filter coefficients have a zero mean log frequency response on a */ |
-/* non-warped frequency scale. (So that it can be implemented with a minimum-phase monic filter.) */ |
-/* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk we omit the first */ |
-/* coefficient in an array of coefficients, for monic filters. */ |
-static OPUS_INLINE opus_int32 warped_gain( /* gain in Q16*/ |
- const opus_int32 *coefs_Q24, |
- opus_int lambda_Q16, |
- opus_int order |
-) { |
- opus_int i; |
- opus_int32 gain_Q24; |
- |
- lambda_Q16 = -lambda_Q16; |
- gain_Q24 = coefs_Q24[ order - 1 ]; |
- for( i = order - 2; i >= 0; i-- ) { |
- gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); |
- } |
- gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); |
- return silk_INVERSE32_varQ( gain_Q24, 40 ); |
-} |
- |
-/* Convert warped filter coefficients to monic pseudo-warped coefficients and limit maximum */ |
-/* amplitude of monic warped coefficients by using bandwidth expansion on the true coefficients */ |
-static OPUS_INLINE void limit_warped_coefs( |
- opus_int32 *coefs_syn_Q24, |
- opus_int32 *coefs_ana_Q24, |
- opus_int lambda_Q16, |
- opus_int32 limit_Q24, |
- opus_int order |
-) { |
- opus_int i, iter, ind = 0; |
- opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; |
- opus_int32 nom_Q16, den_Q24; |
- |
- /* Convert to monic coefficients */ |
- lambda_Q16 = -lambda_Q16; |
- for( i = order - 1; i > 0; i-- ) { |
- coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); |
- coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); |
- } |
- lambda_Q16 = -lambda_Q16; |
- nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); |
- den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); |
- gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); |
- den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); |
- gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); |
- for( i = 0; i < order; i++ ) { |
- coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); |
- coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); |
- } |
- |
- for( iter = 0; iter < 10; iter++ ) { |
- /* Find maximum absolute value */ |
- maxabs_Q24 = -1; |
- for( i = 0; i < order; i++ ) { |
- tmp = silk_max( silk_abs_int32( coefs_syn_Q24[ i ] ), silk_abs_int32( coefs_ana_Q24[ i ] ) ); |
- if( tmp > maxabs_Q24 ) { |
- maxabs_Q24 = tmp; |
- ind = i; |
- } |
- } |
- if( maxabs_Q24 <= limit_Q24 ) { |
- /* Coefficients are within range - done */ |
- return; |
- } |
- |
- /* Convert back to true warped coefficients */ |
- for( i = 1; i < order; i++ ) { |
- coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); |
- coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); |
- } |
- gain_syn_Q16 = silk_INVERSE32_varQ( gain_syn_Q16, 32 ); |
- gain_ana_Q16 = silk_INVERSE32_varQ( gain_ana_Q16, 32 ); |
- for( i = 0; i < order; i++ ) { |
- coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); |
- coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); |
- } |
- |
- /* Apply bandwidth expansion */ |
- chirp_Q16 = SILK_FIX_CONST( 0.99, 16 ) - silk_DIV32_varQ( |
- silk_SMULWB( maxabs_Q24 - limit_Q24, silk_SMLABB( SILK_FIX_CONST( 0.8, 10 ), SILK_FIX_CONST( 0.1, 10 ), iter ) ), |
- silk_MUL( maxabs_Q24, ind + 1 ), 22 ); |
- silk_bwexpander_32( coefs_syn_Q24, order, chirp_Q16 ); |
- silk_bwexpander_32( coefs_ana_Q24, order, chirp_Q16 ); |
- |
- /* Convert to monic warped coefficients */ |
- lambda_Q16 = -lambda_Q16; |
- for( i = order - 1; i > 0; i-- ) { |
- coefs_syn_Q24[ i - 1 ] = silk_SMLAWB( coefs_syn_Q24[ i - 1 ], coefs_syn_Q24[ i ], lambda_Q16 ); |
- coefs_ana_Q24[ i - 1 ] = silk_SMLAWB( coefs_ana_Q24[ i - 1 ], coefs_ana_Q24[ i ], lambda_Q16 ); |
- } |
- lambda_Q16 = -lambda_Q16; |
- nom_Q16 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 16 ), -(opus_int32)lambda_Q16, lambda_Q16 ); |
- den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_syn_Q24[ 0 ], lambda_Q16 ); |
- gain_syn_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); |
- den_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), coefs_ana_Q24[ 0 ], lambda_Q16 ); |
- gain_ana_Q16 = silk_DIV32_varQ( nom_Q16, den_Q24, 24 ); |
- for( i = 0; i < order; i++ ) { |
- coefs_syn_Q24[ i ] = silk_SMULWW( gain_syn_Q16, coefs_syn_Q24[ i ] ); |
- coefs_ana_Q24[ i ] = silk_SMULWW( gain_ana_Q16, coefs_ana_Q24[ i ] ); |
- } |
- } |
- silk_assert( 0 ); |
-} |
/**************************************************************/ |
/* Compute noise shaping coefficients and initial gain values */ |
/**************************************************************/ |
+#define OVERRIDE_silk_noise_shape_analysis_FIX |
+ |
void silk_noise_shape_analysis_FIX( |
silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ |
silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control FIX */ |
@@ -309,7 +199,8 @@ void silk_noise_shape_analysis_FIX( |
tmp32 = silk_SQRT_APPROX( nrg ); |
Qnrg >>= 1; /* range: -6...15*/ |
- psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( tmp32, 16 - Qnrg ); |
+ psEncCtrl->Gains_Q16[ k ] = (silk_LSHIFT32( silk_LIMIT( (tmp32), silk_RSHIFT32( silk_int32_MIN, (16 - Qnrg) ), \ |
+ silk_RSHIFT32( silk_int32_MAX, (16 - Qnrg) ) ), (16 - Qnrg) )); |
if( psEnc->sCmn.warping_Q16 > 0 ) { |
/* Adjust gain for warping */ |