simplified computation of LTP coefs
[opus.git] / silk / quant_LTP_gains.c
index 513a8c4..6849492 100644 (file)
@@ -30,17 +30,16 @@ POSSIBILITY OF SUCH DAMAGE.
 #endif
 
 #include "main.h"
-#include "tuning_parameters.h"
 
 void silk_quant_LTP_gains(
-    opus_int16                  B_Q14[ MAX_NB_SUBFR * LTP_ORDER ],          /* I/O  (un)quantized LTP gains         */
+    opus_int16                  B_Q14[ MAX_NB_SUBFR * LTP_ORDER ],          /* O       Quantized LTP gains                             */
     opus_int8                   cbk_index[ MAX_NB_SUBFR ],                  /* O    Codebook Index                  */
     opus_int8                   *periodicity_index,                         /* O    Periodicity Index               */
-    opus_int32                  *sum_log_gain_Q7,                           /* I/O  Cumulative max prediction gain  */
-    const opus_int32            W_Q18[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ],  /* I    Error Weights in Q18            */
-    opus_int                    mu_Q9,                                      /* I    Mu value (R/D tradeoff)         */
-    opus_int                    lowComplexity,                              /* I    Flag for low complexity         */
-    const opus_int              nb_subfr,                                   /* I    number of subframes             */
+       opus_int                        *pred_gain_dB_Q7,                                                       /* O    LTP prediction gain                             */
+    const opus_int32            XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I    Correlation matrix in Q18       */
+    const opus_int32            xX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I    Correlation vector in Q18       */
+    const opus_int              subfr_len,                                                                     /* I    Number of samples per subframe  */
+    const opus_int              nb_subfr,                                   /* I    Number of subframes             */
     int                         arch                                        /* I    Run-time architecture           */
 )
 {
@@ -48,74 +47,53 @@ void silk_quant_LTP_gains(
     opus_int8            temp_idx[ MAX_NB_SUBFR ];
     const opus_uint8     *cl_ptr_Q5;
     const opus_int8      *cbk_ptr_Q7;
-    const opus_uint8     *cbk_gain_ptr_Q7;
     const opus_int16     *b_Q14_ptr;
-    const opus_int32     *W_Q18_ptr;
-    opus_int32           rate_dist_Q14_subfr, rate_dist_Q14, min_rate_dist_Q14;
-    opus_int32           sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7, gain_Q7;
+    const opus_int32     *XX_Q17_ptr, *xX_Q17_ptr;
+    opus_int32           res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7;
 
     /***************************************************/
     /* iterate over different codebooks with different */
     /* rates/distortions, and choose best */
     /***************************************************/
-    min_rate_dist_Q14 = silk_int32_MAX;
-    best_sum_log_gain_Q7 = 0;
+    min_rate_dist_Q7 = silk_int32_MAX;
     for( k = 0; k < 3; k++ ) {
-        /* Safety margin for pitch gain control, to take into account factors
-           such as state rescaling/rewhitening. */
-        opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 );
-
         cl_ptr_Q5  = silk_LTP_gain_BITS_Q5_ptrs[ k ];
         cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[        k ];
-        cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ];
         cbk_size   = silk_LTP_vq_sizes[          k ];
 
         /* Set up pointer to first subframe */
-        W_Q18_ptr = W_Q18;
-        b_Q14_ptr = B_Q14;
+        XX_Q17_ptr = XX_Q17;
+        xX_Q17_ptr = xX_Q17;
+        b_Q14_ptr  = B_Q14;
 
-        rate_dist_Q14 = 0;
-        sum_log_gain_tmp_Q7 = *sum_log_gain_Q7;
+               res_nrg_Q15 = 0;
+        rate_dist_Q7 = 0;
         for( j = 0; j < nb_subfr; j++ ) {
-            max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 )
-                                        + SILK_FIX_CONST( 7, 7 ) ) - gain_safety;
-
             silk_VQ_WMat_EC(
                 &temp_idx[ j ],         /* O    index of best codebook vector                           */
-                &rate_dist_Q14_subfr,   /* O    best weighted quantization error + mu * rate            */
-                &gain_Q7,               /* O    sum of absolute LTP coefficients                        */
-                b_Q14_ptr,              /* I    input vector to be quantized                            */
-                W_Q18_ptr,              /* I    weighting matrix                                        */
+                               &res_nrg_Q15_subfr,             /* O    residual energy                                                                                 */
+                &rate_dist_Q7_subfr,    /* O    best weighted quantization error + mu * rate            */
+                XX_Q17_ptr,             /* I    correlation matrix                                      */
+                xX_Q17_ptr,             /* I    correlation vector                                                                             */
                 cbk_ptr_Q7,             /* I    codebook                                                */
-                cbk_gain_ptr_Q7,        /* I    codebook effective gains                                */
                 cl_ptr_Q5,              /* I    code length for each codebook vector                    */
-                mu_Q9,                  /* I    tradeoff between weighted error and rate                */
-                max_gain_Q7,            /* I    maximum sum of absolute LTP coefficients                */
+                subfr_len,              /* I    number of samples per subframe                                 */
                 cbk_size,               /* I    number of vectors in codebook                           */
                 arch                    /* I    Run-time architecture                                   */
             );
 
-            rate_dist_Q14 = silk_ADD_POS_SAT32( rate_dist_Q14, rate_dist_Q14_subfr );
-            sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7
-                                + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 ));
+                       res_nrg_Q15   = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr );
+            rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr );
 
-            b_Q14_ptr += LTP_ORDER;
-            W_Q18_ptr += LTP_ORDER * LTP_ORDER;
+            b_Q14_ptr  += LTP_ORDER;
+            XX_Q17_ptr += LTP_ORDER * LTP_ORDER;
+            xX_Q17_ptr += LTP_ORDER;
         }
 
-        /* Avoid never finding a codebook */
-        rate_dist_Q14 = silk_min( silk_int32_MAX - 1, rate_dist_Q14 );
-
-        if( rate_dist_Q14 < min_rate_dist_Q14 ) {
-            min_rate_dist_Q14 = rate_dist_Q14;
+        if( rate_dist_Q7 <= min_rate_dist_Q7 ) {
+            min_rate_dist_Q7 = rate_dist_Q7;
             *periodicity_index = (opus_int8)k;
             silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) );
-            best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7;
-        }
-
-        /* Break early in low-complexity mode if rate distortion is below threshold */
-        if( lowComplexity && ( rate_dist_Q14 < silk_LTP_gain_middle_avg_RD_Q14 ) ) {
-            break;
         }
     }
 
@@ -125,5 +103,13 @@ void silk_quant_LTP_gains(
             B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 );
         }
     }
-    *sum_log_gain_Q7 = best_sum_log_gain_Q7;
+
+       if( nb_subfr == 2 ) {
+               res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 );
+       } else {
+               res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 );
+       }
+
+       *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) );
 }
+