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/cor_h.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     Date: 06/12/2000
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Updated template used to PV coding template. First attempt at
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          optimizing C code.
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Used MAX_16 and MIN_16 when checking the result of Inv_sqrt.
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          Synced up to the new template.
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Added setting of Overflow flag in inlined code.
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Took out cor_h_x function and put it in its own file. Sync'ed
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          up with the single_func_template.c template. Delete version
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          ID variable.
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Synchronized file with UTMS version 3.2.0. Updated coding
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              template. Removed unnecessary include files.
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Fixed portion of the code that builds the rr[] matrix. There
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              was an error in the original inlining of code that caused
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              the code to be not bit-exact with UMTS version 3.2.0.
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Added calls to L_add() and mult() in the code to handle overflow
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              scenario. Moved cor_h.h after cnst.h in the Include section.
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              Doing this allows the unit test to build using the cnst.h in the
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              /test/include directory. Fixed initialization of the accumulator
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              in the first calculation of the sum of squares.
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              1. Used #define value instead of hard-coded numbers in the code.
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              2. Fixed typecasting issue with TI C compiler.
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              3. Removed typecasting of 0x00008000L in the call to L_add.
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Changed pOverflow from a global variable into a function
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber parameter.
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            1. Added pointer to avoid adding offsets in every pass
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            2. Eliminate variables defined as registers
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            3. Removed extra check for overflow by doing scaling right
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               after overflow is detected.
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            4. Eliminated calls to basic operations (like extract) not
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               needed because of the nature of the number (all bounded)
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            5. Eliminated duplicate loop accessing same data
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            6. Simplified matrix addressing by use of pointers
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              1. Eliminated unused include files.
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              2. Access twice the number of points when delaing with matrices
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 and in the process only 3 pointers (instead of 4) are needed
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              3. Replaced array addressing (array sign[]) by pointers
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Changed round function name to pv_round to avoid conflict with
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              round function in C standard library.
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Using inlines from fxp_arithmetic.h .
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Replacing fxp_arithmetic.h with basic_op.h.
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cor_h.h"
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basicop_malloc.h"
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inv_sqrt.h"
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h"
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: cor_h
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h = vector containing the impulse response of the weighted synthesis
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        filter; vector contents are of type Word16; vector length is
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        2 * L_SUBFR
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    sign = vector containing the sign information for the correlation
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           values; vector contents are of type Word16; vector length is
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           L_CODE
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rr = autocorrelation matrix; matrix contents are of type Word16;
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         matrix dimension is L_CODE by L_CODE
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rr contents are the newly calculated autocorrelation values
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function computes correlations of the impulse response (h) needed for
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the codebook search, and includes the sign information into the correlations.
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The correlations are given by:
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rr[i][j] = sum_{n=i}^{L-1} h[n-i] h[n-j];   i>=j; i,j=0,...,L-1
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The sign information is included by:
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rr[i][j] = rr[i][j]*sign[i]*sign[j]
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cor_h.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid cor_h (
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],         // (i) : impulse response of weighted synthesis
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                 filter
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[],      // (i) : sign of d[n]
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rr[][L_CODE] // (o) : matrix of autocorrelation
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i, j, k, dec, h2[L_CODE];
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Scaling for maximum precision
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 2;
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_CODE; i++)
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, h[i], h[i]);
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    j = sub (extract_h (s), 32767);
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (j == 0)
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (i = 0; i < L_CODE; i++)
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            h2[i] = shr (h[i], 1);
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_shr (s, 1);
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        k = extract_h (L_shl (Inv_sqrt (s), 7));
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        k = mult (k, 32440);                     // k = 0.99*k
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (i = 0; i < L_CODE; i++)
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            h2[i] = pv_round (L_shl (L_mult (h[i], k), 9));
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // build matrix rr[]
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 0;
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i = L_CODE - 1;
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (k = 0; k < L_CODE; k++, i--)
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, h2[k], h2[k]);
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr[i][i] = pv_round (s);
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (dec = 1; dec < L_CODE; dec++)
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = 0;
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        j = L_CODE - 1;
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        i = sub (j, dec);
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (k = 0; k < (L_CODE - dec); k++, i--, j--)
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s = L_mac (s, h2[k], h2[k + dec]);
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            rr[j][i] = mult (pv_round (s), mult (sign[i], sign[j]));
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            rr[i][j] = rr[j][i];
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber---------------------------------------------------------------------------
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid cor_h(
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],          /* (i) : impulse response of weighted synthesis
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                  filter                                  */
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 sign[],       /* (i) : sign of d[n]                            */
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rr[][L_CODE], /* (o) : matrix of autocorrelation               */
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag  *pOverflow
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word16 i;
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word16 dec;
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h2[L_CODE];
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s2;
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp1;
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp2;
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp11;
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp22;
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_h;
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_h2;
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *rr1;
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *rr2;
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *rr3;
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_rr_ref1;
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_sign1;
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_sign2;
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Scaling for maximum precision */
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Initialize accumulator to 1 since left shift happens    */
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* after the accumulation of the sum of squares (original  */
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* code initialized s to 2)                                */
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 1;
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_h = h;
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = (L_CODE >> 1); i != 0 ; i--)
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp1 = *(p_h++);
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = amrnb_fxp_mac_16_by_16bb((Word32) tmp1, (Word32) tmp1, s);
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp1 = *(p_h++);
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = amrnb_fxp_mac_16_by_16bb((Word32) tmp1, (Word32) tmp1, s);
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s <<= 1;
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (s & MIN_32)
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h2 = h2;
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h  = h;
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (i = (L_CODE >> 1); i != 0; i--)
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_h2++) =  *(p_h++)  >> 1;
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_h2++) =  *(p_h++)  >> 1;
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s >>= 1;
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = Inv_sqrt(s, pOverflow);
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (s < (Word32) 0x00ffffffL)
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* k = 0.99*k */
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            dec = (Word16)(((s >> 9) * 32440) >> 15);
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            dec = 32440;  /* 0.99 */
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h  = h;
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h2 = h2;
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (i = (L_CODE >> 1); i != 0; i--)
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_h2++) = (Word16)((amrnb_fxp_mac_16_by_16bb((Word32) * (p_h++), (Word32) dec, 0x020L)) >> 6);
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_h2++) = (Word16)((amrnb_fxp_mac_16_by_16bb((Word32) * (p_h++), (Word32) dec, 0x020L)) >> 6);
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* build matrix rr[] */
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 0;
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_h2 = h2;
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rr1 = &rr[L_CODE-1][L_CODE-1];
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = L_CODE >> 1; i != 0 ; i--)
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp1   = *(p_h2++);
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = amrnb_fxp_mac_16_by_16bb((Word32) tmp1, (Word32) tmp1, s);
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *rr1 = (Word16)((s + 0x00004000L) >> 15);
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr1 -= (L_CODE + 1);
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp1   = *(p_h2++);
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = amrnb_fxp_mac_16_by_16bb((Word32) tmp1, (Word32) tmp1, s);
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *rr1 = (Word16)((s + 0x00004000L) >> 15);
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr1 -= (L_CODE + 1);
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_rr_ref1 = rr[L_CODE-1];
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (dec = 1; dec < L_CODE; dec += 2)
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr1 = &p_rr_ref1[L_CODE-1-dec];
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr2 = &rr[L_CODE-1-dec][L_CODE-1];
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr3 = &rr[L_CODE-1-(dec+1)][L_CODE-1];
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s  = 0;
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s2 = 0;
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_sign1 = &sign[L_CODE - 1];
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_sign2 = &sign[L_CODE - 1 - dec];
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h2 = h2;
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_h  = &h2[dec];
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (i = (L_CODE - dec - 1); i != 0 ; i--)
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s = amrnb_fxp_mac_16_by_16bb((Word32) * (p_h2), (Word32) * (p_h++), s);
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (p_h2++), (Word32) * (p_h), s2);
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            tmp1  = (Word16)((s + 0x00004000L) >> 15);
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            tmp11 = (Word16)((s2 + 0x00004000L) >> 15);
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            tmp2  = ((Word32) * (p_sign1) * *(p_sign2--)) >> 15;
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            tmp22 = ((Word32) * (p_sign1--) * *(p_sign2)) >> 15;
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *rr2 = ((Word32) tmp1 * tmp2) >> 15;
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(rr1--) = *rr2;
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *rr1 = ((Word32) tmp11 * tmp22) >> 15;
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *rr3 = *rr1;
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            rr1 -= (L_CODE);
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            rr2 -= (L_CODE + 1);
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            rr3 -= (L_CODE + 1);
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = amrnb_fxp_mac_16_by_16bb((Word32) * (p_h2), (Word32) * (p_h), s);
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp1 = (Word16)((s + 0x00004000L) >> 15);
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        tmp2 = ((Word32) * (p_sign1) * *(p_sign2)) >> 15;
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *rr1 = ((Word32) tmp1 * tmp2) >> 15;
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *rr2 = *rr1;
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr1 -= (L_CODE + 1);
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        rr2 -= (L_CODE + 1);
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
430