diff options
author | Koen Vos <koenvos@users.noreply.github.com> | 2016-02-19 05:44:09 +0300 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-05-22 00:22:07 +0300 |
commit | 55023d471c1272c2e20355999b82268ab8e60eda (patch) | |
tree | 8245cf7bf39ff4f9340af0734e369d721f1af9b7 | |
parent | 8fc157a4be20a98dd412dc8ebf2149c97b775711 (diff) |
sum_sqr_shift: reduced headroom (ie more preserved resolution); shift increments by one instead of two
-rw-r--r-- | silk/sum_sqr_shift.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/silk/sum_sqr_shift.c b/silk/sum_sqr_shift.c index 129df191..e387391a 100644 --- a/silk/sum_sqr_shift.c +++ b/silk/sum_sqr_shift.c @@ -45,39 +45,39 @@ void silk_sum_sqr_shift( nrg = 0; shft = 0; - len--; - for( i = 0; i < len; i += 2 ) { + for( i = 0; i < len - 1; i += 2 ) { nrg = silk_SMLABB_ovflw( nrg, x[ i ], x[ i ] ); nrg = silk_SMLABB_ovflw( nrg, x[ i + 1 ], x[ i + 1 ] ); if( nrg < 0 ) { /* Scale down */ - nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft = 2; - i+=2; + nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 1 ); + shft = 1; + i += 2; break; } } - for( ; i < len; i += 2 ) { + for( ; i < len - 1; i += 2 ) { nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg_tmp = silk_SMLABB_ovflw( nrg_tmp, x[ i + 1 ], x[ i + 1 ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, (opus_uint32)nrg_tmp, shft ); if( nrg < 0 ) { /* Scale down */ - nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft += 2; + nrg = (opus_int32)silk_RSHIFT_uint( (opus_uint32)nrg, 1 ); + shft++; } } - if( i == len ) { + if( i < len ) { /* One sample left to process */ nrg_tmp = silk_SMULBB( x[ i ], x[ i ] ); nrg = (opus_int32)silk_ADD_RSHIFT_uint( nrg, nrg_tmp, shft ); } - /* Make sure to have at least one extra leading zero (two leading zeros in total) */ - if( nrg & 0xC0000000 ) { - nrg = silk_RSHIFT_uint( (opus_uint32)nrg, 2 ); - shft += 2; + /* Make sure to have at least 10% headroom */ + if( (opus_uint32)nrg > SILK_FIX_CONST( 0.9, 31 ) ) { + nrg = silk_RSHIFT_uint( (opus_uint32)nrg, 1 ); + shft++; } + silk_assert( nrg >= 0 ); /* Output arguments */ *shift = shft; |