summaryrefslogtreecommitdiff
path: root/silk/LPC_analysis_filter.c
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2011-10-27 13:51:21 -0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2011-10-27 13:51:21 -0400
commit4a7027b27e2d962dedc63360a45db5ff74dc1131 (patch)
treebca307bc6c1889b86afa24f58bca1b69c98e6835 /silk/LPC_analysis_filter.c
parente6a0be8ee6a0675dc7c959a0c3cf9d3f7219b682 (diff)
downloadopus-4a7027b27e2d962dedc63360a45db5ff74dc1131.tar.gz
Allow wrap-around in silk_LPC_analysis_filter()
Diffstat (limited to 'silk/LPC_analysis_filter.c')
-rw-r--r--silk/LPC_analysis_filter.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/silk/LPC_analysis_filter.c b/silk/LPC_analysis_filter.c
index a8d1c333..5fc4349b 100644
--- a/silk/LPC_analysis_filter.c
+++ b/silk/LPC_analysis_filter.c
@@ -58,18 +58,20 @@ void silk_LPC_analysis_filter(
in_ptr = &in[ ix - 1 ];
out32_Q12 = silk_SMULBB( in_ptr[ 0 ], B[ 0 ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -1 ], B[ 1 ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -2 ], B[ 2 ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -3 ], B[ 3 ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -4 ], B[ 4 ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -5 ], B[ 5 ] );
+ /* Allowing wrap around so that two wraps can cancel each other. The rare
+ cases where the result wraps around can only be triggered by invalid streams*/
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -1 ], B[ 1 ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -2 ], B[ 2 ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -3 ], B[ 3 ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -4 ], B[ 4 ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -5 ], B[ 5 ] );
for( j = 6; j < d; j += 2 ) {
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -j ], B[ j ] );
- out32_Q12 = silk_SMLABB( out32_Q12, in_ptr[ -j - 1 ], B[ j + 1 ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j ], B[ j ] );
+ out32_Q12 = silk_SMLABB_ovflw( out32_Q12, in_ptr[ -j - 1 ], B[ j + 1 ] );
}
/* Subtract prediction */
- out32_Q12 = silk_SUB32( silk_LSHIFT( (opus_int32)in_ptr[ 1 ], 12 ), out32_Q12 );
+ out32_Q12 = silk_SUB32_ovflw( silk_LSHIFT( (opus_int32)in_ptr[ 1 ], 12 ), out32_Q12 );
/* Scale to Q0 */
out32 = silk_RSHIFT_ROUND( out32_Q12, 12 );