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_FrameClassify.c 16 17 ******************************************************************/ 18 19 #include "defines.h" 20 #include "constants.h" 21 22 /*----------------------------------------------------------------* 23 * Classification of subframes to localize start state 24 *---------------------------------------------------------------*/ 25 26 size_t WebRtcIlbcfix_FrameClassify( 27 /* (o) Index to the max-energy sub frame */ 28 IlbcEncoder *iLBCenc_inst, 29 /* (i/o) the encoder state structure */ 30 int16_t *residualFIX /* (i) lpc residual signal */ 31 ){ 32 int16_t max, scale; 33 int32_t ssqEn[NSUB_MAX-1]; 34 int16_t *ssqPtr; 35 int32_t *seqEnPtr; 36 int32_t maxW32; 37 int16_t scale1; 38 size_t pos; 39 size_t n; 40 41 /* 42 Calculate the energy of each of the 80 sample blocks 43 in the draft the 4 first and last samples are windowed with 1/5...4/5 44 and 4/5...1/5 respectively. To simplify for the fixpoint we have changed 45 this to 0 0 1 1 and 1 1 0 0 46 */ 47 48 max = WebRtcSpl_MaxAbsValueW16(residualFIX, iLBCenc_inst->blockl); 49 scale = WebRtcSpl_GetSizeInBits((uint32_t)(max * max)); 50 51 /* Scale to maximum 24 bits so that it won't overflow for 76 samples */ 52 scale = scale-24; 53 scale1 = WEBRTC_SPL_MAX(0, scale); 54 55 /* Calculate energies */ 56 ssqPtr=residualFIX + 2; 57 seqEnPtr=ssqEn; 58 for (n=(iLBCenc_inst->nsub-1); n>0; n--) { 59 (*seqEnPtr) = WebRtcSpl_DotProductWithScale(ssqPtr, ssqPtr, 76, scale1); 60 ssqPtr += 40; 61 seqEnPtr++; 62 } 63 64 /* Scale to maximum 20 bits in order to allow for the 11 bit window */ 65 maxW32 = WebRtcSpl_MaxValueW32(ssqEn, iLBCenc_inst->nsub - 1); 66 scale = WebRtcSpl_GetSizeInBits(maxW32) - 20; 67 scale1 = WEBRTC_SPL_MAX(0, scale); 68 69 /* Window each 80 block with the ssqEn_winTbl window to give higher probability for 70 the blocks in the middle 71 */ 72 seqEnPtr=ssqEn; 73 if (iLBCenc_inst->mode==20) { 74 ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin+1; 75 } else { 76 ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin; 77 } 78 for (n=(iLBCenc_inst->nsub-1); n>0; n--) { 79 (*seqEnPtr)=WEBRTC_SPL_MUL(((*seqEnPtr)>>scale1), (*ssqPtr)); 80 seqEnPtr++; 81 ssqPtr++; 82 } 83 84 /* Extract the best choise of start state */ 85 pos = WebRtcSpl_MaxIndexW32(ssqEn, iLBCenc_inst->nsub - 1) + 1; 86 87 return(pos); 88 } 89