1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 /******************************************************************
12 
13  iLBC Speech Coder ANSI-C Source Code
14 
15  WebRtcIlbcfix_CbUpdateBestIndex.c
16 
17 ******************************************************************/
18 
19 #include "defines.h"
20 #include "cb_update_best_index.h"
21 #include "constants.h"
22 
WebRtcIlbcfix_CbUpdateBestIndex(int32_t CritNew,int16_t CritNewSh,size_t IndexNew,int32_t cDotNew,int16_t invEnergyNew,int16_t energyShiftNew,int32_t * CritMax,int16_t * shTotMax,size_t * bestIndex,int16_t * bestGain)23 void WebRtcIlbcfix_CbUpdateBestIndex(
24     int32_t CritNew,    /* (i) New Potentially best Criteria */
25     int16_t CritNewSh,   /* (i) Shift value of above Criteria */
26     size_t IndexNew,   /* (i) Index of new Criteria */
27     int32_t cDotNew,    /* (i) Cross dot of new index */
28     int16_t invEnergyNew,  /* (i) Inversed energy new index */
29     int16_t energyShiftNew,  /* (i) Energy shifts of new index */
30     int32_t *CritMax,   /* (i/o) Maximum Criteria (so far) */
31     int16_t *shTotMax,   /* (i/o) Shifts of maximum criteria */
32     size_t *bestIndex,   /* (i/o) Index that corresponds to
33                                                    maximum criteria */
34     int16_t *bestGain)   /* (i/o) Gain in Q14 that corresponds
35                                                    to maximum criteria */
36 {
37   int16_t shOld, shNew, tmp16;
38   int16_t scaleTmp;
39   int32_t gainW32;
40 
41   /* Normalize the new and old Criteria to the same domain */
42   if (CritNewSh>(*shTotMax)) {
43     shOld=WEBRTC_SPL_MIN(31,CritNewSh-(*shTotMax));
44     shNew=0;
45   } else {
46     shOld=0;
47     shNew=WEBRTC_SPL_MIN(31,(*shTotMax)-CritNewSh);
48   }
49 
50   /* Compare the two criterias. If the new one is better,
51      calculate the gain and store this index as the new best one
52   */
53 
54   if ((CritNew >> shNew) > (*CritMax >> shOld)) {
55 
56     tmp16 = (int16_t)WebRtcSpl_NormW32(cDotNew);
57     tmp16 = 16 - tmp16;
58 
59     /* Calculate the gain in Q14
60        Compensate for inverseEnergyshift in Q29 and that the energy
61        value was stored in a int16_t (shifted down 16 steps)
62        => 29-14+16 = 31 */
63 
64     scaleTmp = -energyShiftNew-tmp16+31;
65     scaleTmp = WEBRTC_SPL_MIN(31, scaleTmp);
66 
67     gainW32 = ((int16_t)WEBRTC_SPL_SHIFT_W32(cDotNew, -tmp16) * invEnergyNew) >>
68         scaleTmp;
69 
70     /* Check if criteria satisfies Gain criteria (max 1.3)
71        if it is larger set the gain to 1.3
72        (slightly different from FLP version)
73     */
74     if (gainW32>21299) {
75       *bestGain=21299;
76     } else if (gainW32<-21299) {
77       *bestGain=-21299;
78     } else {
79       *bestGain=(int16_t)gainW32;
80     }
81 
82     *CritMax=CritNew;
83     *shTotMax=CritNewSh;
84     *bestIndex = IndexNew;
85   }
86 
87   return;
88 }
89