Update SILK code using the CELT range coder
[opus.git] / src_SigProc_FIX / SKP_Silk_ana_filt_bank_1.c
similarity index 63%
rename from src/SKP_Silk_ana_filt_bank_1.c
rename to src_SigProc_FIX/SKP_Silk_ana_filt_bank_1.c
index 3dd3b1b..d948a62 100644 (file)
@@ -36,38 +36,45 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "SKP_Silk_SigProc_FIX.h"\r
 \r
 /* Coefficients for 2-band filter bank based on first-order allpass filters */\r
-static SKP_int16 A_fb1_20[ 1 ] = {  5394 };\r
-static SKP_int16 A_fb1_21[ 1 ] = { 20623 };\r
+// old\r
+static SKP_int16 A_fb1_20[ 1 ] = {  5394 << 1 };\r
+static SKP_int16 A_fb1_21[ 1 ] = { 20623 << 1 };        /* wrap-around to negative number is intentional */\r
 \r
 /* Split signal into two decimated bands using first-order allpass filters */\r
 void SKP_Silk_ana_filt_bank_1(\r
-    const SKP_int16      *in,        /* I:    Input signal [N]       */\r
+    const SKP_int16      *in,        /* I:   Input signal [N]        */\r
     SKP_int32            *S,         /* I/O: State vector [2]        */\r
-    SKP_int16            *outL,      /* O:    Low band [N/2]         */\r
-    SKP_int16            *outH,      /* O:    High band [N/2]        */\r
-    SKP_int32            *scratch,   /* I:    Scratch memory [3*N/2] */\r
+    SKP_int16            *outL,      /* O:   Low band [N/2]          */\r
+    SKP_int16            *outH,      /* O:   High band [N/2]         */\r
+    SKP_int32            *scratch,   /* I:   Scratch memory [3*N/2]  */   // todo: remove - no longer used\r
     const SKP_int32      N           /* I:   Number of input samples */\r
 )\r
 {\r
-    SKP_int        k, N2 = SKP_RSHIFT( N, 1 );\r
-    SKP_int32    out_tmp;\r
+    SKP_int      k, N2 = SKP_RSHIFT( N, 1 );\r
+    SKP_int32    in32, X, Y, out_1, out_2;\r
 \r
-    /* De-interleave three allpass inputs, and convert Q15 -> Q25 */\r
+    /* Internal variables and state are in Q10 format */\r
     for( k = 0; k < N2; k++ ) {\r
-        scratch[ k + N  ] = SKP_LSHIFT( (SKP_int32)in[ 2 * k     ], 10 );\r
-        scratch[ k + N2 ] = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 );\r
-    }\r
+        /* Convert to Q10 */\r
+        in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k ], 10 );\r
 \r
-    /* Allpass filters */\r
-    SKP_Silk_allpass_int( scratch + N2, S+0, A_fb1_20[ 0 ], scratch,      N2 );\r
-    SKP_Silk_allpass_int( scratch + N,  S+1, A_fb1_21[ 0 ], scratch + N2, N2 );\r
+        /* All-pass section for even input sample */\r
+        Y      = SKP_SUB32( in32, S[ 0 ] );\r
+        X      = SKP_SMLAWB( Y, Y, A_fb1_21[ 0 ] );\r
+        out_1  = SKP_ADD32( S[ 0 ], X );\r
+        S[ 0 ] = SKP_ADD32( in32, X );\r
 \r
-    /* Add and subtract two allpass outputs to create bands */\r
-    for( k = 0; k < N2; k++ ) {\r
-        out_tmp   = scratch[ k ] + scratch[ k + N2 ];\r
-        outL[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out_tmp, 11 ) );\r
+        /* Convert to Q10 */\r
+        in32 = SKP_LSHIFT( (SKP_int32)in[ 2 * k + 1 ], 10 );\r
 \r
-        out_tmp   = scratch[ k ] - scratch[ k + N2 ];\r
-        outH[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( out_tmp, 11 ) );\r
-    }        \r
+        /* All-pass section for odd input sample, and add to output of previous section */\r
+        Y      = SKP_SUB32( in32, S[ 1 ] );\r
+        X      = SKP_SMULWB( Y, A_fb1_20[ 0 ] );\r
+        out_2  = SKP_ADD32( S[ 1 ], X );\r
+        S[ 1 ] = SKP_ADD32( in32, X );\r
+\r
+        /* Add/subtract, convert back to int16 and store to output */\r
+        outL[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_ADD32( out_2, out_1 ), 11 ) );\r
+        outH[ k ] = (SKP_int16)SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( out_2, out_1 ), 11 ) );\r
+    }\r
 }\r