diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-08-29 15:29:02 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-08-29 15:29:02 -0400 |
commit | 02fed471a4568852d6618e041c4f2af0d7730ee2 (patch) | |
tree | 1e2ba204606f5aed0ca027cf76edd4b8af5f6552 /silk/LPC_analysis_filter.c | |
parent | 00a1b3e0da9337939f528c71dd4be4bb6872668f (diff) | |
download | opus-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.c | 23 |
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 } |