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_CbMemEnergy.c
     16 
     17 ******************************************************************/
     18 
     19 #include "defines.h"
     20 #include "constants.h"
     21 #include "cb_mem_energy_calc.h"
     22 
     23 /*----------------------------------------------------------------*
     24  *  Function WebRtcIlbcfix_CbMemEnergy computes the energy of all
     25  * the vectors in the codebook memory that will be used in the
     26  * following search for the best match.
     27  *----------------------------------------------------------------*/
     28 
     29 void WebRtcIlbcfix_CbMemEnergy(
     30     int16_t range,
     31     int16_t *CB,   /* (i) The CB memory (1:st section) */
     32     int16_t *filteredCB,  /* (i) The filtered CB memory (2:nd section) */
     33     int16_t lMem,   /* (i) Length of the CB memory */
     34     int16_t lTarget,   /* (i) Length of the target vector */
     35     int16_t *energyW16,  /* (o) Energy in the CB vectors */
     36     int16_t *energyShifts, /* (o) Shift value of the energy */
     37     int16_t scale,   /* (i) The scaling of all energy values */
     38     int16_t base_size  /* (i) Index to where the energy values should be stored */
     39                                ) {
     40   int16_t *ppi, *ppo, *pp;
     41   int32_t energy, tmp32;
     42 
     43   /* Compute the energy and store it in a vector. Also the
     44    * corresponding shift values are stored. The energy values
     45    * are reused in all three stages. */
     46 
     47   /* Calculate the energy in the first block of 'lTarget' sampels. */
     48   ppi = CB+lMem-lTarget-1;
     49   ppo = CB+lMem-1;
     50 
     51   pp=CB+lMem-lTarget;
     52   energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
     53 
     54   /* Normalize the energy and store the number of shifts */
     55   energyShifts[0] = (int16_t)WebRtcSpl_NormW32(energy);
     56   tmp32 = WEBRTC_SPL_LSHIFT_W32(energy, energyShifts[0]);
     57   energyW16[0] = (int16_t)WEBRTC_SPL_RSHIFT_W32(tmp32, 16);
     58 
     59   /* Compute the energy of the rest of the cb memory
     60    * by step wise adding and subtracting the next
     61    * sample and the last sample respectively. */
     62   WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, 0);
     63 
     64   /* Next, precompute the energy values for the filtered cb section */
     65   energy=0;
     66   pp=filteredCB+lMem-lTarget;
     67 
     68   energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
     69 
     70   /* Normalize the energy and store the number of shifts */
     71   energyShifts[base_size] = (int16_t)WebRtcSpl_NormW32(energy);
     72   tmp32 = WEBRTC_SPL_LSHIFT_W32(energy, energyShifts[base_size]);
     73   energyW16[base_size] = (int16_t)WEBRTC_SPL_RSHIFT_W32(tmp32, 16);
     74 
     75   ppi = filteredCB + lMem - 1 - lTarget;
     76   ppo = filteredCB + lMem - 1;
     77 
     78   WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, base_size);
     79 }
     80