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/cl_ltp.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Funtions: cl_ltp_init
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           cl_ltp_reset
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           cl_ltp_exit
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           cl_ltp
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     Date: 06/07/2000
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:   Placed into PV template and optimized.
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              template. Removed unnecessary include files.
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Removed basic_op.h and oper_32b.h in the include section, and
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              added basicop_malloc.h.
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Fixed typecasting issue in TI C compiler.
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Added pOverflow parameter -- fixed minor template problem.
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              1. Eliminated unused include file typedef.h.
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              2. Replaced array addressing by pointers
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber              3. Eliminated if-else checks for saturation
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber               files that now are chosen by OSCL definitions
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description:
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This file contains functions that perform closed-loop fractional pitch
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber search.
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <stdlib.h>
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cl_ltp.h"
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basicop_malloc.h"
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "convolve.h"
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "g_pitch.h"
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "pred_lt.h"
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "pitch_fr.h"
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag3.h"
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag6.h"
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "q_gain_p.h"
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "ton_stab.h"
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: cl_ltp_init
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = Pointer to a pointer to a clLtpState structure
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state points to the newly created clLtpState structure.
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    This function returns 0 upon success and -1 upon failure.
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Allocates state memory and initializes state memory
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None.
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cl_ltp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint cl_ltp_init (clLtpState **state)
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clLtpState* s;
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (clLtpState **) NULL){
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        fprintf(stderr, "cl_ltp_init: invalid parameter\n");
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // allocate memory
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((s= (clLtpState *) malloc(sizeof(clLtpState))) == NULL){
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        fprintf(stderr, "cl_ltp_init: can not malloc state structure\n");
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  }
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // init the sub state
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (Pitch_fr_init(&s->pitchSt)) {
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        cl_ltp_exit(&s);
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cl_ltp_reset(s);
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = s;
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 cl_ltp_init(clLtpState **state)
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clLtpState* s;
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (clLtpState **) NULL)
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*fprint(stderr, "cl_ltp_init: invalid parameter\n");*/
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* allocate memory */
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((s = (clLtpState *) malloc(sizeof(clLtpState))) == NULL)
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*fprint(stderr, "cl_ltp_init: can not malloc state structure\n");*/
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* init the sub state */
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (Pitch_fr_init(&s->pitchSt))
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        cl_ltp_exit(&s);
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    cl_ltp_reset(s);
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = s;
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return(0);
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: cl_ltp_reset
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to the clLtpState structure to be reset
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    The state structure pointed to by clLtpState *state is reset.
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    The function returns int 0 if successful, -1 otherwise.
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Initializes state memory to zero.
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cl_ltp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ------------------------------------------------------------------------------
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint cl_ltp_reset (clLtpState *state)
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (clLtpState *) NULL){
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        fprintf(stderr, "cl_ltp_reset: invalid parameter\n");
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return -1;
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Reset pitch search states
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_reset (state->pitchSt);
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 cl_ltp_reset(clLtpState *state)
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (clLtpState *) NULL)
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*fprint(stderr, "cl_ltp_reset: invalid parameter\n");  */
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Reset pitch search states */
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_reset(state->pitchSt);
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return(0);
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: cl_ltp_exit
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clLtpState **state = Reference to the state object to be freed.
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    The memory used by the structure which is pointed to by 'state'
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      is freed.
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The memory used for state memory is freed
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cl_ltp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid cl_ltp_exit (clLtpState **state)
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == NULL || *state == NULL)
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return;
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // dealloc members
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_exit(&(*state)->pitchSt);
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // deallocate memory
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    free(*state);
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid cl_ltp_exit(clLtpState **state)
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == NULL || *state == NULL)
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return;
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* dealloc members */
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pitch_fr_exit(&(*state)->pitchSt);
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* deallocate memory */
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    free(*state);
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: cl_ltp
436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clSt = pointer to the clLtpState struct
441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tonSt = pointer to the tonStabState structure
442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    mode = codec mode value, of type enum Mode
443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    frameOffset = offset to subframe (Word16)
444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    T_op = pointer to buffer of open loop pitch lags (Word16)
445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    h1 = pointer to impulse response vector (Word16)
446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    exc = pointer to excitation vector (Word16)
447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    res2 = pointer to long term prediction residual (Word16)
448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    xn = pointer to target vector for pitch search (Word16)
449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    lsp_flag = LSP resonance flag (Word16)
450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clSt = pointer to the clLtpState struct
453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tonSt = pointer to the tonStabState structure
454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    exc = pointer to excitation vector (Word16)
455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    res2 = pointer to long term prediction residual (Word16)
456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    xn2 = pointer to target vector for codebook search (Word16)
457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    yl = pointer to buffer of filtered adaptive excitation (Word16)
458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    T0 = pointer to pitch delay (integer part) (Word16)
459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    T0_frac = pointer to pitch delay (fractional part) (Word16)
460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    gain_pit = pointer to pitch gain (Word16)
461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    g_coeff = pointer to array of correlations between xn, y1, & y2 (Word16)
462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    anap = pointer to pointer to analysis parameters (Word16)
463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    gp_limit = pointer to the pitch gain limit (Word16)
464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = pointer to overflow indicator (Flag)
465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return_value = 0 (int)
468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function performs closed-loop fractional pitch search.
479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None.
484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber cl_ltp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE FOR cl_ltp
492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint cl_ltp (
494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clLtpState *clSt,    // i/o : State struct
495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tonStabState *tonSt, // i/o : State struct
496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    enum Mode mode,      // i   : coder mode
497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 frameOffset,  // i   : Offset to subframe
498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T_op[],       // i   : Open loop pitch lags
499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *h1,          // i   : Impulse response vector               Q12
500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *exc,         // i/o : Excitation vector                      Q0
501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 res2[],       // i/o : Long term prediction residual          Q0
502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn[],         // i   : Target vector for pitch search         Q0
503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 lsp_flag,     // i   : LSP resonance flag
504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn2[],        // o   : Target vector for codebook search      Q0
505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 y1[],         // o   : Filtered adaptive excitation           Q0
506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *T0,          // o   : Pitch delay (integer part)
507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *T0_frac,     // o   : Pitch delay (fractional part)
508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *gain_pit,    // o   : Pitch gain                            Q14
509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 g_coeff[],    // o   : Correlations between xn, y1, & y2
510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 **anap,       // o   : Analysis parameters
511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *gp_limit     // o   : pitch gain limit
512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 index;
516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 L_temp;     // temporarily variable
517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 resu3;      // flag for upsample resolution
518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 gpc_flag;
519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *----------------------------------------------------------------------*
521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *                 Closed-loop fractional pitch search                  *
522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *----------------------------------------------------------------------*
523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   *T0 = Pitch_fr(clSt->pitchSt,
524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  mode, T_op, exc, xn, h1,
525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  L_SUBFR, frameOffset,
526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                  T0_frac, &resu3, &index);
527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   *(*anap)++ = index;
529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *-----------------------------------------------------------------*
531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *   - find unity gain pitch excitation (adapitve codebook entry)  *
532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *     with fractional interpolation.                              *
533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *   - find filtered pitch exc. y1[]=exc[] convolve with h1[])     *
534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *   - compute pitch gain and limit between 0 and 1.2              *
535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *   - update target vector for codebook search                    *
536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *   - find LTP residual.                                          *
537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *-----------------------------------------------------------------*
538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   Pred_lt_3or6(exc, *T0, *T0_frac, L_SUBFR, resu3);
540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   Convolve(exc, h1, y1, L_SUBFR);
542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   // gain_pit is Q14 for all modes
544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   *gain_pit = G_pitch(mode, xn, y1, g_coeff, L_SUBFR);
545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   // check if the pitch gain should be limit due to resonance in LPC filter
548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   gpc_flag = 0;
549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   *gp_limit = MAX_16;
550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   if ((lsp_flag != 0) &&
551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       (sub(*gain_pit, GP_CLIP) > 0))
552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   {
553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       gpc_flag = check_gp_clipping(tonSt, *gain_pit);
554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   }
555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   // special for the MR475, MR515 mode; limit the gain to 0.85 to
557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   // cope with bit errors in the decoder in a better way.
558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   if ((sub (mode, MR475) == 0) || (sub (mode, MR515) == 0)) {
559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      if ( sub (*gain_pit, 13926) > 0) {
560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         *gain_pit = 13926;   // 0.85 in Q14
561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      }
562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      if (gpc_flag != 0) {
564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          *gp_limit = GP_CLIP;
565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      }
566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   }
567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   else
568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   {
569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if (gpc_flag != 0)
570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           *gp_limit = GP_CLIP;
572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           *gain_pit = GP_CLIP;
573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // For MR122, gain_pit is quantized here and not in gainQuant
575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if (sub(mode, MR122)==0)
576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           *(*anap)++ = q_gain_pitch(MR122, *gp_limit, gain_pit,
578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     NULL, NULL);
579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   }
581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   // update target vector und evaluate LTP residual
583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   for (i = 0; i < L_SUBFR; i++) {
584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_temp = L_mult(y1[i], *gain_pit);
585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_temp = L_shl(L_temp, 1);
586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       xn2[i] = sub(xn[i], extract_h(L_temp));
587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_temp = L_mult(exc[i], *gain_pit);
589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_temp = L_shl(L_temp, 1);
590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       res2[i] = sub(res2[i], extract_h(L_temp));
591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   }
592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber   return 0;
594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid cl_ltp(
620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    clLtpState *clSt,    /* i/o : State struct                              */
621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    tonStabState *tonSt, /* i/o : State struct                              */
622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    enum Mode mode,      /* i   : coder mode                                */
623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 frameOffset,  /* i   : Offset to subframe                        */
624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 T_op[],       /* i   : Open loop pitch lags                      */
625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *h1,          /* i   : Impulse response vector               Q12 */
626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *exc,         /* i/o : Excitation vector                      Q0 */
627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 res2[],       /* i/o : Long term prediction residual          Q0 */
628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn[],         /* i   : Target vector for pitch search         Q0 */
629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 lsp_flag,     /* i   : LSP resonance flag                        */
630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 xn2[],        /* o   : Target vector for codebook search      Q0 */
631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 yl[],         /* o   : Filtered adaptive excitation           Q0 */
632d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *T0,          /* o   : Pitch delay (integer part)                */
633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *T0_frac,     /* o   : Pitch delay (fractional part)             */
634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *gain_pit,    /* o   : Pitch gain                            Q14 */
635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 g_coeff[],    /* o   : Correlations between xn, y1, & y2         */
636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 **anap,       /* o   : Analysis parameters                       */
637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *gp_limit,    /* o   : pitch gain limit                          */
638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow    /* o   : overflow indicator                        */
639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word16 i;
642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 index;
643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 L_temp;     /* temporarily variable */
644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 resu3;      /* flag for upsample resolution */
645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 gpc_flag;
646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 temp;
648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_exc;
649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_xn;
650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_xn2;
651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_yl;
652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*----------------------------------------------------------------------*
654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *                 Closed-loop fractional pitch search                  *
655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *----------------------------------------------------------------------*/
656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *T0 =
657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        Pitch_fr(
658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            clSt->pitchSt,
659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            mode,
660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            T_op,
661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            exc,
662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            xn,
663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            h1,
664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_SUBFR,
665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            frameOffset,
666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            T0_frac,
667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            &resu3,
668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            &index,
669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pOverflow);
670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *(*anap)++ = index;
672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*-----------------------------------------------------------------*
674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *   - find unity gain pitch excitation (adapitve codebook entry)  *
675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *     with fractional interpolation.                              *
676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *   - find filtered pitch exc. y1[]=exc[] convolve with h1[])     *
677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *   - compute pitch gain and limit between 0 and 1.2              *
678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *   - update target vector for codebook search                    *
679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *   - find LTP residual.                                          *
680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *-----------------------------------------------------------------*/
681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Pred_lt_3or6(
683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        exc,
684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *T0,
685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *T0_frac,
686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        L_SUBFR,
687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        resu3,
688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        pOverflow);
689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Convolve(exc, h1, yl, L_SUBFR);
691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* gain_pit is Q14 for all modes */
693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *gain_pit =
694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        G_pitch(
695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            mode,
696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            xn,
697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            yl,
698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            g_coeff,
699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            L_SUBFR,
700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            pOverflow);
701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* check if the pitch gain should be limit due to resonance in LPC filter */
704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    gpc_flag = 0;
705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *gp_limit = MAX_16;
706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((lsp_flag != 0) && ((Word32)(*gain_pit) > GP_CLIP))
708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        gpc_flag = check_gp_clipping(tonSt, *gain_pit, pOverflow);
710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* special for the MR475, MR515 mode; limit the gain to 0.85 to */
713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* cope with bit errors in the decoder in a better way.         */
714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((mode == MR475) || (mode == MR515))
716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *gain_pit = ((Word32) * gain_pit > 13926) ? 13926 : *gain_pit;
718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (gpc_flag != 0)
720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *gp_limit = GP_CLIP;
722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    else
725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (gpc_flag != 0)
727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *gp_limit = GP_CLIP;
729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *gain_pit = GP_CLIP;
730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* For MR122, gain_pit is quantized here and not in gainQuant */
732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (mode == MR122)
733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(*anap)++ =
735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                q_gain_pitch(
736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    MR122,
737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    *gp_limit,
738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    gain_pit,
739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    NULL,
740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    NULL,
741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                    pOverflow);
742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_exc  = &exc[0];
747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_xn   =  &xn[0];
748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_xn2  = &xn2[0];
749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_yl   =  &yl[0];
750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    temp = *gain_pit;
752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* update target vector und evaluate LTP residual */
754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 0; i < L_SUBFR; i++)
755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        L_temp = ((Word32) * (p_yl++) * temp) >> 14;
757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_xn2++) = *(p_xn++) - (Word16)L_temp;
758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        L_temp   = ((Word32) * (p_exc++) * temp) >> 14;
760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        res2[i] -= (Word16)L_temp;
761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
764