Update SILK code using the CELT range coder
[opus.git] / src_SigProc_FIX / SKP_Silk_MA.c
similarity index 57%
rename from src/SKP_Silk_MA.c
rename to src_SigProc_FIX/SKP_Silk_MA.c
index cdfaca7..3470a92 100644 (file)
@@ -74,47 +74,19 @@ void SKP_Silk_MA_Prediction(
 {\r
     SKP_int   k, d, in16;\r
     SKP_int32 out32;\r
-    SKP_int32 B32;\r
 \r
-    if( ( order & 1 ) == 0 && (SKP_int32)( (SKP_int_ptr_size)B & 3 ) == 0 ) {\r
-        /* Even order and 4-byte aligned coefficient array */\r
-\r
-        /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the    */\r
-        /* SMLABB and SMLABT instructions. On a big-endian CPU the two int16 variables would be      */\r
-        /* loaded in reverse order and the code will give the wrong result. In that case swapping    */\r
-        /* the SMLABB and SMLABT instructions should solve the problem.                              */\r
-        for( k = 0; k < len; k++ ) {\r
-            in16 = in[ k ];\r
-            out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];\r
-            out32 = SKP_RSHIFT_ROUND( out32, 12 );\r
-            \r
-            for( d = 0; d < order - 2; d += 2 ) {\r
-                B32 = *( (SKP_int32*)&B[ d ] );                /* read two coefficients at once */\r
-                S[ d ]     = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B32 );\r
-                S[ d + 1 ] = SKP_SMLABT_ovflw( S[ d + 2 ], in16, B32 );\r
-            }\r
-            B32 = *( (SKP_int32*)&B[ d ] );                    /* read two coefficients at once */\r
-            S[ order - 2 ] = SKP_SMLABB_ovflw( S[ order - 1 ], in16, B32 );\r
-            S[ order - 1 ] = SKP_SMULBT( in16, B32 );\r
-\r
-            /* Limit */\r
-            out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
+    for( k = 0; k < len; k++ ) {\r
+        in16 = in[ k ];\r
+        out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];\r
+        out32 = SKP_RSHIFT_ROUND( out32, 12 );\r
+        \r
+        for( d = 0; d < order - 1; d++ ) {\r
+            S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] );\r
         }\r
-    } else {\r
-        /* Odd order or not 4-byte aligned coefficient array */\r
-        for( k = 0; k < len; k++ ) {\r
-            in16 = in[ k ];\r
-            out32 = SKP_LSHIFT( in16, 12 ) - S[ 0 ];\r
-            out32 = SKP_RSHIFT_ROUND( out32, 12 );\r
-            \r
-            for( d = 0; d < order - 1; d++ ) {\r
-                S[ d ] = SKP_SMLABB_ovflw( S[ d + 1 ], in16, B[ d ] );\r
-            }\r
-            S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
+        S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
 \r
-            /* Limit */\r
-            out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
-        }\r
+        /* Limit */\r
+        out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
     }\r
 }\r
 \r
@@ -128,51 +100,22 @@ void SKP_Silk_MA_Prediction_Q13(
 )\r
 {\r
     SKP_int   k, d, in16;\r
-    SKP_int32 out32, B32;\r
-    \r
-    if( ( order & 1 ) == 0 && (SKP_int32)( (SKP_int_ptr_size)B & 3 ) == 0 ) {\r
-        /* Even order and 4-byte aligned coefficient array */\r
+    SKP_int32 out32;\r
+    for( k = 0; k < len; k++ ) {\r
+        in16 = in[ k ];\r
+        out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];\r
+        out32 = SKP_RSHIFT_ROUND( out32, 13 );\r
         \r
-        /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the    */\r
-        /* SMLABB and SMLABT instructions. On a big-endian CPU the two int16 variables would be      */\r
-        /* loaded in reverse order and the code will give the wrong result. In that case swapping    */\r
-        /* the SMLABB and SMLABT instructions should solve the problem.                              */\r
-        for( k = 0; k < len; k++ ) {\r
-            in16 = in[ k ];\r
-            out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];\r
-            out32 = SKP_RSHIFT_ROUND( out32, 13 );\r
-            \r
-            for( d = 0; d < order - 2; d += 2 ) {\r
-                B32 = *( (SKP_int32*)&B[ d ] );                /* read two coefficients at once */\r
-                S[ d ]     = SKP_SMLABB( S[ d + 1 ], in16, B32 );\r
-                S[ d + 1 ] = SKP_SMLABT( S[ d + 2 ], in16, B32 );\r
-            }\r
-            B32 = *( (SKP_int32*)&B[ d ] );                    /* read two coefficients at once */\r
-            S[ order - 2 ] = SKP_SMLABB( S[ order - 1 ], in16, B32 );\r
-            S[ order - 1 ] = SKP_SMULBT( in16, B32 );\r
-\r
-            /* Limit */\r
-            out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
+        for( d = 0; d < order - 1; d++ ) {\r
+            S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B[ d ] );\r
         }\r
-    } else {\r
-        /* Odd order or not 4-byte aligned coefficient array */\r
-        for( k = 0; k < len; k++ ) {\r
-            in16 = in[ k ];\r
-            out32 = SKP_LSHIFT( in16, 13 ) - S[ 0 ];\r
-            out32 = SKP_RSHIFT_ROUND( out32, 13 );\r
-            \r
-            for( d = 0; d < order - 1; d++ ) {\r
-                S[ d ] = SKP_SMLABB( S[ d + 1 ], in16, B[ d ] );\r
-            }\r
-            S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
+        S[ order - 1 ] = SKP_SMULBB( in16, B[ order - 1 ] );\r
 \r
-            /* Limit */\r
-            out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
-        }\r
+        /* Limit */\r
+        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
     }\r
 }\r
