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
23void WebRtcIlbcfix_CbUpdateBestIndex(
24    int32_t CritNew,    /* (i) New Potentially best Criteria */
25    int16_t CritNewSh,   /* (i) Shift value of above Criteria */
26    int16_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    int16_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 (WEBRTC_SPL_RSHIFT_W32(CritNew, shNew)>
55      WEBRTC_SPL_RSHIFT_W32((*CritMax),shOld)) {
56
57    tmp16 = (int16_t)WebRtcSpl_NormW32(cDotNew);
58    tmp16 = 16 - tmp16;
59
60    /* Calculate the gain in Q14
61       Compensate for inverseEnergyshift in Q29 and that the energy
62       value was stored in a int16_t (shifted down 16 steps)
63       => 29-14+16 = 31 */
64
65    scaleTmp = -energyShiftNew-tmp16+31;
66    scaleTmp = WEBRTC_SPL_MIN(31, scaleTmp);
67
68    gainW32 = WEBRTC_SPL_MUL_16_16_RSFT(
69        ((int16_t)WEBRTC_SPL_SHIFT_W32(cDotNew, -tmp16)), invEnergyNew, scaleTmp);
70
71    /* Check if criteria satisfies Gain criteria (max 1.3)
72       if it is larger set the gain to 1.3
73       (slightly different from FLP version)
74    */
75    if (gainW32>21299) {
76      *bestGain=21299;
77    } else if (gainW32<-21299) {
78      *bestGain=-21299;
79    } else {
80      *bestGain=(int16_t)gainW32;
81    }
82
83    *CritMax=CritNew;
84    *shTotMax=CritNewSh;
85    *bestIndex = IndexNew;
86  }
87
88  return;
89}
90