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