1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied.
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License.
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -------------------------------------------------------------------
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************************
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard:
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    3GPP TS 26.073
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Available from http://www.3gpp.org
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder.
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pathname: ./audio/gsm-amr/c/src/autocorr.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 05/15/2000
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Put into template...starting optimization.
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Removed call to mult_r routine.
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Modified Input/Output Definitions section to comply with the
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          current template. Fixed tabs.
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated Input/Output definitions by making them more
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          descriptive.
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              template.
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Added full pathname of file.
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              2. Fixed typecasting issue with TI compiler.
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              3. Modified FOR loops to count down.
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              4. Added comment to the code.
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Removed extern to global paramter (Flag Overflow) and replaced
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber by passing in a pointer to Overflow.  Also, made several small changes to
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber bring code more in line with PV Standards.
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            1. Added pointer to avoid adding offsets in every pass
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            2. Break last loop in two nested loop to speed up processing
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            3. Removed extra check for overflow by doing scaling right
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               after overflow is detected.
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            4. Eliminated calls to basic operations (like extract) not
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               needed because of the nature of the number (all bounded)
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Fixed for:
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                overflow check was looking for positive number before a left
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                shift. When numbers were big enough, positive numbers after
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                shifted became negative, causing a 1/0 division).
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Fixed so now it checks for numbers lesser than 0x40000000
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                before the left shift
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1.Modified check for saturation to match bit exact test.
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Also, when saturation is reached, a faster loop is used
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                (with no energy accumulation) to speed up processing
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1.Added pointer initialization to for loop when saturation
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                is found. This because some compiler ( like Vcpp in release
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                mode) when optimizing code, may remove pointer information
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                once the loop is broken.
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Added casting to eliminate warnings
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Using inlines from fxp_arithmetic.h.
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replacing fxp_arithmetic.h with basic_op.h.
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "autocorr.h"
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "oper_32b.h"
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Define module specific macros here
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Include all pre-processor statements here. Include conditional
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also.
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Function Prototype declaration
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Variable declaration - defined here and used outside this module
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Declare variables used in this module but defined elsewhere
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: Autocorr
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    x = buffer of input signals of type Word16
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    m = LPC order of type Word16
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    wind = buffer of window signals of type Word16
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_h = buffer containing the high word of the autocorrelation values
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          of type Word16
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_l = buffer containing the low word of the autocorrelation values
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          of type Word16
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pOverflow = pointer to variable of type Flag *, which indicates if
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                overflow occurs.
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_h buffer contains the high word of the new autocorrelation values
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_l buffer contains the low word of the new autocorrelation values
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pOverflow -> 1 if overflow occurs.
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    norm = normalized autocorrelation at lag zero of type Word16
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function windows the input signal with the provided window
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber then calculates the autocorrelation values for lags of 0,1,...m,
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where m is the passed in LPC order.
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber autocorr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 Autocorr (
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 x[],            // (i)    : Input signal (L_WINDOW)
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 m,              // (i)    : LPC order
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 r_h[],          // (o)    : Autocorrelations  (msb)
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 r_l[],          // (o)    : Autocorrelations  (lsb)
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word16 wind[]    // (i)    : window for LPC analysis (L_WINDOW)
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i, j, norm;
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y[L_WINDOW];
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word32 sum;
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 overfl, overfl_shft;
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    // Windowing of signal
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = 0; i < L_WINDOW; i++)
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        y[i] = mult_r (x[i], wind[i]);
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    // Compute r[0] and test for overflow
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    overfl_shft = 0;
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    do
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        overfl = 0;
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum = 0L;
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = 0; i < L_WINDOW; i++)
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum = L_mac (sum, y[i], y[i]);
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        // If overflow divide y[] by 4
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (L_sub (sum, MAX_32) == 0L)
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            overfl_shft = add (overfl_shft, 4);
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            overfl = 1; // Set the overflow flag
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (i = 0; i < L_WINDOW; i++)
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                y[i] = shr (y[i], 2);
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    while (overfl != 0);
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sum = L_add (sum, 1L);             // Avoid the case of all zeros
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    // Normalization of r[0]
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    norm = norm_l (sum);
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sum = L_shl (sum, norm);
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    L_Extract (sum, &r_h[0], &r_l[0]); // Put in DPF format (see oper_32b)
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    // r[1] to r[m]
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = 1; i <= m; i++)
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum = 0;
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (j = 0; j < L_WINDOW - i; j++)
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum = L_mac (sum, y[j], y[j + i]);
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum = L_shl (sum, norm);
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        L_Extract (sum, &r_h[i], &r_l[i]);
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    norm = sub (norm, overfl_shft);
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return norm;
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 Autocorr(
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 x[],            /* (i)    : Input signal (L_WINDOW)            */
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 m,              /* (i)    : LPC order                          */
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 r_h[],          /* (o)    : Autocorrelations  (msb)            */
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 r_l[],          /* (o)    : Autocorrelations  (lsb)            */
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word16 wind[],   /* (i)    : window for LPC analysis (L_WINDOW) */
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Flag  *pOverflow       /* (o)    : indicates overflow                 */
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    register Word16 i;
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    register Word16 j;
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    register Word16 norm;
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y[L_WINDOW];
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word32 sum;
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 overfl_shft;
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Added for optimization  */
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 temp;
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_x;
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_y;
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_y_1;
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_y_ref;
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_rh;
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_rl;
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word16 *p_wind;
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_y = y;
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_x = x;
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_wind = wind;
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     *  Windowing of the signal
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     */
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sum = 0L;
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    j = 0;
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = L_WINDOW; i != 0; i--)
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        temp = (amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_wind++), 0x04000)) >> 15;
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *(p_y++) = temp;
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum += ((Word32)temp * temp) << 1;
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (sum < 0)
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /*
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             * if oveflow exist, then stop accumulation
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             */
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            j = 1;
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            break;
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     * if oveflow existed, complete  windowing operation
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     * without computing energy
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     */
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (j)
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_y = &y[L_WINDOW-i];
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_x = &x[L_WINDOW-i];
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_wind = &wind[L_WINDOW-i];
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (; i != 0; i--)
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            temp = (amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_wind++), 0x04000)) >> 15;
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(p_y++) = temp;
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     *  Compute r[0] and test for overflow
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     */
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    overfl_shft = 0;
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     * scale down by 1/4 only when needed
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     */
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    while (j == 1)
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* If overflow divide y[] by 4          */
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* FYI: For better resolution, we could */
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*      divide y[] by 2                 */
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        overfl_shft += 4;
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_y   = &y[0];
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum = 0L;
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = (L_WINDOW >> 1); i != 0 ; i--)
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            temp = *p_y >> 2;
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(p_y++) = temp;
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum += ((Word32)temp * temp) << 1;
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            temp = *p_y >> 2;
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *(p_y++) = temp;
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum += ((Word32)temp * temp) << 1;
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (sum > 0)
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            j = 0;
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sum += 1L;              /* Avoid the case of all zeros */
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Normalization of r[0] */
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    norm = norm_l(sum);
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    sum <<= norm;
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Put in DPF format (see oper_32b) */
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_h[0] = (Word16)(sum >> 16);
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    r_l[0] = (Word16)((sum >> 1) - ((Word32)(r_h[0]) << 15));
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* r[1] to r[m] */
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_y_ref = &y[L_WINDOW - 1 ];
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_rh = &r_h[m];
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_rl = &r_l[m];
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = m; i > 0; i--)
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum  = 0;
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_y   = &y[L_WINDOW - i - 1];
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_y_1 = p_y_ref;
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (j = (L_WINDOW - i - 1) >> 1; j != 0; j--)
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum = amrnb_fxp_mac_16_by_16bb((Word32) * (p_y--), (Word32) * (p_y_1--), sum);
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum = amrnb_fxp_mac_16_by_16bb((Word32) * (p_y--), (Word32) * (p_y_1--), sum);
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum = amrnb_fxp_mac_16_by_16bb((Word32) * (p_y--), (Word32) * (p_y_1--), sum);
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (((L_WINDOW - i - 1) & 1))
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sum = amrnb_fxp_mac_16_by_16bb((Word32) * (p_y--), (Word32) * (p_y_1--), sum);
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sum  <<= (norm + 1);
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *(p_rh)   = (Word16)(sum >> 16);
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *(p_rl--) = (Word16)((sum >> 1) - ((Word32) * (p_rh--) << 15));
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    norm -= overfl_shft;
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return (norm);
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} /* Autocorr */
460