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_CbMemEnergy.c
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com******************************************************************/
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "defines.h"
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "constants.h"
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "cb_mem_energy_calc.h"
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*----------------------------------------------------------------*
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Function WebRtcIlbcfix_CbMemEnergy computes the energy of all
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * the vectors in the codebook memory that will be used in the
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * following search for the best match.
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *----------------------------------------------------------------*/
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid WebRtcIlbcfix_CbMemEnergy(
30dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t range,
310946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *CB,   /* (i) The CB memory (1:st section) */
320946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *filteredCB,  /* (i) The filtered CB memory (2:nd section) */
33dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t lMem,   /* (i) Length of the CB memory */
34dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t lTarget,   /* (i) Length of the target vector */
350946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *energyW16,  /* (o) Energy in the CB vectors */
360946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *energyShifts, /* (o) Shift value of the energy */
37a8b335c709b244685345cfabb3b72ce672a09d96Peter Kasting    int scale,   /* (i) The scaling of all energy values */
38dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting    size_t base_size  /* (i) Index to where energy values should be stored */
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                               ) {
400946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int16_t *ppi, *ppo, *pp;
410946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int32_t energy, tmp32;
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Compute the energy and store it in a vector. Also the
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com   * corresponding shift values are stored. The energy values
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com   * are reused in all three stages. */
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Calculate the energy in the first block of 'lTarget' sampels. */
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ppi = CB+lMem-lTarget-1;
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ppo = CB+lMem-1;
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  pp=CB+lMem-lTarget;
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Normalize the energy and store the number of shifts */
550946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  energyShifts[0] = (int16_t)WebRtcSpl_NormW32(energy);
564ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org  tmp32 = energy << energyShifts[0];
5778ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org  energyW16[0] = (int16_t)(tmp32 >> 16);
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Compute the energy of the rest of the cb memory
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com   * by step wise adding and subtracting the next
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com   * sample and the last sample respectively. */
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, 0);
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Next, precompute the energy values for the filtered cb section */
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  energy=0;
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  pp=filteredCB+lMem-lTarget;
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Normalize the energy and store the number of shifts */
710946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  energyShifts[base_size] = (int16_t)WebRtcSpl_NormW32(energy);
724ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org  tmp32 = energy << energyShifts[base_size];
7378ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org  energyW16[base_size] = (int16_t)(tmp32 >> 16);
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ppi = filteredCB + lMem - 1 - lTarget;
76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ppo = filteredCB + lMem - 1;
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, base_size);
79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
80