1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/******************************************************************
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com iLBC Speech Coder ANSI-C Source Code
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtcIlbcfix_CbUpdateBestIndex.c
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com******************************************************************/
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "defines.h"
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "cb_update_best_index.h"
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "constants.h"
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid WebRtcIlbcfix_CbUpdateBestIndex(
240946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int32_t CritNew,    /* (i) New Potentially best Criteria */
250946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t CritNewSh,   /* (i) Shift value of above Criteria */
26dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t IndexNew,   /* (i) Index of new Criteria */
270946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int32_t cDotNew,    /* (i) Cross dot of new index */
280946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t invEnergyNew,  /* (i) Inversed energy new index */
290946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t energyShiftNew,  /* (i) Energy shifts of new index */
300946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int32_t *CritMax,   /* (i/o) Maximum Criteria (so far) */
310946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *shTotMax,   /* (i/o) Shifts of maximum criteria */
32dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t *bestIndex,   /* (i/o) Index that corresponds to
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                                   maximum criteria */
340946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *bestGain)   /* (i/o) Gain in Q14 that corresponds
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                                   to maximum criteria */
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
370946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int16_t shOld, shNew, tmp16;
380946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int16_t scaleTmp;
390946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int32_t gainW32;
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Normalize the new and old Criteria to the same domain */
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (CritNewSh>(*shTotMax)) {
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    shOld=WEBRTC_SPL_MIN(31,CritNewSh-(*shTotMax));
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    shNew=0;
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    shOld=0;
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    shNew=WEBRTC_SPL_MIN(31,(*shTotMax)-CritNewSh);
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Compare the two criterias. If the new one is better,
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com     calculate the gain and store this index as the new best one
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  */
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5478ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org  if ((CritNew >> shNew) > (*CritMax >> shOld)) {
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
560946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    tmp16 = (int16_t)WebRtcSpl_NormW32(cDotNew);
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    tmp16 = 16 - tmp16;
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Calculate the gain in Q14
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       Compensate for inverseEnergyshift in Q29 and that the energy
610946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org       value was stored in a int16_t (shifted down 16 steps)
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       => 29-14+16 = 31 */
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    scaleTmp = -energyShiftNew-tmp16+31;
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    scaleTmp = WEBRTC_SPL_MIN(31, scaleTmp);
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
672f6ae0de5b0ca98cdcf3fd3c5a9848a5814aadddbjornv@webrtc.org    gainW32 = ((int16_t)WEBRTC_SPL_SHIFT_W32(cDotNew, -tmp16) * invEnergyNew) >>
682f6ae0de5b0ca98cdcf3fd3c5a9848a5814aadddbjornv@webrtc.org        scaleTmp;
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Check if criteria satisfies Gain criteria (max 1.3)
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       if it is larger set the gain to 1.3
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       (slightly different from FLP version)
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    */
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (gainW32>21299) {
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      *bestGain=21299;
76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else if (gainW32<-21299) {
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      *bestGain=-21299;
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
790946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org      *bestGain=(int16_t)gainW32;
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    *CritMax=CritNew;
83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    *shTotMax=CritNewSh;
84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    *bestIndex = IndexNew;
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return;
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
89