1d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* ------------------------------------------------------------------ 2d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 4d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * you may not use this file except in compliance with the License. 6d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * You may obtain a copy of the License at 7d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 8d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 10d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Unless required by applicable law or agreed to in writing, software 11d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * express or implied. 14d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * See the License for the specific language governing permissions 15d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * and limitations under the License. 16d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * ------------------------------------------------------------------- 17d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */ 18d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/**************************************************************************************** 19d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPortions of this file are derived from the following 3GPP standard: 20d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 21d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 3GPP TS 26.073 22d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Available from http://www.3gpp.org 24d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 25d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPermission to distribute, modify and use this file under the standard license 27d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberterms listed above has been obtained from the copyright holder. 28d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber****************************************************************************************/ 29d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 30d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 31d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 32d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 33d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 34d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pathname: ./audio/gsm-amr/c/src/calc_en.c 35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Funtions: calc_unfilt_energies 36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber calc_filt_energies 37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber calc_target_energy 38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION 41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This file contains the functions that calculate the energy coefficients 43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for unfiltered and filtered excitation signals, the LTP coding gain, and 44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the target energy. 45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES 52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "calc_en.h" 55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "typedef.h" 56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basicop_malloc.h" 57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "l_comp.h" 58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h" 59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "log2.h" 60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h" 61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS 64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here 65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES 70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional 71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also. 72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS 77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration 78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS 82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module 83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: calc_unfilt_energies 89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber res = LP residual, buffer type Word16 94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exc = LTP excitation (unfiltered), buffer type Word16 95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber code = CB innovation (unfiltered), buffer type Word16 96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber gain_pit = pitch gain, type Word16 97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_subfr = Subframe length, type Word16 98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en = energy coefficients (4), fraction part, buffer type Word16 99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en = energy coefficients (4), exponent part, buffer type Word16 100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ltpg = LTP coding gain (log2()), pointer to type Word16 101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow= pointer to value indicating existence of overflow (Flag) 102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en buffer containing new fractional parts of energy coefficients 105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en buffer containing new exponential parts of energy coefficients 106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ltpg points to new LTP coding gain 107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = 1 if there is an overflow else it is zero. 108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function calculates several energy coefficients for unfiltered 122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber excitation signals and the LTP coding gain 123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[0]*2^exp_en[0] = <res res> LP residual energy 125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[1]*2^exp_en[1] = <exc exc> LTP residual energy 126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[2]*2^exp_en[2] = <exc code> LTP/CB innovation dot product 127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[3]*2^exp_en[3] = <lres lres> LTP residual energy 128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (lres = res - gain_pit*exc) 129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ltpg = log2(LP_res_en / LTP_res_en) 130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber calc_en.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid 145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubercalc_unfilt_energies( 146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 res[], // i : LP residual, Q0 147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exc[], // i : LTP excitation (unfiltered), Q0 148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 code[], // i : CB innovation (unfiltered), Q13 149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 gain_pit, // i : pitch gain, Q14 150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 L_subfr, // i : Subframe length 151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac_en[], // o : energy coefficients (4), fraction part, Q15 153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp_en[], // o : energy coefficients (4), exponent part, Q0 154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *ltpg // o : LTP coding gain (log2()), Q13 155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s, L_temp; 158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i, exp, tmp; 159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 ltp_res_en, pred_gain; 160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 ltpg_exp, ltpg_frac; 161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute residual energy 163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac((Word32) 0, res[0], res[0]); 164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_subfr; i++) 165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, res[i], res[i]); 166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // ResEn := 0 if ResEn < 200.0 (= 400 Q1) 168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (L_sub (s, 400L) < 0) 169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[0] = 0; 171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[0] = -15; 172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[0] = extract_h(L_shl(s, exp)); 177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[0] = sub(15, exp); 178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute ltp excitation energy 181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac((Word32) 0, exc[0], exc[0]); 182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_subfr; i++) 183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, exc[i], exc[i]); 184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[1] = extract_h(L_shl(s, exp)); 187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[1] = sub(15, exp); 188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product <exc[],code[]> 190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac((Word32) 0, exc[0], code[0]); 191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_subfr; i++) 192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, exc[i], code[i]); 193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[2] = extract_h(L_shl(s, exp)); 196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[2] = sub(16-14, exp); 197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute energy of LTP residual 199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0L; 200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_subfr; i++) 201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_mult(exc[i], gain_pit); 203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_shl(L_temp, 1); 204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp = sub(res[i], pv_round(L_temp)); // LTP residual, Q0 205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac (s, tmp, tmp); 206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ltp_res_en = extract_h (L_shl (s, exp)); 210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = sub (15, exp); 211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[3] = ltp_res_en; 213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[3] = exp; 214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // calculate LTP coding gain, i.e. energy reduction LP res -> LTP res 216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (ltp_res_en > 0 && frac_en[0] != 0) 217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // gain = ResEn / LTPResEn 219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pred_gain = div_s (shr (frac_en[0], 1), ltp_res_en); 220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = sub (exp, exp_en[0]); 221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // L_temp = ltpGain * 2^(30 + exp) 223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_deposit_h (pred_gain); 224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // L_temp = ltpGain * 2^27 225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_shr (L_temp, add (exp, 3)); 226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Log2 = log2() + 27 228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Log2(L_temp, <pg_exp, <pg_frac); 229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // ltpg = log2(LtpGain) * 2^13 --> range: +- 4 = +- 12 dB 231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_Comp (sub (ltpg_exp, 27), ltpg_frac); 232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ltpg = pv_round (L_shl (L_temp, 13)); // Q13 233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ltpg = 0; 237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid calc_unfilt_energies( 265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 res[], /* i : LP residual, Q0 */ 266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exc[], /* i : LTP excitation (unfiltered), Q0 */ 267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 code[], /* i : CB innovation (unfiltered), Q13 */ 268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 gain_pit, /* i : pitch gain, Q14 */ 269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 L_subfr, /* i : Subframe length */ 270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac_en[], /* o : energy coefficients (4), fraction part, Q15 */ 272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp_en[], /* o : energy coefficients (4), exponent part, Q0 */ 273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *ltpg, /* o : LTP coding gain (log2()), Q13 */ 274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow 275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s1; /* Intermediate energy accumulator */ 278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s2; /* Intermediate energy accumulator */ 279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s3; /* Intermediate energy accumulator */ 280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s4; /* Intermediate energy accumulator */ 281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 L_temp; /* temporal 32 bits storage */ 282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; /* index used in all loops */ 284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp; /* nunmber of '0's or '1's before MSB != 0 */ 285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 tmp1; /* temporal storage */ 286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 tmp2; /* temporal storage */ 287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 ltp_res_en; 288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 pred_gain; /* predictor gain */ 289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 ltpg_exp; /* LTP gain (exponent) */ 290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 ltpg_frac; /* LTP gain (mantissa or fractional part) */ 291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = 0; 293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = 0; 294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = 0; 295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s4 = 0; 296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /*---------------------------------------------------------------------------- 298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber NOTE: Overflow is expected as a result of multiply and accumulated without 299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scale down the inputs. This modification is not made at this point 300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber to have bit exact results with the pre-optimization code. (JT 6/20/00) 301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ----------------------------------------------------------------------------*/ 303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_subfr; i++) 305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp1 = res[i]; /* avoid multiple accesses to memory */ 307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp2 = exc[i]; 308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = amrnb_fxp_mac_16_by_16bb((Word32) tmp1, (Word32) tmp1, s1); /* Compute residual energy */ 310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = amrnb_fxp_mac_16_by_16bb((Word32) tmp2, (Word32) tmp2, s2); /* Compute ltp excitation energy */ 311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = amrnb_fxp_mac_16_by_16bb((Word32) tmp2, (Word32) code[i], s3);/* Compute scalar product */ 312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* <exc[],code[]> */ 313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_mult(tmp2, gain_pit, pOverflow); 315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_shl(L_temp, 1, pOverflow); 316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp2 = sub(tmp1, pv_round(L_temp, pOverflow), pOverflow); 317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* LTP residual, Q0 */ 318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s4 = L_mac(s4, tmp2, tmp2, pOverflow); 319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute energy of LTP residual */ 320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = s1 << 1; 322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = s2 << 1; 323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = s3 << 1; 324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (s1 & MIN_32) 326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = MAX_32; 328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *pOverflow = 1; 329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* ResEn := 0 if ResEn < 200.0 (= 400 Q1) */ 332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (s1 < 400L) 333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[0] = 0; 335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[0] = -15; 336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s1); 340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[0] = (Word16)(L_shl(s1, exp, pOverflow) >> 16); 341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[0] = (15 - exp); 342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (s2 & MIN_32) 345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = MAX_32; 347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *pOverflow = 1; 348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s2); 351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[1] = (Word16)(L_shl(s2, exp, pOverflow) >> 16); 352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[1] = sub(15, exp, pOverflow); 353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* s3 is not always sum of squares */ 355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s3); 356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[2] = (Word16)(L_shl(s3, exp, pOverflow) >> 16); 357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[2] = 2 - exp; 358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s4); 360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ltp_res_en = (Word16)(L_shl(s4, exp, pOverflow) >> 16); 361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = sub(15, exp, pOverflow); 362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_en[3] = ltp_res_en; 364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_en[3] = exp; 365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* calculate LTP coding gain, i.e. energy reduction LP res -> LTP res */ 367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (ltp_res_en > 0 && frac_en[0] != 0) 369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* gain = ResEn / LTPResEn */ 371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pred_gain = div_s(shr(frac_en[0], 1, pOverflow), ltp_res_en); 372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = sub(exp, exp_en[0], pOverflow); 373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* L_temp = ltpGain * 2^(30 + exp) */ 375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = (Word32) pred_gain << 16; 376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* L_temp = ltpGain * 2^27 */ 377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_shr(L_temp, (Word16)(exp + 3), pOverflow); 378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Log2 = log2() + 27 */ 380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Log2(L_temp, <pg_exp, <pg_frac, pOverflow); 381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* ltpg = log2(LtpGain) * 2^13 --> range: +- 4 = +- 12 dB */ 383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber L_temp = L_Comp(sub(ltpg_exp, 27, pOverflow), ltpg_frac, pOverflow); 384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ltpg = pv_round(L_shl(L_temp, 13, pOverflow), pOverflow); /* Q13 */ 385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *ltpg = 0; 389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: calc_filt_energies 400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber mode = coder mode, type Mode 405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber xn = LTP target vector, buffer type Word16 406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber xn2 = CB target vector, buffer type Word16 407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber y1 = Adaptive codebook, buffer type Word16 408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Y2 = Filtered innovative vector, buffer type Word16 409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber g_coeff = Correlations <xn y1> <y1 y1> 410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber computed in G_pitch() buffer type Word16 411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff = energy coefficients (5), fraction part, buffer type Word16 412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff = energy coefficients (5), exponent part, buffer type Word16 413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cod_gain_frac = optimum codebook gain (fraction part), pointer type Word16 414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cod_gain_exp = optimum codebook gain (exponent part), pointer type Word16 415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = pointer to overflow indicator (Flag) 416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff contains new fraction part energy coefficients 419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff contains new exponent part energy coefficients 420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cod_gain_frac points to the new optimum codebook gain (fraction part) 421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cod_gain_exp points to the new optimum codebook gain (exponent part) 422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = 1 if there is an overflow else it is zero. 423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function calculates several energy coefficients for filtered 437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber excitation signals 438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Compute coefficients need for the quantization and the optimum 440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber codebook gain gcu (for MR475 only). 441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber coeff[0] = y1 y1 443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber coeff[1] = -2 xn y1 444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber coeff[2] = y2 y2 445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber coeff[3] = -2 xn y2 446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber coeff[4] = 2 y1 y2 447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber gcu = <xn2, y2> / <y2, y2> (0 if <xn2, y2> <= 0) 449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Product <y1 y1> and <xn y1> have been computed in G_pitch() and 451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber are in vector g_coeff[]. 452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber calc_en.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid 467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubercalc_filt_energies( 468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber enum Mode mode, // i : coder mode 469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], // i : LTP target vector, Q0 470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn2[], // i : CB target vector, Q0 471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 y1[], // i : Adaptive codebook, Q0 472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 Y2[], // i : Filtered innovative vector, Q12 473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 g_coeff[], // i : Correlations <xn y1> <y1 y1> 474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // computed in G_pitch() 475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac_coeff[],// o : energy coefficients (5), fraction part, Q15 477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp_coeff[], // o : energy coefficients (5), exponent part, Q0 478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *cod_gain_frac,// o: optimum codebook gain (fraction part), Q15 479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *cod_gain_exp // o: optimum codebook gain (exponent part), Q0 480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s, ener_init; 483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i, exp, frac; 484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 y2[L_SUBFR]; 485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(mode, MR795) == 0 || sub(mode, MR475) == 0) 487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ener_init = 0L; 489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ener_init = 1L; 493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_SUBFR; i++) { 496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber y2[i] = shr(Y2[i], 3); 497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[0] = g_coeff[0]; 500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[0] = g_coeff[1]; 501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[1] = negate(g_coeff[2]); // coeff[1] = -2 xn y1 502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[1] = add(g_coeff[3], 1); 503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product <y2[],y2[]> 506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(ener_init, y2[0], y2[0]); 508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_SUBFR; i++) 509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, y2[i], y2[i]); 510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[2] = extract_h(L_shl(s, exp)); 513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[2] = sub(15 - 18, exp); 514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product -2*<xn[],y2[]> 516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(ener_init, xn[0], y2[0]); 518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_SUBFR; i++) 519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, xn[i], y2[i]); 520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[3] = negate(extract_h(L_shl(s, exp))); 523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[3] = sub(15 - 9 + 1, exp); 524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product 2*<y1[],y2[]> 527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(ener_init, y1[0], y2[0]); 529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_SUBFR; i++) 530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, y1[i], y2[i]); 531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[4] = extract_h(L_shl(s, exp)); 534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[4] = sub(15 - 9 + 1, exp); 535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (sub(mode, MR475) == 0 || sub(mode, MR795) == 0) 537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product <xn2[],y2[]> 539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(ener_init, xn2[0], y2[0]); 541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_SUBFR; i++) 542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, xn2[i], y2[i]); 543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = extract_h(L_shl(s, exp)); 546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = sub(15 - 9, exp); 547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (frac <= 0) 550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_frac = 0; 552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_exp = 0; 553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // 557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber gcu = <xn2, y2> / c[2] 558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = (frac>>1)/frac[2] * 2^(exp+1-exp[2]) 559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = div_s(frac>>1, frac[2])*2^-15 * 2^(exp+1-exp[2]) 560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = div_s * 2^(exp-exp[2]-14) 561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_frac = div_s (shr (frac,1), frac_coeff[2]); 563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_exp = sub (sub (exp, exp_coeff[2]), 14); 564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid calc_filt_energies( 593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber enum Mode mode, /* i : coder mode */ 594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], /* i : LTP target vector, Q0 */ 595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn2[], /* i : CB target vector, Q0 */ 596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 y1[], /* i : Adaptive codebook, Q0 */ 597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 Y2[], /* i : Filtered innovative vector, Q12 */ 598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 g_coeff[], /* i : Correlations <xn y1> <y1 y1> */ 599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* computed in G_pitch() */ 600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac_coeff[], /* o : energy coefficients (5), fraction part, Q15 */ 601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp_coeff[], /* o : energy coefficients (5), exponent part, Q0 */ 602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *cod_gain_frac, /* o : optimum codebook gain (fraction part),Q15 */ 603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *cod_gain_exp, /* o : optimum codebook gain (exponent part), Q0 */ 604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow 605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s1; /* Intermediate energy accumulator */ 608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s2; /* Intermediate energy accumulator */ 609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s3; /* Intermediate energy accumulator */ 610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; /* index used in all loops */ 612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp; /* number of '0's or '1's before MSB != 0 */ 613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 frac; /* fractional part */ 614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 tmp; /* temporal storage */ 615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 scaled_y2[L_SUBFR]; 616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[0] = g_coeff[0]; 619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[0] = g_coeff[1]; 620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */ 621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[1] = add(g_coeff[3], 1, pOverflow); 622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((mode == MR795) || (mode == MR475)) 624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = 0L; 626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = 0L; 627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = 0L; 628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = 1L; 632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = 1L; 633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = 1L; 634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_SUBFR; i++) 637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* avoid multiple accesses to memory */ 639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber tmp = (Y2[i] >> 3); 640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber scaled_y2[i] = tmp; 641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute scalar product <scaled_y2[],scaled_y2[]> */ 643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = L_mac(s1, tmp, tmp, pOverflow); 644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute scalar product -2*<xn[],scaled_y2[]> */ 646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s2 = L_mac(s2, xn[i], tmp, pOverflow); 647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute scalar product 2*<y1[],scaled_y2[]> */ 649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s3 = L_mac(s3, y1[i], tmp, pOverflow); 650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s1); 653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[2] = (Word16)(L_shl(s1, exp, pOverflow) >> 16); 654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[2] = (-3 - exp); 655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s2); 657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[3] = negate((Word16)(L_shl(s2, exp, pOverflow) >> 16)); 658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[3] = (7 - exp); 659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s3); 661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac_coeff[4] = (Word16)(L_shl(s3, exp, pOverflow) >> 16); 662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp_coeff[4] = sub(7, exp, pOverflow); 663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if ((mode == MR795) || (mode == MR475)) 666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute scalar product <xn2[],scaled_y2[]> */ 668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = 0L; 669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_SUBFR; i++) 671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = amrnb_fxp_mac_16_by_16bb((Word32) xn2[i], (Word32)scaled_y2[i], s1); 673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s1 = s1 << 1; 676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s1); 678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber frac = (Word16)(L_shl(s1, exp, pOverflow) >> 16); 679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = (6 - exp); 680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (frac <= 0) 682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_frac = 0; 684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_exp = 0; 685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* 689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber gcu = <xn2, scaled_y2> / c[2] 690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = (frac>>1)/frac[2] * 2^(exp+1-exp[2]) 691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = div_s(frac>>1, frac[2])*2^-15 * 2^(exp+1-exp[2]) 692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber = div_s * 2^(exp-exp[2]-14) 693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */ 694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_frac = div_s(shr(frac, 1, pOverflow), frac_coeff[2]); 695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *cod_gain_exp = ((exp - exp_coeff[2]) - 14); 696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/ 703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: calc_target_energy 707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber xn = LTP target vector, buffer to type Word16 Q0 712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber en_exp = optimum codebook gain (exponent part) pointer to type Word16 713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber en_frac = optimum codebook gain (fraction part) pointer to type Word16 714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = pointer to overflow indicator (Flag) 715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber en_exp points to new optimum codebook gain (exponent part) 718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber en_frac points to new optimum codebook gain (fraction part) 719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow = 1 if there is an overflow else it is zero. 720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function calculates the target energy using the formula, 734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber en = <xn, xn> 735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None. 740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber calc_en.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid 750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubercalc_target_energy( 751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], // i: LTP target vector, Q0 752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *en_exp, // o: optimum codebook gain (exponent part), Q0 753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *en_frac // o: optimum codebook gain (fraction part), Q15 754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s; 757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i, exp; 758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // Compute scalar product <xn[], xn[]> 760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(0L, xn[0], xn[0]); 761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 1; i < L_SUBFR; i++) 762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = L_mac(s, xn[i], xn[i]); 763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 764d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber // s = SUM 2*xn(i) * xn(i) = <xn xn> * 2 765d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 766d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *en_frac = extract_h(L_shl(s, exp)); 767d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *en_exp = sub(16, exp); 768d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 769d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 770d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 771d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 772d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 773d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 774d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 775d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 776d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 777d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 778d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 779d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 780d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 781d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 782d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 783d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 784d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 785d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 786d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 787d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 788d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 789d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 790d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 791d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 792d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 793d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid calc_target_energy( 794d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 xn[], /* i: LTP target vector, Q0 */ 795d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *en_exp, /* o: optimum codebook gain (exponent part), Q0 */ 796d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 *en_frac, /* o: optimum codebook gain (fraction part), Q15 */ 797d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow 798d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 799d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 800d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word32 s; /* Intermediate energy accumulator */ 801d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; /* index used in all loops */ 802d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 exp; 803d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 804d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* Compute scalar product <xn[], xn[]> */ 805d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = 0; 806d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber for (i = 0; i < L_SUBFR; i++) 807d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 808d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = amrnb_fxp_mac_16_by_16bb((Word32) xn[i], (Word32) xn[i], s); 809d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 810d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 811d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (s < 0) 812d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 813d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *pOverflow = 1; 814d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber s = MAX_32; 815d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 816d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 817d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* s = SUM 2*xn(i) * xn(i) = <xn xn> * 2 */ 818d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber exp = norm_l(s); 819d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *en_frac = (Word16)(L_shl(s, exp, pOverflow) >> 16); 820d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *en_exp = (16 - exp); 821d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 822d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return; 823d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 824d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 825d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 826