Update SILK code using the CELT range coder
[opus.git] / src_FIX / SKP_Silk_prefilter_FIX.c
similarity index 68%
rename from src/SKP_Silk_prefilter_FIX.c
rename to src_FIX/SKP_Silk_prefilter_FIX.c
index d4c98b6..1b7dcd2 100644 (file)
@@ -40,6 +40,47 @@ SKP_INLINE void SKP_Silk_prefilt_FIX(
     SKP_int     length                                  /* I Length of signals                */\r
 );\r
 \r
+void SKP_Silk_warped_LPC_analysis_filter_FIX(\r
+          SKP_int32                 state[],            /* I/O  State [order + 1]                       */\r
+          SKP_int16                 res[],              /* O    Residual signal [length]                */\r
+    const SKP_int16                 coef_Q13[],         /* I    Coefficients [order]                    */\r
+    const SKP_int16                 input[],            /* I    Input signal [length]                   */\r
+    const SKP_int16                 lambda_Q16,         /* I    Warping factor                          */\r
+    const SKP_int                   length,             /* I    Length of input signal                  */\r
+    const SKP_int                   order               /* I    Filter order (even)                     */\r
+)\r
+{\r
+    SKP_int     n, i;\r
+    SKP_int32   acc_Q11, tmp1, tmp2;\r
+\r
+    /* Order must be even */\r
+    SKP_assert( ( order & 1 ) == 0 );\r
+\r
+    for( n = 0; n < length; n++ ) {\r
+        /* Output of lowpass section */  \r
+        tmp2 = SKP_SMLAWB( state[ 0 ], state[ 1 ], lambda_Q16 );\r
+        state[ 0 ] = SKP_LSHIFT( input[ n ], 14 );\r
+        /* Output of allpass section */\r
+        tmp1 = SKP_SMLAWB( state[ 1 ], state[ 2 ] - tmp2, lambda_Q16 );\r
+        state[ 1 ] = tmp2;\r
+        acc_Q11 = SKP_SMULWB( tmp2, coef_Q13[ 0 ] );\r
+        /* Loop over allpass sections */\r
+        for( i = 2; i < order; i += 2 ) {\r
+            /* Output of allpass section */\r
+            tmp2 = SKP_SMLAWB( state[ i ], state[ i + 1 ] - tmp1, lambda_Q16 );\r
+            state[ i ] = tmp1;\r
+            acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ i - 1 ] );\r
+            /* Output of allpass section */\r
+            tmp1 = SKP_SMLAWB( state[ i + 1 ], state[ i + 2 ] - tmp2, lambda_Q16 );\r
+            state[ i + 1 ] = tmp2;\r
+            acc_Q11 = SKP_SMLAWB( acc_Q11, tmp2, coef_Q13[ i ] );\r
+        }\r
+        state[ order ] = tmp1;\r
+        acc_Q11 = SKP_SMLAWB( acc_Q11, tmp1, coef_Q13[ order - 1 ] );\r
+        res[ n ] = ( SKP_int16 )SKP_SAT16( ( SKP_int32 )input[ n ] - SKP_RSHIFT_ROUND( acc_Q11, 11 ) );\r
+    }\r
+}\r
+\r
 void SKP_Silk_prefilter_FIX(\r
     SKP_Silk_encoder_state_FIX          *psEnc,         /* I/O  Encoder state FIX                           */\r
     const SKP_Silk_encoder_control_FIX  *psEncCtrl,     /* I    Encoder control FIX                         */\r
@@ -49,20 +90,21 @@ void SKP_Silk_prefilter_FIX(
 {\r
     SKP_Silk_prefilter_state_FIX *P = &psEnc->sPrefilt;\r
     SKP_int   j, k, lag;\r
-    SKP_int32 tmp_32, B_Q12;\r
+    SKP_int32 tmp_32;\r
     const SKP_int16 *AR1_shp_Q13;\r
     const SKP_int16 *px;\r
-    SKP_int16 *pxw, *pst_res;\r
-    SKP_int   HarmShapeGain_Q12, Tilt_Q14, LF_shp_Q14;\r
-    SKP_int32 HarmShapeFIRPacked_Q12;\r
-    SKP_int32 x_filt_Q12[ MAX_FRAME_LENGTH / NB_SUBFR ], filterState[ MAX_LPC_ORDER ];\r
-    SKP_int16 st_res[ ( MAX_FRAME_LENGTH / NB_SUBFR ) + MAX_LPC_ORDER ];\r
+    SKP_int16 *pxw;\r
+    SKP_int   HarmShapeGain_Q12, Tilt_Q14;\r
+    SKP_int32 HarmShapeFIRPacked_Q12, LF_shp_Q14;\r
+    SKP_int32 x_filt_Q12[ MAX_FRAME_LENGTH / MAX_NB_SUBFR ];\r
+    SKP_int16 st_res[ ( MAX_FRAME_LENGTH / MAX_NB_SUBFR ) + MAX_LPC_ORDER ];\r
+    SKP_int16 B_Q12[ 2 ];\r
 \r
     /* Setup pointers */\r
     px  = x;\r
     pxw = xw;\r
     lag = P->lagPrev;\r
-    for( k = 0; k < NB_SUBFR; k++ ) {\r
+    for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {\r
         /* Update Variables that change per sub frame */\r
         if( psEncCtrl->sCmn.sigtype == SIG_TYPE_VOICED ) {\r
             lag = psEncCtrl->sCmn.pitchL[ k ];\r
@@ -71,36 +113,29 @@ void SKP_Silk_prefilter_FIX(
         /* Noise shape parameters */\r
         HarmShapeGain_Q12 = SKP_SMULWB( psEncCtrl->HarmShapeGain_Q14[ k ], 16384 - psEncCtrl->HarmBoost_Q14[ k ] );\r
         SKP_assert( HarmShapeGain_Q12 >= 0 );\r
-        HarmShapeFIRPacked_Q12  =                        SKP_RSHIFT( HarmShapeGain_Q12, 2 );\r
+        HarmShapeFIRPacked_Q12  =                          SKP_RSHIFT( HarmShapeGain_Q12, 2 );\r
         HarmShapeFIRPacked_Q12 |= SKP_LSHIFT( ( SKP_int32 )SKP_RSHIFT( HarmShapeGain_Q12, 1 ), 16 );\r
         Tilt_Q14    = psEncCtrl->Tilt_Q14[   k ];\r
         LF_shp_Q14  = psEncCtrl->LF_shp_Q14[ k ];\r
-        AR1_shp_Q13 = &psEncCtrl->AR1_Q13[   k * SHAPE_LPC_ORDER_MAX ];\r
+        AR1_shp_Q13 = &psEncCtrl->AR1_Q13[   k * MAX_SHAPE_LPC_ORDER ];\r
 \r
         /* Short term FIR filtering*/\r
-        SKP_memset( filterState, 0, psEnc->sCmn.shapingLPCOrder * sizeof( SKP_int32 ) );\r
-        SKP_Silk_MA_Prediction_Q13( px - psEnc->sCmn.shapingLPCOrder, AR1_shp_Q13, filterState, \r
-            st_res, psEnc->sCmn.subfr_length + psEnc->sCmn.shapingLPCOrder, psEnc->sCmn.shapingLPCOrder );\r
-\r
-        pst_res = st_res + psEnc->sCmn.shapingLPCOrder; /* Point to first sample */\r
+        SKP_Silk_warped_LPC_analysis_filter_FIX( P->sAR_shp1, st_res, AR1_shp_Q13, px, \r
+            psEncCtrl->sCmn.warping_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.shapingLPCOrder );\r
 \r
         /* reduce (mainly) low frequencies during harmonic emphasis */\r
-        B_Q12 = SKP_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 2 );\r
+        B_Q12[ 0 ] = SKP_RSHIFT_ROUND( psEncCtrl->GainsPre_Q14[ k ], 2 );\r
         tmp_32 = SKP_SMLABB( INPUT_TILT_Q26, psEncCtrl->HarmBoost_Q14[ k ], HarmShapeGain_Q12 ); /* Q26 */\r
         tmp_32 = SKP_SMLABB( tmp_32, psEncCtrl->coding_quality_Q14, HIGH_RATE_INPUT_TILT_Q12 );  /* Q26 */\r
         tmp_32 = SKP_SMULWB( tmp_32, -psEncCtrl->GainsPre_Q14[ k ] );                            /* Q24 */\r
         tmp_32 = SKP_RSHIFT_ROUND( tmp_32, 12 );                                                 /* Q12 */\r
-        B_Q12 |= SKP_LSHIFT( SKP_SAT16( tmp_32 ), 16 );\r
+        B_Q12[ 1 ]= SKP_SAT16( tmp_32 );\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
-        x_filt_Q12[ 0 ] = SKP_SMLABT( SKP_SMULBB( pst_res[ 0 ], B_Q12 ), P->sHarmHP, B_Q12 );\r
+        x_filt_Q12[ 0 ] = SKP_SMLABB( SKP_SMULBB( st_res[ 0 ], B_Q12[ 0 ] ), P->sHarmHP, B_Q12[ 1 ] );\r
         for( j = 1; j < psEnc->sCmn.subfr_length; j++ ) {\r
-            x_filt_Q12[ j ] = SKP_SMLABT( SKP_SMULBB( pst_res[ j ], B_Q12 ), pst_res[ j - 1 ], B_Q12 );\r
+            x_filt_Q12[ j ] = SKP_SMLABB( SKP_SMULBB( st_res[ j ], B_Q12[ 0 ] ), st_res[ j - 1 ], B_Q12[ 1 ] );\r
         }\r
-        P->sHarmHP = pst_res[ psEnc->sCmn.subfr_length - 1 ];\r
+        P->sHarmHP = st_res[ psEnc->sCmn.subfr_length - 1 ];\r
 \r
         SKP_Silk_prefilt_FIX( P, x_filt_Q12, pxw, HarmShapeFIRPacked_Q12, Tilt_Q14, \r
             LF_shp_Q14, lag, psEnc->sCmn.subfr_length );\r
@@ -109,7 +144,7 @@ void SKP_Silk_prefilter_FIX(
         pxw += psEnc->sCmn.subfr_length;\r
     }\r
 \r
-    P->lagPrev = psEncCtrl->sCmn.pitchL[ NB_SUBFR - 1 ];\r
+    P->lagPrev = psEncCtrl->sCmn.pitchL[ MAX_NB_SUBFR - 1 ];\r
 }\r
 \r
 /* SKP_Silk_prefilter. Prefilter for finding Quantizer input signal                           */\r
@@ -147,13 +182,13 @@ SKP_INLINE void SKP_Silk_prefilt_FIX(
             n_LTP_Q12 = 0;\r
         }\r
 \r
-        n_LF_Q10   = SKP_SMLAWB( SKP_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 );\r
         n_Tilt_Q10 = SKP_SMULWB( sLF_AR_shp_Q12, Tilt_Q14 );\r
+        n_LF_Q10   = SKP_SMLAWB( SKP_SMULWT( sLF_AR_shp_Q12, LF_shp_Q14 ), sLF_MA_shp_Q12, LF_shp_Q14 );\r
 \r
         sLF_AR_shp_Q12 = SKP_SUB32( st_res_Q12[ i ], SKP_LSHIFT( n_Tilt_Q10, 2 ) );\r
         sLF_MA_shp_Q12 = SKP_SUB32( sLF_AR_shp_Q12,  SKP_LSHIFT( n_LF_Q10,   2 ) );\r
 \r
-        LTP_shp_buf_idx                = ( LTP_shp_buf_idx - 1 ) & LTP_MASK;\r
+        LTP_shp_buf_idx = ( LTP_shp_buf_idx - 1 ) & LTP_MASK;\r
         LTP_shp_buf[ LTP_shp_buf_idx ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( sLF_MA_shp_Q12, 12 ) );\r
 \r
         xw[i] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SUB32( sLF_MA_shp_Q12, n_LTP_Q12 ), 12 ) );\r