summaryrefslogtreecommitdiff
path: root/silk/LPC_analysis_filter.c
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2013-08-29 15:29:02 -0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2013-08-29 15:29:02 -0400
commit02fed471a4568852d6618e041c4f2af0d7730ee2 (patch)
tree1e2ba204606f5aed0ca027cf76edd4b8af5f6552 /silk/LPC_analysis_filter.c
parent00a1b3e0da9337939f528c71dd4be4bb6872668f (diff)
downloadopus-02fed471a4568852d6618e041c4f2af0d7730ee2.tar.gz
Implements fixed-point silk_LPC_analysis_filter() in terms of celt_fir()
Saves 2.5% on ARM without any asm. The float build still uses the old code because celt_fir() then becomes a float function.
Diffstat (limited to 'silk/LPC_analysis_filter.c')
-rw-r--r--silk/LPC_analysis_filter.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/silk/LPC_analysis_filter.c b/silk/LPC_analysis_filter.c
index e2c0c88b..9bfeba0f 100644
--- a/silk/LPC_analysis_filter.c
+++ b/silk/LPC_analysis_filter.c
@@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE.
#endif
#include "SigProc_FIX.h"
+#include "celt_lpc.h"
/*******************************************/
/* LPC analysis filter */
@@ -46,14 +47,33 @@ void silk_LPC_analysis_filter(
const opus_int32 d /* I Filter order */
)
{
- opus_int ix, j;
+ opus_int j;
+#ifdef FIXED_POINT
+ opus_int16 mem[SILK_MAX_ORDER_LPC];
+ opus_int16 num[SILK_MAX_ORDER_LPC];
+#else
+ int ix;
opus_int32 out32_Q12, out32;
const opus_int16 *in_ptr;
+#endif
silk_assert( d >= 6 );
silk_assert( (d & 1) == 0 );
silk_assert( d <= len );
+#ifdef FIXED_POINT
+ silk_assert( d <= SILK_MAX_ORDER_LPC );
+ for ( j = 0; j < d; j++ ) {
+ num[ j ] = -B[ j ];
+ }
+ for (j=0;j<d;j++) {
+ mem[ j ] = in[ d - j - 1 ];
+ }
+ celt_fir( in + d, num, out + d, len - d, d, mem );
+ for ( j = 0; j < d; j++ ) {
+ out[ j ] = 0;
+ }
+#else
for( ix = d; ix < len; ix++ ) {
in_ptr = &in[ ix - 1 ];
@@ -82,4 +102,5 @@ void silk_LPC_analysis_filter(
/* Set first d output samples to zero */
silk_memset( out, 0, d * sizeof( opus_int16 ) );
+#endif
}