Home | History | Annotate | Download | only in ilbc
      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 int16_t WebRtcIlbcfix_FrameClassify(
     27     /* (o) Index to the max-energy sub frame */
     28     iLBC_Enc_Inst_t *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   int16_t pos;
     39   int 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(WEBRTC_SPL_MUL_16_16(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, (int16_t)(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, (int16_t)(iLBCenc_inst->nsub-1)) + 1;
     86 
     87   return(pos);
     88 }
     89