cor_h_x.cpp revision 2d0ac425564ff9882ebaac5267d1a04d4af67d00
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* ------------------------------------------------------------------
2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 1998-2009 PacketVideo
3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License.
6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at
7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software
11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * express or implied.
14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions
15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and limitations under the License.
16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * -------------------------------------------------------------------
17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/****************************************************************************************
19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink SavillePortions of this file are derived from the following 3GPP standard:
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    3GPP TS 26.073
22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Available from http://www.3gpp.org
24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink SavillePermission to distribute, modify and use this file under the standard license
27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleterms listed above has been obtained from the copyright holder.
28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville****************************************************************************************/
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Pathname: ./audio/gsm-amr/c/src/cor_h_x.c
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     Date: 09/07/2000
37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville REVISION HISTORY
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Created a separate file for cor_h_x function.
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Synchronized file with UMTS versin 3.2.0. Updated coding
44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              template.
45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Made the following changes per comments from Phase 2/3 review:
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              1. Modified FOR loop in the code to count down.
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              2. Fixed typecasting issue with TI C compiler.
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Added call to round() and L_shl() functions in the last FOR
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              loop to make code bit-exact. Updated copyright year.
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Modified to pass pOverflow in via a pointer, rather than
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville invoking it as a global variable.
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Made the following changes
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              1. Unrolled the correlation loop and add mechanism control
58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 to compute odd or even number of computations.
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              2. Use pointer to avoid continuos addresses calculation
60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              2. Eliminated math operations that check for saturation.
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description: Changed round function name to pv_round to avoid conflict with
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              round function in C standard library.
64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Description:
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville*/
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; INCLUDES
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville#include "typedef.h"
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville#include "cnst.h"
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville#include "cor_h_x.h"
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville#include "basic_op.h"
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; MACROS
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Define module specific macros here
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; DEFINES
86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Include all pre-processor statements here. Include conditional
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; compile variables also.
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; LOCAL FUNCTION DEFINITIONS
92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Function Prototype declaration
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; LOCAL STORE/BUFFER/POINTER DEFINITIONS
97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Variable declaration - defined here and used outside this module
98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; EXTERNAL FUNCTION REFERENCES
102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Declare functions defined elsewhere and referenced in this module
103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*----------------------------------------------------------------------------
106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville; Declare variables used in this module but defined elsewhere
108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville----------------------------------------------------------------------------*/
109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville FUNCTION NAME: cor_h_x
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville INPUT AND OUTPUT DEFINITIONS
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Inputs:
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    h = vector containing the impulse response of the weighted synthesis
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        filter; vector contents are of type Word16; vector length is
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        2 * L_SUBFR
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    x = target signal vector; vector contents are of type Word16; vector
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        length is L_SUBFR
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    dn = vector containing the correlation between the target and the
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville         impulse response; vector contents are of type Word16; vector
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville         length is L_CODE
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    sf = scaling factor of type Word16 ; 2 when mode is MR122, 1 for all
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville         other modes
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Outputs:
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    dn contents are the newly calculated correlation values
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    pOverflow = pointer of type Flag * to overflow indicator.
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Returns:
134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    None
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Global Variables Used:
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    None
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Local Variables Needed:
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    None
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville FUNCTION DESCRIPTION
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville This function computes the correlation between the target signal (x) and the
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville impulse response (h).
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville The correlation is given by: d[n] = sum_{i=n}^{L-1} x[i] h[i-n],
149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville where: n=0,...,L-1
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville d[n] is normalized such that the sum of 5 maxima of d[n] corresponding to
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville each position track does not saturate.
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville REQUIREMENTS
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville None
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville REFERENCES
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cor_h.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PSEUDO-CODE
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillevoid cor_h_x (
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 h[],    // (i): impulse response of weighted synthesis filter
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 x[],    // (i): target
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 dn[],   // (o): correlation between target and h[]
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 sf      // (i): scaling factor: 2 for 12.2, 1 for others
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville)
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville{
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    cor_h_x2(h, x, dn, sf, NB_TRACK, STEP);
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillevoid cor_h_x2 (
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 h[],    // (i): impulse response of weighted synthesis filter
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 x[],    // (i): target
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 dn[],   // (o): correlation between target and h[]
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 sf,     // (i): scaling factor: 2 for 12.2, 1 for others
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 nb_track,// (i): the number of ACB tracks
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 step    // (i): step size from one pulse position to the next
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                           in one track
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville)
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville{
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 i, j, k;
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 s, y32[L_CODE], max, tot;
190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // first keep the result on 32 bits and find absolute maximum
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    tot = 5;
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    for (k = 0; k < nb_track; k++)
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        max = 0;
198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (i = k; i < L_CODE; i += step)
199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        {
200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            s = 0;
201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (j = i; j < L_CODE; j++)
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                s = L_mac (s, x[j], h[j - i]);
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            y32[i] = s;
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            s = L_abs (s);
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (L_sub (s, max) > (Word32) 0L)
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                max = s;
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        tot = L_add (tot, L_shr (max, 1));
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    j = sub (norm_l (tot), sf);
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    for (i = 0; i < L_CODE; i++)
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        dn[i] = pv_round (L_shl (y32[i], j));
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville RESOURCES USED [optional]
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville When the code is written for a specific target processor the
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville the resources used should be documented below.
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville HEAP MEMORY USED: x bytes
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville STACK MEMORY USED: x bytes
230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CLOCK CYCLES: (cycle count equation for this function) + (variable
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                used to represent cycle count for each subroutine
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                called)
234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     where: (cycle count variable) = cycle count for [subroutine
235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                     name]
236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CAUTION [optional]
239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville [State any special notes, constraints or cautions for users of this function]
240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville------------------------------------------------------------------------------
242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville*/
243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillevoid cor_h_x(
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 h[],       /* (i): impulse response of weighted synthesis filter */
246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 x[],       /* (i): target                                        */
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 dn[],      /* (o): correlation between target and h[]            */
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 sf,        /* (i): scaling factor: 2 for 12.2, 1 for others      */
249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Flag   *pOverflow /* (o): pointer to overflow flag                      */
250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville)
251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville{
252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 i;
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 j;
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 k;
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 s;
257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 y32[L_CODE];
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 max;
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 tot;
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 *p_x;
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word16 *p_ptr;
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    Word32 *p_y32;
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    tot = 5;
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    for (k = 0; k < NB_TRACK; k++)              /* NB_TRACK = 5 */
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        max = 0;
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (i = k; i < L_CODE; i += STEP)      /* L_CODE = 40; STEP = 5 */
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        {
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            s = 0;
273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            p_x = &x[i];
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            p_ptr = h;
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            for (j = (L_CODE - i - 1) >> 1; j != 0; j--)
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            {
278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                s += ((Word32) * (p_x++) * *(p_ptr++)) << 1;
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                s += ((Word32) * (p_x++) * *(p_ptr++)) << 1;
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            s += ((Word32) * (p_x++) * *(p_ptr++)) << 1;
283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (!((L_CODE - i) & 1))    /* if even number of iterations */
285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            {
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                s += ((Word32) * (p_x++) * *(p_ptr++)) << 1;
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            y32[i] = s;
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (s < 0)
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            {
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                s = -s;
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (s > max)
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            {
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                max = s;
299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        tot += (max >> 1);
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    j = norm_l(tot) - sf;
307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    p_ptr = dn;
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    p_y32 = y32;;
310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    for (i = L_CODE >> 1; i != 0; i--)
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        s = L_shl(*(p_y32++), j, pOverflow);
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        *(p_ptr++) = (s + 0x00008000) >> 16;
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        s = L_shl(*(p_y32++), j, pOverflow);
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        *(p_ptr++) = (s + 0x00008000) >> 16;
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    return;
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville