Update SILK code using the CELT range coder
[opus.git] / src_SigProc_FIX / SKP_Silk_LPC_synthesis_filter.c
similarity index 66%
rename from src/SKP_Silk_LPC_synthesis_filter.c
rename to src_SigProc_FIX/SKP_Silk_LPC_synthesis_filter.c
index fff5e70..c7916f3 100644 (file)
@@ -45,54 +45,40 @@ void SKP_Silk_LPC_synthesis_filter(
 )\r
 {\r
     SKP_int   k, j, idx, Order_half = SKP_RSHIFT( Order, 1 );\r
-    SKP_int32 SA, SB, Atmp, A_align_Q12[SigProc_MAX_ORDER_LPC >> 1], out32_Q10, out32;\r
+    SKP_int32 SA, SB, out32_Q10, out32;\r
 \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
-        A_align_Q12[k] = (((SKP_int32)A_Q12[idx]) & 0x0000ffff) | SKP_LSHIFT( (SKP_int32)A_Q12[idx+1], 16 );\r
-    }\r
+    SKP_assert( 2 * Order_half == Order );\r
 \r
     /* S[] values are in Q14 */\r
     for( k = 0; k < len; k++ ) {\r
-        SA = S[Order-1];\r
+        SA = S[ Order - 1 ];\r
         out32_Q10 = 0;\r
-        for( j=0;j<(Order_half-1); j++ ) {\r
+        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
-            /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the   */\r
-            /* SMLAWB and SMLAWT 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 SMLAWB and SMLAWT instructions should solve the problem.                             */\r
-            Atmp = A_align_Q12[j];\r
-            SB = S[Order - 1 - idx];\r
-            S[Order - 1 - idx] = SA;\r
-            out32_Q10 = SKP_SMLAWB( out32_Q10, SA, Atmp );\r
-            out32_Q10 = SKP_SMLAWT( out32_Q10, SB, Atmp );\r
-            SA = S[Order - 2 - idx];\r
-            S[Order - 2 - idx] = SB;\r
+            SB = S[ Order - 1 - idx ];\r
+            S[ Order - 1 - idx ] = SA;\r
+            out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ ( j << 1 ) ] );\r
+            out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ ( j << 1 ) + 1 ] );\r
+            SA = S[ Order - 2 - idx ];\r
+            S[ Order - 2 - idx ] = SB;\r
         }\r
 \r
         /* unrolled loop: epilog */\r
-        Atmp = A_align_Q12[Order_half-1];\r
-        SB = S[0];\r
-        S[0] = SA;\r
-        out32_Q10 = SKP_SMLAWB( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT( out32_Q10, SB, Atmp );\r
-\r
+        SB = S[ 0 ];\r
+        S[ 0 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB( out32_Q10, SA, A_Q12[ Order - 2 ] );\r
+        out32_Q10 = SKP_SMLAWB( out32_Q10, SB, A_Q12[ Order - 1 ] );\r
         /* apply gain to excitation signal and add to prediction */\r
-        out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[k] ) );\r
+        out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) );\r
 \r
         /* scale to Q0 */\r
         out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );\r
 \r
         /* saturate output */\r
-        out[k] = (SKP_int16)SKP_SAT16( out32 );\r
+        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
 \r
         /* move result into delay line */\r
-        S[Order - 1] = SKP_LSHIFT_SAT32( out32_Q10, 4 );\r
+        S[ Order - 1 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 );\r
     }\r
 }\r