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, &ltpg_exp, &ltpg_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, &ltpg_exp, &ltpg_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