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