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/pitch_fr.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Functions:
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     Date: 02/04/2002
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Added pOverflow as a passed in value to searchFrac and made
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              other fixes to the code regarding simple syntax fixes. Removed
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              the include of stio.h.
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: *lag-- decrements the pointer.  (*lag)-- decrements what is
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pointed to.  The latter is what the coder intended, but the former is
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the coding instruction that was used.
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: A common problem -- a comparison != 0 was inadvertantly replaced
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber by a comparison == 0.
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  For Norm_Corr() and getRange()
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              1. Eliminated unused include files.
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              2. Replaced array addressing by pointers
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              3. Eliminated math operations that unnecessary checked for
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 saturation, in some cases this by shifting before adding and
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 in other cases by evaluating the operands
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              4. Unrolled loops to speed up processing, use decrement loops
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              5. Replaced extract_l() call with equivalent code
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              6. Modified scaling threshold and group all shifts (avoiding
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 successive shifts)
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               files that now are chosen by OSCL definitions
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Removed compiler warnings.
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      File             : pitch_fr.c
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      Purpose          : Find the pitch period with 1/3 or 1/6 subsample
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                       : resolution (closed loop).
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <stdlib.h>
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "pitch_fr.h"
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "oper_32b.h"
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag3.h"
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag6.h"
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inter_36.h"
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "inv_sqrt.h"
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "convolve.h"
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h"
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * mode dependent parameters used in Pitch_fr()
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Note: order of MRxx in 'enum Mode' is important!
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic const struct
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max_frac_lag;     /* lag up to which fractional lags are used    */
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag3;            /* enable 1/3 instead of 1/6 fract. resolution */
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 first_frac;       /* first fractional to check                   */
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 last_frac;        /* last fractional to check                    */
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_int_low;    /* integer lag below TO to start search from   */
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_int_range;  /* integer range around T0                     */
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_frc_low;    /* fractional below T0                         */
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_frc_range;  /* fractional range around T0                  */
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pit_min;          /* minimum pitch                               */
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} mode_dep_parm[N_MODES] =
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR475 */  { 84,  1, -2,  2,  5, 10,  5,  9, PIT_MIN },
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR515 */  { 84,  1, -2,  2,  5, 10,  5,  9, PIT_MIN },
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR59  */  { 84,  1, -2,  2,  3,  6,  5,  9, PIT_MIN },
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR67  */  { 84,  1, -2,  2,  3,  6,  5,  9, PIT_MIN },
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR74  */  { 84,  1, -2,  2,  3,  6,  5,  9, PIT_MIN },
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR795 */  { 84,  1, -2,  2,  3,  6, 10, 19, PIT_MIN },
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR102 */  { 84,  1, -2,  2,  3,  6,  5,  9, PIT_MIN },
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* MR122 */  { 94,  0, -3,  3,  3,  6,  5,  9, PIT_MIN_MR122 }
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber};
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Norm_Corr
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    exc[] = pointer to buffer of type Word16
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    xn[]  = pointer to buffer of type Word16
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h[]   = pointer to buffer of type Word16
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_subfr = length of sub frame (Word16)
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_min  = the minimum table value of type Word16
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_max = the maximum table value of type Word16
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    corr_norm[] = pointer to buffer of type Word16
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = 1 if the math functions called result in overflow else zero.
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  FUNCTION:   Norm_Corr()
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  PURPOSE: Find the normalized correlation between the target vector
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           and the filtered past excitation.
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  DESCRIPTION:
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     The normalized correlation is given by the correlation between the
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     target and filtered past excitation divided by the square root of
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     the energy of filtered excitation.
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                   corr[k] = <x[], y_k[]>/sqrt(y_k[],y_k[])
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where x[] is the target vector and y_k[] is the filtered past
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     excitation at delay k.
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void Norm_Corr (Word16 exc[], Word16 xn[], Word16 h[], Word16 L_subfr,
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                       Word16 t_min, Word16 t_max, Word16 corr_norm[])
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i, j, k;
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_h, corr_l, norm_h, norm_l;
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Usally dynamic allocation of (L_subfr)
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 excf[L_SUBFR];
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 scaling, h_fac, *s_excf, scaled_excf[L_SUBFR];
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    k = -t_min;
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // compute the filtered excitation for the first delay t_min
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Convolve (&exc[k], h, excf, L_subfr);
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // scale "excf[]" to avoid overflow
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (j = 0; j < L_subfr; j++) {
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        scaled_excf[j] = shr (excf[j], 2);
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Compute 1/sqrt(energy of excf[])
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 0;
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (j = 0; j < L_subfr; j++) {
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = L_mac (s, excf[j], excf[j]);
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (L_sub (s, 67108864L) <= 0) {            // if (s <= 2^26)
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s_excf = excf;
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h_fac = 15 - 12;
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        scaling = 0;
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else {
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // "excf[]" is divided by 2
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s_excf = scaled_excf;
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h_fac = 15 - 12 - 2;
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        scaling = 2;
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // loop for every possible period
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = t_min; i <= t_max; i++) {
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // Compute 1/sqrt(energy of excf[])
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = 0;
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (j = 0; j < L_subfr; j++) {
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s = L_mac (s, s_excf[j], s_excf[j]);
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = Inv_sqrt (s);
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        L_Extract (s, &norm_h, &norm_l);
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // Compute correlation between xn[] and excf[]
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = 0;
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (j = 0; j < L_subfr; j++) {
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s = L_mac (s, xn[j], s_excf[j]);
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        L_Extract (s, &corr_h, &corr_l);
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // Normalize correlation = correlation * (1/sqrt(energy))
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = Mpy_32 (corr_h, corr_l, norm_h, norm_l);
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_norm[i] = extract_h (L_shl (s, 16));
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // modify the filtered excitation excf[] for the next iteration
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (i, t_max) != 0) {
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            k--;
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            for (j = L_subfr - 1; j > 0; j--) {
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s = L_mult (exc[k], h[j]);
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s = L_shl (s, h_fac);
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s_excf[j] = add (extract_h (s), s_excf[j - 1]);
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s_excf[0] = shr (exc[k], scaling);
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void Norm_Corr(Word16 exc[],
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 xn[],
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 h[],
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 L_subfr,
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 t_min,
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 t_max,
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Word16 corr_norm[],
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      Flag *pOverflow)
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 j;
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 k;
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_h;
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_l;
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 norm_h;
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 norm_l;
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s;
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 s2;
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 excf[L_SUBFR];
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 scaling;
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h_fac;
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *s_excf;
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 scaled_excf[L_SUBFR];
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_s_excf;
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_excf;
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16  temp;
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_x;
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_h;
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    k = -t_min;
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* compute the filtered excitation for the first delay t_min */
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Convolve(&exc[k], h, excf, L_subfr);
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* scale "excf[]" to avoid overflow */
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    s = 0;
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_s_excf = scaled_excf;
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_excf   = excf;
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (j = (L_subfr >> 1); j != 0; j--)
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        temp = *(p_excf++);
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_s_excf++) = temp >> 2;
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (Word32) temp * temp;
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        temp = *(p_excf++);
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_s_excf++) = temp >> 2;
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s += (Word32) temp * temp;
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (s <= (67108864L >> 1))
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s_excf = excf;
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h_fac = 12;
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        scaling = 0;
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* "excf[]" is divided by 2 */
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s_excf = scaled_excf;
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        h_fac = 14;
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        scaling = 2;
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* loop for every possible period */
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = t_min; i <= t_max; i++)
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Compute 1/sqrt(energy of excf[]) */
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s   = s2 = 0;
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_x      = xn;
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_s_excf = s_excf;
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        j        = L_subfr >> 1;
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        while (j--)
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s  += (Word32) * (p_x++) * *(p_s_excf);
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s2 += ((Word32)(*(p_s_excf)) * (*(p_s_excf)));
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            p_s_excf++;
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s  += (Word32) * (p_x++) * *(p_s_excf);
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s2 += ((Word32)(*(p_s_excf)) * (*(p_s_excf)));
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            p_s_excf++;
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s2     = s2 << 1;
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s2     = Inv_sqrt(s2, pOverflow);
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        norm_h = (Word16)(s2 >> 16);
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        norm_l = (Word16)((s2 >> 1) - (norm_h << 15));
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_h = (Word16)(s >> 15);
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_l = (Word16)((s) - (corr_h << 15));
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Normalize correlation = correlation * (1/sqrt(energy)) */
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        s = Mpy_32(corr_h, corr_l, norm_h, norm_l, pOverflow);
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_norm[i] = (Word16) s ;
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* modify the filtered excitation excf[] for the next iteration */
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (i != t_max)
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            k--;
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            temp = exc[k];
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            p_s_excf = &s_excf[L_subfr - 1];
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            p_h = &h[L_subfr - 1];
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            p_excf = &s_excf[L_subfr - 2];
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            for (j = (L_subfr - 1) >> 1; j != 0; j--)
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s = ((Word32) temp * *(p_h--)) >> h_fac;
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *(p_s_excf--) = (Word16) s  + *(p_excf--);
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                s = ((Word32) temp * *(p_h--)) >> h_fac;
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                *(p_s_excf--) = (Word16) s  + *(p_excf--);
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            s = ((Word32) temp * *(p_h)) >> h_fac;
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_s_excf--) = (Word16) s  + *(p_excf);
430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_s_excf) = temp >> scaling;
432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: searchFrac
444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    lag = pointer to integer pitch of type Word16
449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    frac = pointer to starting point of search fractional pitch of type Word16
450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    last_frac = endpoint of search  of type Word16
451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    corr[] = pointer to normalized correlation of type Word16
452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    flag3 = subsample resolution (3: =1 / 6: =0) of type Word16
453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   FUNCTION:   searchFrac()
470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   PURPOSE: Find fractional pitch
472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   DESCRIPTION:
474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      The function interpolates the normalized correlation at the
475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      fractional positions around lag T0. The position at which the
476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      interpolation function reaches its maximum is the fractional pitch.
477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      Starting point of the search is frac, end point is last_frac.
478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      frac is overwritten with the fractional pitch.
479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void searchFrac (
494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *lag,       // i/o : integer pitch
495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *frac,      // i/o : start point of search -
496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                               fractional pitch
497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 last_frac,  // i   : endpoint of search
498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr[],     // i   : normalized correlation
499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag3       // i   : subsample resolution
500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                (3: =1 / 6: =0)
501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max;
505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_int;
506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Test the fractions around T0 and choose the one which maximizes
508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // the interpolated normalized correlation.
509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max = Interpol_3or6 (&corr[*lag], *frac, flag3); // function result
511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = add (*frac, 1); i <= last_frac; i++) {
513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_int = Interpol_3or6 (&corr[*lag], i, flag3);
514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (corr_int, max) > 0) {
515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            max = corr_int;
516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = i;
517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (flag3 == 0) {
521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // Limit the fraction value in the interval [-2,-1,0,1,2,3]
522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (*frac, -3) == 0) {
524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = 3;
525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *lag = sub (*lag, 1);
526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else {
529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // limit the fraction value between -1 and 1
530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (*frac, -2) == 0) {
532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = 1;
533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *lag = sub (*lag, 1);
534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (*frac, 2) == 0) {
536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = -1;
537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *lag = add (*lag, 1);
538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void searchFrac(
566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *lag,       /* i/o : integer pitch           */
567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *frac,      /* i/o : start point of search -
568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                fractional pitch        */
569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 last_frac,  /* i   : endpoint of search      */
570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr[],     /* i   : normalized correlation  */
571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag3,      /* i   : subsample resolution
572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                (3: =1 / 6: =0)         */
573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow
574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max;
578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_int;
579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Test the fractions around T0 and choose the one which maximizes   */
581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* the interpolated normalized correlation.                          */
582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max = Interpol_3or6(&corr[*lag], *frac, flag3, pOverflow);
584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* function result */
585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = *frac + 1; i <= last_frac; i++)
587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        corr_int = Interpol_3or6(&corr[*lag], i, flag3, pOverflow);
589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (corr_int > max)
590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            max = corr_int;
592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = i;
593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (flag3 == 0)
597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Limit the fraction value in the interval [-2,-1,0,1,2,3] */
599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (*frac == -3)
601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = 3;
603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (*lag)--;
604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* limit the fraction value between -1 and 1 */
609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (*frac == -2)
611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = 1;
613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (*lag)--;
614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (*frac == 2)
616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *frac = -1;
618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (*lag)++;
619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: getRange
629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    T0 = integer pitch of type Word16
634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_low = search start offset of type Word16
635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_range = search range of type Word16
636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pitmin = minimum pitch of type Word16
637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pitmax = maximum pitch of type Word16
638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0_min = search range minimum of type Word16
639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0_max = search range maximum of type Word16
640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = 1 if the math functions called result in overflow else zero.
643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   FUNCTION:   getRange()
657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   PURPOSE: Sets range around open-loop pitch or integer pitch of last subframe
659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   DESCRIPTION:
661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      Takes integer pitch T0 and calculates a range around it with
662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0_min = T0-delta_low  and t0_max = (T0-delta_low) + delta_range
663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      t0_min and t0_max are bounded by pitmin and pitmax
664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void getRange (
678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T0,           // i : integer pitch
679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_low,    // i : search start offset
680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_range,  // i : search range
681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pitmin,       // i : minimum pitch
682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pitmax,       // i : maximum pitch
683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *t0_min,      // o : search range minimum
684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *t0_max)      // o : search range maximum
685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *t0_min = sub(T0, delta_low);
687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (sub(*t0_min, pitmin) < 0) {
688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *t0_min = pitmin;
689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *t0_max = add(*t0_min, delta_range);
691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (sub(*t0_max, pitmax) > 0) {
692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *t0_max = pitmax;
693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *t0_min = sub(*t0_max, delta_range);
694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberstatic void getRange(
720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T0,           /* i : integer pitch          */
721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_low,    /* i : search start offset    */
722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_range,  /* i : search range           */
723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pitmin,       /* i : minimum pitch          */
724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pitmax,       /* i : maximum pitch          */
725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *t0_min,      /* o : search range minimum   */
726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *t0_max,      /* o : search range maximum   */
727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow)
728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 temp;
731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    temp = *t0_min;
734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    temp = T0 - delta_low;
735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (temp < pitmin)
736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        temp = pitmin;
738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *t0_min = temp;
740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    temp +=  delta_range;
742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (temp > pitmax)
743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        temp = pitmax;
745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *t0_min = pitmax - delta_range;
746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *t0_max = temp;
748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_init
758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to a pointer of structure type Pitch_fr_State.
763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
764d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
765d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
766d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
767d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
768d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Returns a zero if successful and -1 if not successful.
769d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
770d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
771d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
772d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
773d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
774d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
775d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
776d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
777d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
778d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
779d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Function:   Pitch_fr_init
780d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Purpose:    Allocates state memory and initializes state memory
781d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
782d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
783d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
784d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
785d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
786d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
787d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
788d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
789d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
790d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
791d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
792d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
793d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
794d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
795d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Pitch_fr_init (Pitch_frState **state)
796d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
797d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_frState* s;
798d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
799d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (Pitch_frState **) NULL){
800d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // fprintf(stderr, "Pitch_fr_init: invalid parameter\n");
801d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
802d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
803d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
804d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
805d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // allocate memory
806d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((s= (Pitch_frState *) malloc(sizeof(Pitch_frState))) == NULL){
807d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // fprintf(stderr, "Pitch_fr_init: can not malloc state structure\n");
808d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
809d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
810d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
811d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_reset(s);
812d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = s;
813d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
814d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
815d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
816d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
817d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
818d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
819d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
820d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
821d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
822d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
823d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
824d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
825d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
826d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
827d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
828d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
829d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
830d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
831d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
832d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
833d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
834d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
835d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
836d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
837d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
838d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
839d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr_init(Pitch_frState **state)
840d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
841d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_frState* s;
842d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
843d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (Pitch_frState **) NULL)
844d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
845d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* fprintf(stderr, "Pitch_fr_init: invalid parameter\n"); */
846d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
847d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
848d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
849d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
850d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* allocate memory */
851d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((s = (Pitch_frState *) malloc(sizeof(Pitch_frState))) == NULL)
852d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
853d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* fprintf(stderr, "Pitch_fr_init: can not malloc state structure\n"); */
854d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
855d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
856d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
857d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_reset(s);
858d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = s;
859d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
860d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
861d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
862d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
863d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
864d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
865d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
866d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
867d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
868d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
869d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_reset
870d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
871d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
872d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
873d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
874d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to a pointer of structure type Pitch_fr_State.
875d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
876d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
877d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
878d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
879d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
880d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Returns a zero if successful and -1 if not successful.
881d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
882d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
883d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
884d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
885d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
886d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
887d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
888d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
889d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
890d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
891d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Function:   Pitch_fr_reset
892d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Purpose:    Initializes state memory to zero
893d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
894d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
895d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
896d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
897d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
898d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
899d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
900d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
901d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
902d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
903d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
904d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
905d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
906d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
907d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Pitch_fr_reset (Pitch_frState *state)
908d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
909d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
910d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (Pitch_frState *) NULL){
911d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // fprintf(stderr, "Pitch_fr_reset: invalid parameter\n");
912d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
913d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
914d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
915d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state->T0_prev_subframe = 0;
916d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
917d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
918d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
919d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
920d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
921d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
922d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
923d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
924d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
925d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
926d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
927d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
928d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
929d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
930d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
931d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
932d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
933d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
934d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
935d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
936d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
937d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
938d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
939d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
940d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
941d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
942d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr_reset(Pitch_frState *state)
943d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
944d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
945d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (Pitch_frState *) NULL)
946d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
947d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* fprintf(stderr, "Pitch_fr_reset: invalid parameter\n"); */
948d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
949d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
950d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
951d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state->T0_prev_subframe = 0;
952d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
953d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
954d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
955d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
956d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
957d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
958d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
959d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
960d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
961d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
962d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr_exit
963d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
964d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
965d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
966d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
967d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to a pointer of structure type Pitch_fr_State.
968d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
969d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
970d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
971d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
972d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
973d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
974d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
975d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
976d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
977d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
978d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
979d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
980d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
981d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
982d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
983d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
984d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Function:   Pitch_fr_exit
985d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Purpose:    The memory for state is freed.
986d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
987d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
988d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
989d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
990d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
991d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
992d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
993d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
994d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
995d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
996d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
997d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
998d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
999d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1000d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Pitch_fr_exit (Pitch_frState **state)
1001d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
1002d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == NULL || *state == NULL)
1003d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return;
1004d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1005d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // deallocate memory
1006d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    free(*state);
1007d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
1008d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1009d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
1010d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
1011d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1012d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1013d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
1014d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1015d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
1016d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
1017d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1018d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
1019d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1020d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
1021d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1022d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1023d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
1024d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
1025d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1026d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
1027d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1028d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1029d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
1030d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
1031d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1032d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1033d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
1034d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Pitch_fr_exit(Pitch_frState **state)
1035d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
1036d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == NULL || *state == NULL)
1037d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return;
1038d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1039d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* deallocate memory */
1040d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    free(*state);
1041d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
1042d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1043d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
1044d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
1045d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1046d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
1047d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1048d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1049d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
1050d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1051d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Pitch_fr
1052d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1053d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
1054d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1055d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
1056d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    st = pointer to stat structure of type Pitch_frState
1057d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    mode = codec mode of type enum Mode
1058d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    T_op[] = pointer to open loop pitch lags of type Word16
1059d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    exc[] = pointer to excitation buffer of type Word16
1060d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    xn[] = pointer to target vector of type Word16
1061d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h[] = pointer to impulse response of synthesis and weighting filters
1062d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          of type Word16
1063d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_subfr = length of subframe of type Word16
1064d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    i_subfr = subframe offset of type Word16
1065d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1066d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
1067d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pit_frac = pointer to pitch period (fractional) of type Word16
1068d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    resu3 = pointer to subsample resolution of type Word16
1069d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ana_index = pointer to index of encoding of type Word16
1070d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1071d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
1072d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
1073d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1074d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
1075d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
1076d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1077d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
1078d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
1079d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1080d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1081d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
1082d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1083d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   FUNCTION:   Pitch_fr()
1084d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1085d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   PURPOSE: Find the pitch period with 1/3 or 1/6 subsample resolution
1086d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (closed loop).
1087d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1088d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   DESCRIPTION:
1089d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         - find the normalized correlation between the target and filtered
1090d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           past excitation in the search range.
1091d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         - select the delay with maximum normalized correlation.
1092d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         - interpolate the normalized correlation at fractions -3/6 to 3/6
1093d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           with step 1/6 around the chosen delay.
1094d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         - The fraction which gives the maximum interpolated value is chosen.
1095d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1096d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1097d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
1098d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1099d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
1100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
1103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pitch_fr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
1108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1109d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr (        // o   : pitch period (integer)
1110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_frState *st,   // i/o : State struct
1111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    enum Mode mode,      // i   : codec mode
1112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T_op[],       // i   : open loop pitch lags
1113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 exc[],        // i   : excitation buffer                      Q0
1114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn[],         // i   : target vector                          Q0
1115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],          // i   : impulse response of synthesis and
1116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                  weighting filters                     Q12
1117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 L_subfr,      // i   : Length of subframe
1118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i_subfr,      // i   : subframe offset
1119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *pit_frac,    // o   : pitch period (fractional)
1120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *resu3,       // o   : subsample resolution 1/3 (=1) or 1/6 (=0)
1121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *ana_index    // o   : index of encoding
1122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
1123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
1124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
1125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t_min, t_max;
1126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t0_min, t0_max;
1127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max, lag, frac;
1128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp_lag;
1129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *corr;
1130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_v[40];    // Total length = t0_max-t0_min+1+2*L_INTER_SRCH
1131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max_frac_lag;
1133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag3, flag4;
1134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 last_frac;
1135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_int_low, delta_int_range;
1136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_frc_low, delta_frc_range;
1137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pit_min;
1138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 frame_offset;
1139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_search;
1140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //                      set mode specific variables
1143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //----------------------------------------------------------------------
1144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max_frac_lag    = mode_dep_parm[mode].max_frac_lag;
1146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    flag3           = mode_dep_parm[mode].flag3;
1147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    frac            = mode_dep_parm[mode].first_frac;
1148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    last_frac       = mode_dep_parm[mode].last_frac;
1149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_int_low   = mode_dep_parm[mode].delta_int_low;
1150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_int_range = mode_dep_parm[mode].delta_int_range;
1151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_frc_low   = mode_dep_parm[mode].delta_frc_low;
1153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_frc_range = mode_dep_parm[mode].delta_frc_range;
1154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pit_min         = mode_dep_parm[mode].pit_min;
1155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //                 decide upon full or differential search
1158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_search = 1;
1161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((i_subfr == 0) || (sub(i_subfr,L_FRAME_BY2) == 0)) {
1163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // Subframe 1 and 3
1165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (((sub((Word16)mode, (Word16)MR475) != 0) && (sub((Word16)mode,
1167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (Word16)MR515) != 0)) ||
1168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub(i_subfr,L_FRAME_BY2) != 0)) {
1169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // set t0_min, t0_max for full search
1171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // this is *not* done for mode MR475, MR515 in subframe 3
1172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            delta_search = 0; // no differential search
1174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // calculate index into T_op which contains the open-loop
1176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // pitch estimations for the 2 big subframes
1177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            frame_offset = 1;
1179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (i_subfr == 0)
1180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                frame_offset = 0;
1181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // get T_op from the corresponding half frame and
1183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // set t0_min, t0_max
1184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            getRange (T_op[frame_offset], delta_int_low, delta_int_range,
1186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      pit_min, PIT_MAX, &t0_min, &t0_max);
1187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else {
1189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            // mode MR475, MR515 and 3. Subframe: delta search as well
1191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            getRange (st->T0_prev_subframe, delta_frc_low, delta_frc_range,
1192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                      pit_min, PIT_MAX, &t0_min, &t0_max);
1193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else {
1196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // for Subframe 2 and 4
1198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // get range around T0 of previous subframe for delta search
1199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        getRange (st->T0_prev_subframe, delta_frc_low, delta_frc_range,
1201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  pit_min, PIT_MAX, &t0_min, &t0_max);
1202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                Find interval to compute normalized correlation
1206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     -----------------------------------------------------------------------
1207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_min = sub (t0_min, L_INTER_SRCH);
1209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_max = add (t0_max, L_INTER_SRCH);
1210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    corr = &corr_v[-t_min];
1212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      Compute normalized correlation between target and filtered excitation
1215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     -----------------------------------------------------------------------
1216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Norm_Corr (exc, xn, h, L_subfr, t_min, t_max, corr);
1218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                Find integer pitch
1221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     -----------------------------------------------------------------------
1222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max = corr[t0_min];
1224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    lag = t0_min;
1225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = t0_min + 1; i <= t0_max; i++) {
1227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (sub (corr[i], max) >= 0) {
1228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            max = corr[i];
1229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            lag = i;
1230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                             Find fractional pitch
1235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     -----------------------------------------------------------------------
1236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((delta_search == 0) && (sub (lag, max_frac_lag) > 0)) {
1237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // full search and integer pitch greater than max_frac_lag
1239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // fractional search is not needed, set fractional to zero
1240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        frac = 0;
1242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else {
1244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // if differential search AND mode MR475 OR MR515 OR MR59 OR MR67
1246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        // then search fractional with 4 bits resolution
1247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if ((delta_search != 0) &&
1249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           ((sub ((Word16)mode, (Word16)MR475) == 0) ||
1250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR515) == 0) ||
1251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR59) == 0) ||
1252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR67) == 0))) {
1253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          // modify frac or last_frac according to position of last
1255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          // integer pitch: either search around integer pitch,
1256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          // or only on left or right side
1257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          tmp_lag = st->T0_prev_subframe;
1259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          if ( sub( sub(tmp_lag, t0_min), 5) > 0)
1260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             tmp_lag = add (t0_min, 5);
1261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          if ( sub( sub(t0_max, tmp_lag), 4) > 0)
1262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               tmp_lag = sub (t0_max, 4);
1263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          if ((sub (lag, tmp_lag) == 0) ||
1265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              (sub (lag, sub(tmp_lag, 1)) == 0)) {
1266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             // normal search in fractions around T0
1268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             searchFrac (&lag, &frac, last_frac, corr, flag3);
1270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          }
1272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          else if (sub (lag, sub (tmp_lag, 2)) == 0) {
1273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             // limit search around T0 to the right side
1274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             frac = 0;
1275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             searchFrac (&lag, &frac, last_frac, corr, flag3);
1276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          }
1277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          else if (sub (lag, add(tmp_lag, 1)) == 0) {
1278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             // limit search around T0 to the left side
1279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             last_frac = 0;
1280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             searchFrac (&lag, &frac, last_frac, corr, flag3);
1281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          }
1282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          else {
1283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             // no fractional search
1284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             frac = 0;
1285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
1286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
1287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       else
1288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          // test the fractions around T0
1289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          searchFrac (&lag, &frac, last_frac, corr, flag3);
1290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //-----------------------------------------------------------------------
1293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //                           encode pitch
1294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //-----------------------------------------------------------------------
1295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (flag3 != 0) {
1297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // flag4 indicates encoding with 4 bit resolution;
1298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // this is needed for mode MR475, MR515 and MR59
1299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       flag4 = 0;
1301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if ( (sub ((Word16)mode, (Word16)MR475) == 0) ||
1302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR515) == 0) ||
1303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR59) == 0) ||
1304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            (sub ((Word16)mode, (Word16)MR67) == 0) ) {
1305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          flag4 = 1;
1306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
1307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // encode with 1/3 subsample resolution
1309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe,
1311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                             t0_min, t0_max, delta_search, flag4);
1312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // function result
1313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
1316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // encode with 1/6 subsample resolution
1318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       *ana_index = Enc_lag6(lag, frac, t0_min, delta_search);
1320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // function result
1321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //-----------------------------------------------------------------------
1324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //                          update state variables
1325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //-----------------------------------------------------------------------
1326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    st->T0_prev_subframe = lag;
1328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //-----------------------------------------------------------------------
1330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //                      update output variables
1331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     //-----------------------------------------------------------------------
1332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *resu3    = flag3;
1334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *pit_frac = frac;
1336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return (lag);
1338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
1339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
1343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
1345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
1346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
1348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
1350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
1353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
1354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
1356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
1359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
1360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
1362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
1363d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Pitch_fr(         /* o   : pitch period (integer)                    */
1364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_frState *st,   /* i/o : State struct                              */
1365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    enum Mode mode,      /* i   : codec mode                                */
1366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T_op[],       /* i   : open loop pitch lags                      */
1367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 exc[],        /* i   : excitation buffer                      Q0 */
1368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn[],         /* i   : target vector                          Q0 */
1369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 h[],          /* i   : impulse response of synthesis and
1370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                  weighting filters                     Q12 */
1371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 L_subfr,      /* i   : Length of subframe                        */
1372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i_subfr,      /* i   : subframe offset                           */
1373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *pit_frac,    /* o   : pitch period (fractional)                 */
1374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *resu3,       /* o   : subsample resolution 1/3 (=1) or 1/6 (=0) */
1375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *ana_index,   /* o   : index of encoding                         */
1376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow
1377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
1378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
1379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
1380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t_min;
1381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t_max;
1382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t0_min = 0;
1383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 t0_max;
1384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max;
1385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 lag;
1386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 frac;
1387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 tmp_lag;
1388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *corr;
1389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 corr_v[40];    /* Total length = t0_max-t0_min+1+2*L_INTER_SRCH */
1390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 max_frac_lag;
1392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag3;
1393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 flag4;
1394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 last_frac;
1395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_int_low;
1396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_int_range;
1397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_frc_low;
1398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_frc_range;
1399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 pit_min;
1400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 frame_offset;
1401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 delta_search;
1402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                      set mode specific variables                      *
1405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max_frac_lag    = mode_dep_parm[mode].max_frac_lag;
1408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    flag3           = mode_dep_parm[mode].flag3;
1409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    frac            = mode_dep_parm[mode].first_frac;
1410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    last_frac       = mode_dep_parm[mode].last_frac;
1411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_int_low   = mode_dep_parm[mode].delta_int_low;
1412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_int_range = mode_dep_parm[mode].delta_int_range;
1413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_frc_low   = mode_dep_parm[mode].delta_frc_low;
1415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_frc_range = mode_dep_parm[mode].delta_frc_range;
1416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pit_min         = mode_dep_parm[mode].pit_min;
1417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                 decide upon full or differential search               *
1420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    delta_search = 1;
1423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((i_subfr == 0) || (i_subfr == L_FRAME_BY2))
1425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Subframe 1 and 3 */
1428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (((mode != MR475) && (mode != MR515)) || (i_subfr != L_FRAME_BY2))
1430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
1431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* set t0_min, t0_max for full search */
1433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* this is *not* done for mode MR475, MR515 in subframe 3 */
1434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            delta_search = 0; /* no differential search */
1436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* calculate index into T_op which contains the open-loop */
1438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* pitch estimations for the 2 big subframes */
1439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            frame_offset = 1;
1441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (i_subfr == 0)
1442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                frame_offset = 0;
1443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* get T_op from the corresponding half frame and */
1445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* set t0_min, t0_max */
1446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            getRange(T_op[frame_offset], delta_int_low, delta_int_range,
1448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                     pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);
1449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
1451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
1452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* mode MR475, MR515 and 3. Subframe: delta search as well */
1454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range,
1455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                     pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);
1456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
1459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* for Subframe 2 and 4 */
1462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* get range around T0 of previous subframe for delta search */
1463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range,
1465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);
1466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *           Find interval to compute normalized correlation             *
1470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_min = sub(t0_min, L_INTER_SRCH, pOverflow);
1473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t_max = add(t0_max, L_INTER_SRCH, pOverflow);
1474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    corr = &corr_v[-t_min];
1476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     * Compute normalized correlation between target and filtered excitation *
1479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr, pOverflow);
1482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                           Find integer pitch                          *
1485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    max = corr[t0_min];
1488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    lag = t0_min;
1489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = t0_min + 1; i <= t0_max; i++)
1491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (corr[i] >= max)
1493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
1494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            max = corr[i];
1495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            lag = i;
1496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                        Find fractional pitch                          *
1501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((delta_search == 0) && (lag > max_frac_lag))
1503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* full search and integer pitch greater than max_frac_lag */
1506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* fractional search is not needed, set fractional to zero */
1507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        frac = 0;
1509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
1511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* if differential search AND mode MR475 OR MR515 OR MR59 OR MR67   */
1514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* then search fractional with 4 bits resolution           */
1515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if ((delta_search != 0) &&
1517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                ((mode == MR475) || (mode == MR515) ||
1518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                 (mode == MR59) || (mode == MR67)))
1519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
1520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* modify frac or last_frac according to position of last */
1522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* integer pitch: either search around integer pitch, */
1523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* or only on left or right side */
1524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            tmp_lag = st->T0_prev_subframe;
1526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (sub(sub(tmp_lag, t0_min, pOverflow), 5, pOverflow) > 0)
1527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                tmp_lag = add(t0_min, 5, pOverflow);
1528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if (sub(sub(t0_max, tmp_lag, pOverflow), 4, pOverflow) > 0)
1529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                tmp_lag = sub(t0_max, 4, pOverflow);
1530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            if ((lag == tmp_lag) || (lag == (tmp_lag - 1)))
1532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
1533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* normal search in fractions around T0 */
1535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
1537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
1539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else if (lag == (tmp_lag - 2))
1540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
1541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* limit search around T0 to the right side */
1542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                frac = 0;
1543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
1544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
1545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else if (lag == (tmp_lag + 1))
1546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
1547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* limit search around T0 to the left side */
1548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                last_frac = 0;
1549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
1550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
1551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            else
1552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            {
1553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                /* no fractional search */
1554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                frac = 0;
1555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            }
1556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        else
1558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            /* test the fractions around T0 */
1559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
1560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                           encode pitch                                *
1564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (flag3 != 0)
1567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* flag4 indicates encoding with 4 bit resolution;         */
1569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* this is needed for mode MR475, MR515 and MR59           */
1570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        flag4 = 0;
1572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if ((mode == MR475) || (mode == MR515) ||
1573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                (mode == MR59) || (mode == MR67))
1574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
1575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            flag4 = 1;
1576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
1577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* encode with 1/3 subsample resolution */
1579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe,
1581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                              t0_min, t0_max, delta_search, flag4, pOverflow);
1582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* function result */
1583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
1586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
1587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* encode with 1/6 subsample resolution */
1588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *ana_index = Enc_lag6(lag, frac, t0_min, delta_search, pOverflow);
1590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* function result */
1591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
1592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                          update state variables                       *
1595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    st->T0_prev_subframe = lag;
1598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------------*
1600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                      update output variables                          *
1601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------------*/
1602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *resu3    = flag3;
1604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *pit_frac = frac;
1606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return (lag);
1608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
1609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
1610