1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.173
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Filename: isp_az.cpp
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Date: 05/08/2004
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     int16 isp[],              (i) Q15 : Immittance spectral pairs
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     int16 a[],                (o) Q12 : predictor coefficients (order=M)
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     int16 m,                  (i)     : order
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     int16 adaptive_scaling    (i) 0   : adaptive scaling disabled
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                   1   : adaptive scaling enabled
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Compute the LPC coefficients from isp (order=M)
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pv_amr_wb_type_defs.h"
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwbdecoder_basic_op.h"
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwbdecoder_cnst.h"
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwbdecoder_acelp.h"
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwb_math_op.h"
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also.
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NC (M/2)
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NC16k (M16k/2)
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#ifdef __cplusplus
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberextern "C"
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    void Get_isp_pol(int16 * isp, int32 * f, int16 n);
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    void Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n);
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#ifdef __cplusplus
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; EXTERNAL FUNCTION REFERENCES
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Declare functions defined elsewhere and referenced in this module
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Declare variables used in this module but defined elsewhere
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; FUNCTION CODE
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Isp_Az(
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 isp[],            /* (i) Q15 : Immittance spectral pairs         */
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 a[],              /* (o) Q12 : predictor coefficients (order=M)  */
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 m,                /* (i)     : order                     */
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 adaptive_scaling  /* (i) 0   : adaptive scaling disabled */
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*     1   : adaptive scaling enabled  */
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, j;
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 f1[NC16k + 1], f2[NC16k];
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 nc;
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 t0;
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 t1;
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 q, q_sug;
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 tmax;
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    nc = m >> 1;
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (nc > 8)
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Get_isp_pol_16kHz(&isp[0], f1, nc);
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i <= nc; i++)
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            f1[i] = shl_int32(f1[i], 2);
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Get_isp_pol_16kHz(&isp[1], f2, nc - 1);
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i <= nc - 1; i++)
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            f2[i] = shl_int32(f2[i], 2);
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Get_isp_pol(&isp[0], f1, nc);
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Get_isp_pol(&isp[1], f2, nc - 1);
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *  Multiply F2(z) by (1 - z^-2)
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     */
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = nc - 1; i > 1; i--)
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f2[i] -= f2[i - 2];      /* f2[i] -= f2[i-2]; */
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1])
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     */
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < nc; i++)
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* f1[i] *= (1.0 + isp[M-1]); */
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* f2[i] *= (1.0 - isp[M-1]); */
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = f1[i];
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = f2[i];
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = fxp_mul32_by_16b(t0, isp[m - 1]) << 1;
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = fxp_mul32_by_16b(t1, isp[m - 1]) << 1;
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f1[i] += t0;
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f2[i] -= t1;
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *  A(z) = (F1(z)+F2(z))/2
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *  F1(z) is symmetric and F2(z) is antisymmetric
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     */
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* a[0] = 1.0; */
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a[0] = 4096;
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tmax = 1;
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    j = m - 1;
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 1;  i < nc; i++)
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* a[i] = 0.5*(f1[i] + f2[i]); */
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* compute t1 = abs(t0) */
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = t0 - (t0 < 0);
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        tmax |= t1;
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* from Q23 to Q12 and * 0.5 */
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[i] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* a[j] = 0.5*(f1[i] - f2[i]); */
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* compute t1 = abs(t0) */
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = t0 - (t0 < 0);
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        tmax |= t1;
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* from Q23 to Q12 and * 0.5 */
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[j--] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* rescale data if overflow has occured and reprocess the loop */
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (adaptive_scaling == 1)
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        q = 4 - normalize_amr_wb(tmax);        /* adaptive scaling enabled */
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        q = 0;                   /* adaptive scaling disabled */
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (q > 0)
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        q_sug = 12 + q;
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 1, j = m - 1; i < nc; i++, j--)
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* a[i] = 0.5*(f1[i] + f2[i]); */
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* from Q23 to Q12 and * 0.5 */
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            a[i] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* a[j] = 0.5*(f1[i] - f2[i]); */
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* from Q23 to Q12 and * 0.5 */
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            a[j] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        a[0] >>=  q;
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        q_sug = 12;
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        q     = 0;
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    t0 = (int32)(((int64)f1[nc] * isp[m - 1]) >> 16) << 1;
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    t0 = add_int32(f1[nc], t0);
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* from Q23 to Q12 and * 0.5 */
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a[nc] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a[m] = shr_rnd(isp[m - 1], (3 + q));           /* from Q15 to Q12          */
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* a[m] = isp[m-1]; */
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
296a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberGet_isp_pol
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   isp[]   : isp vector (cosine domaine)         in Q15
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   f[]     : the coefficients of F1 or F2        in Q23
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   n       : == NC for F1(z); == NC-1 for F2(z)
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Find the polynomial F1(z) or F2(z) from the ISPs.
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  This is performed by expanding the product polynomials:
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  F1(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          i=0,2,4,6,8
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  F2(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          i=1,3,5,7
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  where isp_i are the ISPs in the cosine domain.
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; FUNCTION CODE
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Get_isp_pol(int16 * isp, int32 * f, int16 n)
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, j;
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 t0;
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* All computation in Q23 */
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[0] = 0x00800000;                        /* f[0] = 1.0;        in Q23  */
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[1] = -isp[0] << 9;                      /* f[1] = -2.0*isp[0] in Q23  */
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f += 2;                                   /* Advance f pointer          */
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    isp += 2;                                 /* Advance isp pointer        */
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 2; i <= n; i++)
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f = f[-2];
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 1; j < i; j++)
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = fxp_mul32_by_16b(f[-1], *isp);
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = shl_int32(t0, 2);
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *f -= t0;                      /* *f -= t0            */
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(f) += f[-2];                 /* *f += f[-2]         */
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            f--;
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f -= *isp << 9;
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f += i;                            /* Advance f pointer   */
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        isp += 2;                          /* Advance isp pointer */
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n)
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, j;
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 t0;
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* All computation in Q23 */
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[0] = 0x00200000;                        /* f[0] = 0.25;        in Q23  */
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f[1] = -isp[0] << 7;                      /* f[1] = -0.5*isp[0] in Q23  */
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    f += 2;                                   /* Advance f pointer          */
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    isp += 2;                                 /* Advance isp pointer        */
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 2; i <= n; i++)
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f = f[-2];
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 1; j < i; j++, f--)
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = fxp_mul32_by_16b(f[-1], *isp);
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0 = shl_int32(t0, 2);
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *f -= t0;                      /* *f -= t0            */
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *f += f[-2];                   /* *f += f[-2]         */
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *f -= *isp << 7;
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        f += i;                            /* Advance f pointer   */
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        isp += 2;                          /* Advance isp pointer */
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
404