-/* Variable order MA prediction error filter. */\r
-/* Inverse filter of SKP_Silk_LPC_synthesis_filter */\r
+\r
 void SKP_Silk_LPC_analysis_filter(\r
     const SKP_int16      *in,            /* I:   Input signal                                */\r
     const SKP_int16      *B,             /* I:   MA prediction coefficients, Q12 [order]     */\r
@@ -183,17 +126,11 @@ void SKP_Silk_LPC_analysis_filter(
 )\r
 {\r
     SKP_int   k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );\r
-    SKP_int32 Btmp, B_align_Q12[ SigProc_MAX_ORDER_LPC >> 1 ], out32_Q12, out32;\r
+    SKP_int32 out32_Q12, out32;\r
     SKP_int16 SA, SB;\r
     /* Order must be even */\r
     SKP_assert( 2 * Order_half == Order );\r
 \r
-    /* Combine two A_Q12 values and ensure 32-bit alignment */\r
-    for( k = 0; k < Order_half; k++ ) {\r
-        idx = SKP_SMULBB( 2, k );\r
-        B_align_Q12[ k ] = ( ( (SKP_int32)B[ idx ] ) & 0x0000ffff ) | SKP_LSHIFT( (SKP_int32)B[ idx + 1 ], 16 );\r
-    }\r
-\r
     /* S[] values are in Q0 */\r
     for( k = 0; k < len; k++ ) {\r
         SA = S[ 0 ];\r
@@ -201,21 +138,19 @@ void SKP_Silk_LPC_analysis_filter(
         for( j = 0; j < ( Order_half - 1 ); j++ ) {\r
             idx = SKP_SMULBB( 2, j ) + 1;\r
             /* Multiply-add two prediction coefficients for each loop */\r
-            Btmp = B_align_Q12[ j ];\r
             SB = S[ idx ];\r
             S[ idx ] = SA;\r
-            out32_Q12 = SKP_SMLABB( out32_Q12, SA, Btmp );\r
-            out32_Q12 = SKP_SMLABT( out32_Q12, SB, Btmp );\r
+            out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ idx - 1 ] );\r
+            out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ idx ] );\r
             SA = S[ idx + 1 ];\r
             S[ idx + 1 ] = SB;\r
         }\r
 \r
         /* Unrolled loop: epilog */\r
-        Btmp = B_align_Q12[ Order_half - 1 ];\r
         SB = S[ Order - 1 ];\r
         S[ Order - 1 ] = SA;\r
-        out32_Q12 = SKP_SMLABB( out32_Q12, SA, Btmp );\r
-        out32_Q12 = SKP_SMLABT( out32_Q12, SB, Btmp );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, SA, B[ Order - 2 ] );\r
+        out32_Q12 = SKP_SMLABB( out32_Q12, SB, B[ Order - 1 ] );\r
 \r
         /* Subtract prediction */\r
         out32_Q12 = SKP_SUB_SAT32( SKP_LSHIFT( (SKP_int32)in[ k ], 12 ), out32_Q12 );\r
@@ -224,7 +159,7 @@ void SKP_Silk_LPC_analysis_filter(
         out32 = SKP_RSHIFT_ROUND( out32_Q12, 12 );\r
 \r
         /* Saturate output */\r
-        out[ k ] = (SKP_int16)SKP_SAT16( out32 );\r
+        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
 \r
         /* Move input line */\r
         S[ 0 ] = in[ k ];\r