| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| /****************************************************************** |
| |
| iLBC Speech Coder ANSI-C Source Code |
| |
| WebRtcIlbcfix_CbUpdateBestIndex.c |
| |
| ******************************************************************/ |
| |
| #include "modules/audio_coding/codecs/ilbc/cb_update_best_index.h" |
| |
| #include "modules/audio_coding/codecs/ilbc/constants.h" |
| #include "modules/audio_coding/codecs/ilbc/defines.h" |
| |
| void WebRtcIlbcfix_CbUpdateBestIndex( |
| int32_t CritNew, /* (i) New Potentially best Criteria */ |
| int16_t CritNewSh, /* (i) Shift value of above Criteria */ |
| size_t IndexNew, /* (i) Index of new Criteria */ |
| int32_t cDotNew, /* (i) Cross dot of new index */ |
| int16_t invEnergyNew, /* (i) Inversed energy new index */ |
| int16_t energyShiftNew, /* (i) Energy shifts of new index */ |
| int32_t *CritMax, /* (i/o) Maximum Criteria (so far) */ |
| int16_t *shTotMax, /* (i/o) Shifts of maximum criteria */ |
| size_t *bestIndex, /* (i/o) Index that corresponds to |
| maximum criteria */ |
| int16_t *bestGain) /* (i/o) Gain in Q14 that corresponds |
| to maximum criteria */ |
| { |
| int16_t shOld, shNew, tmp16; |
| int16_t scaleTmp; |
| int32_t gainW32; |
| |
| /* Normalize the new and old Criteria to the same domain */ |
| if (CritNewSh>(*shTotMax)) { |
| shOld=WEBRTC_SPL_MIN(31,CritNewSh-(*shTotMax)); |
| shNew=0; |
| } else { |
| shOld=0; |
| shNew=WEBRTC_SPL_MIN(31,(*shTotMax)-CritNewSh); |
| } |
| |
| /* Compare the two criterias. If the new one is better, |
| calculate the gain and store this index as the new best one |
| */ |
| |
| if ((CritNew >> shNew) > (*CritMax >> shOld)) { |
| |
| tmp16 = (int16_t)WebRtcSpl_NormW32(cDotNew); |
| tmp16 = 16 - tmp16; |
| |
| /* Calculate the gain in Q14 |
| Compensate for inverseEnergyshift in Q29 and that the energy |
| value was stored in a int16_t (shifted down 16 steps) |
| => 29-14+16 = 31 */ |
| |
| scaleTmp = -energyShiftNew-tmp16+31; |
| scaleTmp = WEBRTC_SPL_MIN(31, scaleTmp); |
| |
| gainW32 = ((int16_t)WEBRTC_SPL_SHIFT_W32(cDotNew, -tmp16) * invEnergyNew) >> |
| scaleTmp; |
| |
| /* Check if criteria satisfies Gain criteria (max 1.3) |
| if it is larger set the gain to 1.3 |
| (slightly different from FLP version) |
| */ |
| if (gainW32>21299) { |
| *bestGain=21299; |
| } else if (gainW32<-21299) { |
| *bestGain=-21299; |
| } else { |
| *bestGain=(int16_t)gainW32; |
| } |
| |
| *CritMax=CritNew; |
| *shTotMax=CritNewSh; |
| *bestIndex = IndexNew; |
| } |
| |
| return; |
| } |