1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* ------------------------------------------------------------------
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * express or implied.
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * See the License for the specific language governing permissions
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and limitations under the License.
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -------------------------------------------------------------------
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************************
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPortions of this file are derived from the following 3GPP standard:
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    3GPP TS 26.073
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Available from http://www.3gpp.org
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberPermission to distribute, modify and use this file under the standard license
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberterms listed above has been obtained from the copyright holder.
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber****************************************************************************************/
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Pathname: ./audio/gsm-amr/c/src/cod_amr.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Funtions: cod_amr_init
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           cod_amr_reset
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           cod_amr_exit
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           cod_amr_first
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           cod_amr
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 06/09/2000
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made changes based on comments from the review meeting.
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              template. Removed unnecessary include files.
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added initialization of the overflow flag in cod_amr_init()
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              and in cod_amr_reset(). This overflow flag is now part of
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              the cod_amrState structure.
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Cleaned up INCLUDES. removed inclusion of basic_op.h and repeat
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              inclusion of copy.h
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated function call to dtx_enc
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  For cod_amr_first() and cod_amr()
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Replaced copy() function with memcpy()
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               files that now are chosen by OSCL definitions
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber These functions comprise the main encoder routine operating on a frame basis.
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <stdlib.h>
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <string.h>
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cod_amr.h"
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h"
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "copy.h"
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "qua_gain.h"
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "lpc.h"
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "lsp.h"
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "pre_big.h"
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ol_ltp.h"
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "p_ol_wgh.h"
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "spreproc.h"
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cl_ltp.h"
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "pred_lt.h"
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "spstproc.h"
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cbsearch.h"
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "gain_q.h"
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "convolve.h"
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "ton_stab.h"
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "vad.h"
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "dtx_enc.h"
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Define module specific macros here
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Include all pre-processor statements here. Include conditional
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also.
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Function Prototype declaration
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL VARIABLE DEFINITIONS
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Variable declaration - defined here and used outside this module
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* Spectral expansion factors */
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma1[M] =
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    30802, 28954, 27217, 25584, 24049,
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    22606, 21250, 19975, 18777, 17650
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber};
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/* gamma1 differs for the 12k2 coder */
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma1_12k2[M] =
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    29491, 26542, 23888, 21499, 19349,
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    17414, 15672, 14105, 12694, 11425
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber};
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16 gamma2[M] =
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    19661, 11797, 7078, 4247, 2548,
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    1529, 917, 550, 330, 198
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber};
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_init
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state = pointer to a pointer to a structure of type cod_amrState
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Structure pointed to by the pointer pointed to by state is
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      initialized to its reset value
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state points to the allocated memory
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Returns 0 if memory was successfully initialized,
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        otherwise returns -1.
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function allocates memory and initializes state variables.
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_init (cod_amrState **state, Flag dtx)
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  cod_amrState* s;
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if (state == (cod_amrState **) NULL){
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      fprintf(stderr, "cod_amr_init: invalid parameter\n");
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      return -1;
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  *state = NULL;
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  // allocate memory
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if ((s= (cod_amrState *) malloc(sizeof(cod_amrState))) == NULL){
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      fprintf(stderr, "cod_amr_init: can not malloc state structure\n");
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      return -1;
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->lpcSt = NULL;
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->lspSt = NULL;
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->clLtpSt = NULL;
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->gainQuantSt = NULL;
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->pitchOLWghtSt = NULL;
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->tonStabSt = NULL;
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->vadSt = NULL;
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->dtx_encSt = NULL;
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  s->dtx = dtx;
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  // Init sub states
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if (cl_ltp_init(&s->clLtpSt) ||
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      lsp_init(&s->lspSt) ||
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      gainQuant_init(&s->gainQuantSt) ||
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      p_ol_wgh_init(&s->pitchOLWghtSt) ||
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      ton_stab_init(&s->tonStabSt) ||
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad1_init(&s->vadSt) ||
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad2_init(&s->vadSt) ||
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      dtx_enc_init(&s->dtx_encSt) ||
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      lpc_init(&s->lpcSt)) {
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     cod_amr_exit(&s);
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     return -1;
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  cod_amr_reset(s);
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  *state = s;
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  return 0;
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_init(cod_amrState **state, Flag dtx)
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cod_amrState* s;
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (state == (cod_amrState **) NULL)
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprint(stderr, "cod_amr_init: invalid parameter\n");  */
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = NULL;
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* allocate memory */
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((s = (cod_amrState *) malloc(sizeof(cod_amrState))) == NULL)
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprint(stderr, "cod_amr_init:
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                           can not malloc state structure\n");  */
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->lpcSt = NULL;
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->lspSt = NULL;
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->clLtpSt = NULL;
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->gainQuantSt = NULL;
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->pitchOLWghtSt = NULL;
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->tonStabSt = NULL;
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->vadSt = NULL;
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->dtx_encSt = NULL;
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->dtx = dtx;
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize overflow Flag */
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    s->overflow = 0;
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Init sub states */
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (cl_ltp_init(&s->clLtpSt) ||
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            lsp_init(&s->lspSt) ||
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            gainQuant_init(&s->gainQuantSt) ||
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            p_ol_wgh_init(&s->pitchOLWghtSt) ||
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ton_stab_init(&s->tonStabSt) ||
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            vad1_init(&s->vadSt) ||
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            vad2_init(&s->vadSt) ||
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            dtx_enc_init(&s->dtx_encSt) ||
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            lpc_init(&s->lpcSt))
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cod_amr_exit(&s);
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cod_amr_reset(s);
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = s;
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(0);
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_reset
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state = pointer to a structure of type cod_amrState
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Structure pointed to by state is initialized to initial values.
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Returns 0 if memory was successfully initialized,
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        otherwise returns -1.
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function resets the state memory for cod_amr.
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_reset (cod_amrState *st)
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 i;
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st == (cod_amrState *) NULL){
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      fprintf(stderr, "cod_amr_reset: invalid parameter\n");
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      return -1;
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *-----------------------------------------------------------------------*
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *          Initialize pointers to speech vector.                        *
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *-----------------------------------------------------------------------*
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->new_speech = st->old_speech + L_TOTAL - L_FRAME;   // New speech
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->speech = st->new_speech - L_NEXT;                  // Present frame
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->p_window = st->old_speech + L_TOTAL - L_WINDOW;    // For LPC window
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->p_window_12k2 = st->p_window - L_NEXT; // EFR LPC window: no lookahead
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Initialize static pointers
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->wsp = st->old_wsp + PIT_MAX;
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->exc = st->old_exc + PIT_MAX + L_INTERPOL;
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->zero = st->ai_zero + MP1;
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->error = st->mem_err + M;
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->h1 = &st->hvec[L_SUBFR];
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Static vectors to zero
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->old_speech, L_TOTAL);
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->old_exc,    PIT_MAX + L_INTERPOL);
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->old_wsp,    PIT_MAX);
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->mem_syn,    M);
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->mem_w,      M);
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->mem_w0,     M);
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->mem_err,    M);
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->zero,       L_SUBFR);
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Set_zero(st->hvec,       L_SUBFR);    // set to zero "h1[-L_SUBFR..-1]"
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // OL LTP states
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   for (i = 0; i < 5; i++)
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->old_lags[i] = 40;
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Reset lpc states
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lpc_reset(st->lpcSt);
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Reset lsp states
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lsp_reset(st->lspSt);
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Reset clLtp states
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   cl_ltp_reset(st->clLtpSt);
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   gainQuant_reset(st->gainQuantSt);
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   p_ol_wgh_reset(st->pitchOLWghtSt);
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   ton_stab_reset(st->tonStabSt);
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   vad1_reset(st->vadSt);
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   vad2_reset(st->vadSt);
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   dtx_enc_reset(st->dtx_encSt);
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->sharp = SHARPMIN;
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return 0;
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_reset(cod_amrState *st)
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i;
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st == (cod_amrState *) NULL)
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* fprint(stderr, "cod_amr_reset: invalid parameter\n");  */
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*-----------------------------------------------------------------------*
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     *          Initialize pointers to speech vector.                        *
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     *-----------------------------------------------------------------------*/
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->new_speech = st->old_speech + L_TOTAL - L_FRAME;   /* New speech     */
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->speech = st->new_speech - L_NEXT;                  /* Present frame  */
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->p_window = st->old_speech + L_TOTAL - L_WINDOW;    /* For LPC window */
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->p_window_12k2 = st->p_window - L_NEXT; /* EFR LPC window: no lookahead */
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize static pointers */
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->wsp = st->old_wsp + PIT_MAX;
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->exc = st->old_exc + PIT_MAX + L_INTERPOL;
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->zero = st->ai_zero + MP1;
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->error = st->mem_err + M;
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->h1 = &st->hvec[L_SUBFR];
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Initialize overflow Flag */
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->overflow = 0;
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Static vectors to zero */
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->old_speech, 0, sizeof(Word16)*L_TOTAL);
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->old_exc, 0,    sizeof(Word16)*(PIT_MAX + L_INTERPOL));
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->old_wsp, 0,    sizeof(Word16)*PIT_MAX);
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->mem_syn, 0,    sizeof(Word16)*M);
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->mem_w,   0,    sizeof(Word16)*M);
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->mem_w0,  0,    sizeof(Word16)*M);
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->mem_err, 0,    sizeof(Word16)*M);
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->zero, 0,       sizeof(Word16)*L_SUBFR);
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->hvec, 0,       sizeof(Word16)*L_SUBFR);    /* set to zero "h1[-L_SUBFR..-1]" */
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* OL LTP states */
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = 0; i < 5; i++)
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->old_lags[i] = 40;
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset lpc states */
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lpc_reset(st->lpcSt);
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset lsp states */
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lsp_reset(st->lspSt);
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset clLtp states */
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cl_ltp_reset(st->clLtpSt);
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gainQuant_reset(st->gainQuantSt);
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_ol_wgh_reset(st->pitchOLWghtSt);
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ton_stab_reset(st->tonStabSt);
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    vad1_reset(st->vadSt);
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    vad2_reset(st->vadSt);
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_enc_reset(st->dtx_encSt);
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->sharp = SHARPMIN;
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(0);
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_exit
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state = pointer to a pointer to a structure of type cod_amrState
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    state points to a NULL address
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function frees the memory used for state memory.
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid cod_amr_exit (cod_amrState **state)
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (state == NULL || *state == NULL)
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      return;
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // dealloc members
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lpc_exit(&(*state)->lpcSt);
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lsp_exit(&(*state)->lspSt);
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   gainQuant_exit(&(*state)->gainQuantSt);
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   cl_ltp_exit(&(*state)->clLtpSt);
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   p_ol_wgh_exit(&(*state)->pitchOLWghtSt);
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   ton_stab_exit(&(*state)->tonStabSt);
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   vad1_exit(&(*state)->vadSt);
596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   vad2_exit(&(*state)->vadSt);
598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   dtx_enc_exit(&(*state)->dtx_encSt);
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // deallocate memory
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   free(*state);
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *state = NULL;
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return;
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid cod_amr_exit(cod_amrState **state)
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (state == NULL || *state == NULL)
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* dealloc members */
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lpc_exit(&(*state)->lpcSt);
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lsp_exit(&(*state)->lspSt);
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    gainQuant_exit(&(*state)->gainQuantSt);
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cl_ltp_exit(&(*state)->clLtpSt);
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    p_ol_wgh_exit(&(*state)->pitchOLWghtSt);
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ton_stab_exit(&(*state)->tonStabSt);
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    vad1_exit(&(*state)->vadSt);
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    vad2_exit(&(*state)->vadSt);
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_enc_exit(&(*state)->dtx_encSt);
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* deallocate memory */
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    free(*state); // BX
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *state = NULL;
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return;
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr_first
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to a structure of type cod_amrState
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    new_speech = pointer to buffer of length L_FRAME that contains
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 the speech input (Word16)
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The structure of type cod_amrState pointed to by st is updated.
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 0 (int)
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function copes with look-ahead and calls cod_amr.
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber No input argument are passed to this function. However, before
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber calling this function, 40 new speech data should be copied to the
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vector new_speech[]. This is a global pointer which is declared in
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber this file (it points to the end of speech buffer minus 200).
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr_first(cod_amrState *st,     // i/o : State struct
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  Word16 new_speech[])  // i   : speech input (L_FRAME)
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(new_speech,&st->new_speech[-L_NEXT], L_NEXT);
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   //   Copy(new_speech,st->new_speech,L_FRAME);
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return 0;
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr_first(cod_amrState *st,     /* i/o : State struct           */
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                     Word16 new_speech[])  /* i   : speech input (L_FRAME) */
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(&st->new_speech[-L_NEXT], new_speech, L_NEXT*sizeof(Word16));
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*   Copy(new_speech,st->new_speech,L_FRAME); */
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(0);
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: cod_amr
754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to a structure of type cod_amrState
759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    mode = AMR mode of type enum Mode
760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    new_speech = pointer to buffer of length L_FRAME that contains
761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             the speech input of type Word16
762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    ana = pointer to the analysis parameters of type Word16
763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    usedMode = pointer to the used mode of type enum Mode
764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    synth = pointer to a buffer containing the local synthesis speech of
765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        type Word16
766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The structure of type cod_amrState pointed to by st is updated.
769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The analysis parameter buffer pointed to by ana is updated.
770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The value pointed to by usedMode is updated.
771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    The local synthesis speech buffer pointed to by synth is updated.
772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 0 (int)
775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None.
781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function is the main encoder routine. It is called every 20 ms speech
786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame, operating on the newly read 160 speech samples. It performs the
787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber principle encoding functions to produce the set of encoded parameters
788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber which include the LSP, adaptive codebook, and fixed codebook
789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber quantization indices (addresses and gains).
790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Before calling this function, 160 new speech data should be copied to the
792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber vector new_speech[]. This is a global pointer which is declared in
793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber this file (it points to the end of speech buffer minus 160).
794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The outputs of the function are:
796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     ana[]:     vector of analysis parameters.
797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     synth[]:   Local synthesis speech (for debugging purposes)
798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None.
803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint cod_amr(
813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cod_amrState *st,          // i/o : State struct
814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode mode,            // i   : AMR mode
815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 new_speech[],       // i   : speech input (L_FRAME)
816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 ana[],              // o   : Analysis parameters
817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode *usedMode,       // o   : used mode
818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 synth[]             // o   : Local synthesis
819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // LPC coefficients
822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 A_t[(MP1) * 4];      // A(z) unquantized for the 4 subframes
823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 Aq_t[(MP1) * 4];     // A(z)   quantized for the 4 subframes
824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 *A, *Aq;             // Pointer on A_t and Aq_t
825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 lsp_new[M];
826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Other vectors
828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 xn[L_SUBFR];         // Target vector for pitch search
829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 xn2[L_SUBFR];        // Target vector for codebook search
830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 code[L_SUBFR];       // Fixed codebook excitation
831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 y1[L_SUBFR];         // Filtered adaptive excitation
832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 y2[L_SUBFR];         // Filtered fixed codebook excitation
833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 gCoeff[6];           // Correlations between xn, y1, & y2:
834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 res[L_SUBFR];        // Short term (LPC) prediction residual
835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 res2[L_SUBFR];       // Long term (LTP) prediction residual
836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Vector and scalars needed for the MR475
838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 xn_sf0[L_SUBFR];     // Target vector for pitch search
839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 y2_sf0[L_SUBFR];     // Filtered codebook innovation
840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 code_sf0[L_SUBFR];   // Fixed codebook excitation
841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 h1_sf0[L_SUBFR];     // The impulse response of sf0
842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 mem_syn_save[M];     // Filter memory
843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 mem_w0_save[M];      // Filter memory
844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 mem_err_save[M];     // Filter memory
845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 sharp_save;          // Sharpening
846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 evenSubfr;           // Even subframe indicator
847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 T0_sf0 = 0;          // Integer pitch lag of sf0
848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 T0_frac_sf0 = 0;     // Fractional pitch lag of sf0
849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 i_subfr_sf0 = 0;     // Position in exc[] for sf0
850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 gain_pit_sf0;        // Quantized pitch gain for sf0
851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 gain_code_sf0;       // Quantized codebook gain for sf0
852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Scalars
854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 i_subfr, subfrNr;
855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 T_op[L_FRAME/L_FRAME_BY2];
856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 T0, T0_frac;
857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 gain_pit, gain_code;
858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Flags
860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 lsp_flag = 0;        // indicates resonance in LPC filter
861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 gp_limit;            // pitch gain limit value
862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 vad_flag;            // VAD decision flag
863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 compute_sid_flag;    // SID analysis  flag
864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(new_speech, st->new_speech, L_FRAME);
866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *usedMode = mode;
868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // DTX processing
870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st->dtx)
871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {  // no test() call since this if is only in simulation env
872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Find VAD decision
873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef  VAD2
875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad_flag = vad2 (st->new_speech,    st->vadSt);
876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad_flag = vad2 (st->new_speech+80, st->vadSt) || vad_flag;
877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad_flag = vad1(st->vadSt, st->new_speech);
879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // NB! usedMode may change here
882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      compute_sid_flag = tx_dtx_handler(st->dtx_encSt,
883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                        vad_flag,
884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                        usedMode);
885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   else
887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      compute_sid_flag = 0;
889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  - Perform LPC analysis:                                               *
893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * autocorrelation + lag windowing                                *
894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * Levinson-durbin algorithm to find a[]                          *
895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * convert a[] to lsp[]                                           *
896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * quantize and code the LSPs                                     *
897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * find the interpolated LSPs and convert to a[] for all          *
898b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *         subframes (both quantized and unquantized)                     *
899b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
900b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
901b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // LP analysis
902b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lpc(st->lpcSt, mode, st->p_window, st->p_window_12k2, A_t);
903b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
904b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
905b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // From A(z) to lsp. LSP quantization and interpolation
906b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   lsp(st->lspSt, mode, *usedMode, A_t, Aq_t, lsp_new, &ana);
907b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
908b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
909b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Buffer lsp's and energy
910b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   dtx_buffer(st->dtx_encSt,
911b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          lsp_new,
912b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          st->new_speech);
913b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
914b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // Check if in DTX mode
915b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (sub(*usedMode, MRDTX) == 0)
916b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
917b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      dtx_enc(st->dtx_encSt,
918b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              compute_sid_flag,
919b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              st->lspSt->qSt,
920b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              st->gainQuantSt->gc_predSt,
921b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              &ana);
922b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
923b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Set_zero(st->old_exc,    PIT_MAX + L_INTERPOL);
924b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Set_zero(st->mem_w0,     M);
925b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Set_zero(st->mem_err,    M);
926b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Set_zero(st->zero,       L_SUBFR);
927b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Set_zero(st->hvec,       L_SUBFR);    // set to zero "h1[-L_SUBFR..-1]"
928b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Reset lsp states
929b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      lsp_reset(st->lspSt);
930b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Copy(lsp_new, st->lspSt->lsp_old, M);
931b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Copy(lsp_new, st->lspSt->lsp_old_q, M);
932b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
933b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Reset clLtp states
934b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      cl_ltp_reset(st->clLtpSt);
935b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->sharp = SHARPMIN;
936b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
937b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   else
938b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
939b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       // check resonance in the filter
940b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      lsp_flag = check_lsp(st->tonStabSt, st->lspSt->lsp_old);
941b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
942b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
943b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *----------------------------------------------------------------------*
944b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the weighted input speech w_sp[] for the whole speech frame   *
945b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the open-loop pitch delay for first 2 subframes               *
946b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Set the range for searching closed-loop pitch in 1st subframe      *
947b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the open-loop pitch delay for last 2 subframes                *
948b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *----------------------------------------------------------------------*
949b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
950b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2
951b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st->dtx)
952b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {  // no test() call since this if is only in simulation env
953b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       st->vadSt->L_Rmax = 0;
954b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       st->vadSt->L_R0 = 0;
955b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
956b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
957b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   for(subfrNr = 0, i_subfr = 0;
958b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       subfrNr < L_FRAME/L_FRAME_BY2;
959b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       subfrNr++, i_subfr += L_FRAME_BY2)
960b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
961b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Pre-processing on 80 samples
962b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      pre_big(mode, gamma1, gamma1_12k2, gamma2, A_t, i_subfr, st->speech,
963b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              st->mem_w, st->wsp);
964b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
965b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if ((sub(mode, MR475) != 0) && (sub(mode, MR515) != 0))
966b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
967b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Find open loop pitch lag for two subframes
968b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[i_subfr],
969b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &T_op[subfrNr], st->old_lags, st->ol_gain_flg, subfrNr,
970b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->dtx);
971b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
972b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
973b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
974b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if ((sub(mode, MR475) == 0) || (sub(mode, MR515) == 0))
975b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
976b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Find open loop pitch lag for ONE FRAME ONLY
977b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // search on 160 samples
978b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
979b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[0], &T_op[0],
980b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             st->old_lags, st->ol_gain_flg, 1, st->dtx);
981b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      T_op[1] = T_op[0];
982b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
983b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
984b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2
985b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st->dtx)
986b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {  // no test() call since this if is only in simulation env
987b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      LTP_flag_update(st->vadSt, mode);
988b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
989b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
990b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
991b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
992b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // run VAD pitch detection
993b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st->dtx)
994b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {  // no test() call since this if is only in simulation env
995b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      vad_pitch_detection(st->vadSt, T_op);
996b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
997b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
998b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
999b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (sub(*usedMode, MRDTX) == 0)
1000b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
1001b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      goto the_end;
1002b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
1003b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1004b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
1005b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *          Loop for every subframe in the analysis frame                 *
1006b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
1007b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  To find the pitch and innovation parameters. The subframe size is     *
1008b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *
1009b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the weighted LPC coefficients                               *
1010b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the LPC residual signal res[]                               *
1011b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - compute the target signal for pitch search                       *
1012b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - compute impulse response of weighted synthesis filter (h1[])     *
1013b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the closed-loop pitch parameters                            *
1014b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - encode the pitch dealy                                           *
1015b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - update the impulse response h1[] by including fixed-gain pitch   *
1016b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find target vector for codebook search                           *
1017b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - codebook search                                                  *
1018b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - encode codebook address                                          *
1019b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - VQ of pitch and codebook gains                                   *
1020b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find synthesis speech                                            *
1021b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - update states of weighting filter                                *
1022b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
1023b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1024b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   A = A_t;      // pointer to interpolated LPC parameters
1025b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Aq = Aq_t;    // pointer to interpolated quantized LPC parameters
1026b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1027b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   evenSubfr = 0;
1028b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   subfrNr = -1;
1029b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
1030b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
1031b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      subfrNr = add(subfrNr, 1);
1032b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      evenSubfr = sub(1, evenSubfr);
1033b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1034b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Save states for the MR475 mode
1035b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if ((evenSubfr != 0) && (sub(*usedMode, MR475) == 0))
1036b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1037b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         Copy(st->mem_syn, mem_syn_save, M);
1038b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         Copy(st->mem_w0, mem_w0_save, M);
1039b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         Copy(st->mem_err, mem_err_save, M);
1040b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         sharp_save = st->sharp;
1041b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1042b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1043b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1044b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * - Preprocessing of subframe                                     *
1045b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1046b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (sub(*usedMode, MR475) != 0)
1047b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1048b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         subframePreProc(*usedMode, gamma1, gamma1_12k2,
1049b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         gamma2, A, Aq, &st->speech[i_subfr],
1050b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->mem_err, st->mem_w0, st->zero,
1051b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->ai_zero, &st->exc[i_subfr],
1052b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->h1, xn, res, st->error);
1053b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1054b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      else
1055b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      { // MR475
1056b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         subframePreProc(*usedMode, gamma1, gamma1_12k2,
1057b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         gamma2, A, Aq, &st->speech[i_subfr],
1058b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->mem_err, mem_w0_save, st->zero,
1059b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->ai_zero, &st->exc[i_subfr],
1060b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         st->h1, xn, res, st->error);
1061b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1062b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // save impulse response (modified in cbsearch)
1063b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         if (evenSubfr != 0)
1064b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         {
1065b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             Copy (st->h1, h1_sf0, L_SUBFR);
1066b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         }
1067b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1068b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1069b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // copy the LP residual (res2 is modified in the CL LTP search)
1070b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Copy (res, res2, L_SUBFR);
1071b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1072b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1073b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1074b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * - Closed-loop LTP search                                        *
1075b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1076b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      cl_ltp(st->clLtpSt, st->tonStabSt, *usedMode, i_subfr, T_op, st->h1,
1077b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             &st->exc[i_subfr], res2, xn, lsp_flag, xn2, y1,
1078b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             &T0, &T0_frac, &gain_pit, gCoeff, &ana,
1079b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             &gp_limit);
1080b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1081b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // update LTP lag history
1082b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if ((subfrNr == 0) && (st->ol_gain_flg[0] > 0))
1083b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1084b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->old_lags[1] = T0;
1085b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1086b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1087b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if ((sub(subfrNr, 3) == 0) && (st->ol_gain_flg[1] > 0))
1088b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1089b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->old_lags[0] = T0;
1090b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1091b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1092b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1093b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1094b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * - Inovative codebook search (find index and gain)               *
1095b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *-----------------------------------------------------------------*
1096b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      cbsearch(xn2, st->h1, T0, st->sharp, gain_pit, res2,
1097b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               code, y2, &ana, *usedMode, subfrNr);
1098b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1099b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *------------------------------------------------------*
1100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       * - Quantization of gains.                             *
1101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber       *------------------------------------------------------*
1102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      gainQuant(st->gainQuantSt, *usedMode, res, &st->exc[i_subfr], code,
1103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                xn, xn2,  y1, y2, gCoeff, evenSubfr, gp_limit,
1104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &gain_pit_sf0, &gain_code_sf0,
1105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &gain_pit, &gain_code, &ana);
1106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // update gain history
1108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      update_gp_clipping(st->tonStabSt, gain_pit);
1109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (sub(*usedMode, MR475) != 0)
1111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // Subframe Post Porcessing
1113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          gain_code, Aq, synth, xn, code, y1, y2, st->mem_syn,
1115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                          st->mem_err, st->mem_w0, st->exc, &st->sharp);
1116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      else
1118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
1119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         if (evenSubfr != 0)
1120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         {
1121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            i_subfr_sf0 = i_subfr;
1122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Copy(xn, xn_sf0, L_SUBFR);
1123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Copy(y2, y2_sf0, L_SUBFR);
1124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Copy(code, code_sf0, L_SUBFR);
1125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            T0_sf0 = T0;
1126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            T0_frac_sf0 = T0_frac;
1127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // Subframe Post Porcessing
1129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             gain_code, Aq, synth, xn, code, y1, y2,
1131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             mem_syn_save, st->mem_err, mem_w0_save,
1132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             st->exc, &st->sharp);
1133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->sharp = sharp_save;
1134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         }
1135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         else
1136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         {
1137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // update both subframes for the MR475
1138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // Restore states for the MR475 mode
1140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Copy(mem_err_save, st->mem_err, M);
1141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // re-build excitation for sf 0
1143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Pred_lt_3or6(&st->exc[i_subfr_sf0], T0_sf0, T0_frac_sf0,
1144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                         L_SUBFR, 1);
1145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Convolve(&st->exc[i_subfr_sf0], h1_sf0, y1, L_SUBFR);
1146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Aq -= MP1;
1148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePostProc(st->speech, *usedMode, i_subfr_sf0,
1149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             gain_pit_sf0, gain_code_sf0, Aq,
1150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             synth, xn_sf0, code_sf0, y1, y2_sf0,
1151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             st->mem_syn, st->mem_err, st->mem_w0, st->exc,
1152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             &sharp_save); // overwrites sharp_save
1153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Aq += MP1;
1154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // re-run pre-processing to get xn right (needed by postproc)
1156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // (this also reconstructs the unsharpened h1 for sf 1)
1157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePreProc(*usedMode, gamma1, gamma1_12k2,
1158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            gamma2, A, Aq, &st->speech[i_subfr],
1159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->mem_err, st->mem_w0, st->zero,
1160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->ai_zero, &st->exc[i_subfr],
1161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->h1, xn, res, st->error);
1162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // re-build excitation sf 1 (changed if lag < L_SUBFR)
1164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Pred_lt_3or6(&st->exc[i_subfr], T0, T0_frac, L_SUBFR, 1);
1165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Convolve(&st->exc[i_subfr], st->h1, y1, L_SUBFR);
1166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             gain_code, Aq, synth, xn, code, y1, y2,
1169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             st->mem_syn, st->mem_err, st->mem_w0,
1170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             st->exc, &st->sharp);
1171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         }
1172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      A += MP1;    // interpolated LPC parameters for next subframe
1176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Aq += MP1;
1177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
1178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(&st->old_exc[L_FRAME], &st->old_exc[0], PIT_MAX + L_INTERPOL);
1180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberthe_end:
1182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *--------------------------------------------------*
1184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * Update signal for next frame.                    *
1185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *--------------------------------------------------*
1186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(&st->old_wsp[L_FRAME], &st->old_wsp[0], PIT_MAX);
1187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(&st->old_speech[L_FRAME], &st->old_speech[0], L_TOTAL - L_FRAME);
1189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return 0;
1191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
1194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
1196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
1197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
1199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
1201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
1204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
1205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
1207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
1210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
1211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
1214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 cod_amr(
1216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    cod_amrState *st,          /* i/o : State struct                   */
1217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode mode,            /* i   : AMR mode                       */
1218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 new_speech[],       /* i   : speech input (L_FRAME)         */
1219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 ana[],              /* o   : Analysis parameters            */
1220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    enum Mode *usedMode,       /* o   : used mode                      */
1221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 synth[]            /* o   : Local synthesis                */
1222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
1223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
1224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* LPC coefficients */
1225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 A_t[(MP1) * 4];      /* A(z) unquantized for the 4 subframes */
1226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 Aq_t[(MP1) * 4];     /* A(z)   quantized for the 4 subframes */
1227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *A, *Aq;             /* Pointer on A_t and Aq_t              */
1228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 lsp_new[M];
1229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Other vectors */
1231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 xn[L_SUBFR];         /* Target vector for pitch search       */
1232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 xn2[L_SUBFR];        /* Target vector for codebook search    */
1233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code[L_SUBFR];       /* Fixed codebook excitation            */
1234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y1[L_SUBFR];         /* Filtered adaptive excitation         */
1235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y2[L_SUBFR];         /* Filtered fixed codebook excitation   */
1236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gCoeff[6];           /* Correlations between xn, y1, & y2:   */
1237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 res[L_SUBFR];        /* Short term (LPC) prediction residual */
1238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 res2[L_SUBFR];       /* Long term (LTP) prediction residual  */
1239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Vector and scalars needed for the MR475 */
1241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 xn_sf0[L_SUBFR];     /* Target vector for pitch search       */
1242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 y2_sf0[L_SUBFR];     /* Filtered codebook innovation         */
1243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 code_sf0[L_SUBFR];   /* Fixed codebook excitation            */
1244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 h1_sf0[L_SUBFR];     /* The impulse response of sf0          */
1245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 mem_syn_save[M];     /* Filter memory                        */
1246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 mem_w0_save[M];      /* Filter memory                        */
1247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 mem_err_save[M];     /* Filter memory                        */
1248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 sharp_save;          /* Sharpening                           */
1249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 evenSubfr;           /* Even subframe indicator              */
1250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 T0_sf0 = 0;          /* Integer pitch lag of sf0             */
1251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 T0_frac_sf0 = 0;     /* Fractional pitch lag of sf0          */
1252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i_subfr_sf0 = 0;     /* Position in exc[] for sf0            */
1253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gain_pit_sf0;        /* Quantized pitch gain for sf0         */
1254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gain_code_sf0;       /* Quantized codebook gain for sf0      */
1255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Scalars */
1257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i_subfr, subfrNr;
1258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 T_op[L_FRAME/L_FRAME_BY2];
1259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 T0, T0_frac;
1260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gain_pit, gain_code;
1261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Flags */
1263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 lsp_flag = 0;        /* indicates resonance in LPC filter    */
1264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 gp_limit;            /* pitch gain limit value               */
1265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 vad_flag;            /* VAD decision flag                    */
1266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 compute_sid_flag;    /* SID analysis  flag                   */
1267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Flag   *pOverflow = &(st->overflow);     /* Overflow flag            */
1268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(st->new_speech, new_speech, L_FRAME*sizeof(Word16));
1271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *usedMode = mode;
1273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* DTX processing */
1275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st->dtx)
1276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Find VAD decision */
1278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef  VAD2
1279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        vad_flag = vad2(st->new_speech,    st->vadSt, pOverflow);
1280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        vad_flag = vad2(st->new_speech + 80, st->vadSt, pOverflow) || vad_flag;
1281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#else
1282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        vad_flag = vad1(st->vadSt, st->new_speech, pOverflow);
1283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
1284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* NB! usedMode may change here */
1286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        compute_sid_flag = tx_dtx_handler(st->dtx_encSt,
1287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                          vad_flag,
1288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                          usedMode, pOverflow);
1289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
1291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        compute_sid_flag = 0;
1293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*------------------------------------------------------------------------*
1296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  - Perform LPC analysis:                                               *
1297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * autocorrelation + lag windowing                                *
1298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * Levinson-durbin algorithm to find a[]                          *
1299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * convert a[] to lsp[]                                           *
1300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * quantize and code the LSPs                                     *
1301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *       * find the interpolated LSPs and convert to a[] for all          *
1302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *         subframes (both quantized and unquantized)                     *
1303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*/
1304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* LP analysis */
1306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lpc(st->lpcSt, mode, st->p_window, st->p_window_12k2, A_t, pOverflow);
1307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* From A(z) to lsp. LSP quantization and interpolation */
1309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lsp(st->lspSt, mode, *usedMode, A_t, Aq_t, lsp_new, &ana, pOverflow);
1310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Buffer lsp's and energy */
1312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_buffer(st->dtx_encSt,
1313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               lsp_new,
1314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               st->new_speech, pOverflow);
1315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Check if in DTX mode */
1317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (*usedMode == MRDTX)
1319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        dtx_enc(st->dtx_encSt,
1321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                compute_sid_flag,
1322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->lspSt->qSt,
1323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &(st->gainQuantSt->gc_predSt),
1324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                &ana, pOverflow);
1325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memset(st->old_exc, 0,   sizeof(Word16)*(PIT_MAX + L_INTERPOL));
1327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memset(st->mem_w0,  0,   sizeof(Word16)*M);
1328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memset(st->mem_err, 0,   sizeof(Word16)*M);
1329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memset(st->zero,    0,   sizeof(Word16)*L_SUBFR);
1330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memset(st->hvec,    0,   sizeof(Word16)*L_SUBFR);    /* set to zero "h1[-L_SUBFR..-1]" */
1331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Reset lsp states */
1332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        lsp_reset(st->lspSt);
1333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memcpy(st->lspSt->lsp_old,   lsp_new, M*sizeof(Word16));
1335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memcpy(st->lspSt->lsp_old_q, lsp_new, M*sizeof(Word16));
1336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Reset clLtp states */
1338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cl_ltp_reset(st->clLtpSt);
1339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->sharp = SHARPMIN;
1340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
1342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* check resonance in the filter */
1344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        lsp_flag = check_lsp(st->tonStabSt, st->lspSt->lsp_old, pOverflow);
1345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*----------------------------------------------------------------------*
1348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the weighted input speech w_sp[] for the whole speech frame   *
1349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the open-loop pitch delay for first 2 subframes               *
1350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Set the range for searching closed-loop pitch in 1st subframe      *
1351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * - Find the open-loop pitch delay for last 2 subframes                *
1352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *----------------------------------------------------------------------*/
1353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2
1355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st->dtx)
1356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->vadSt->L_Rmax = 0;
1358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->vadSt->L_R0 = 0;
1359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
1361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (subfrNr = 0, i_subfr = 0;
1363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subfrNr < L_FRAME / L_FRAME_BY2;
1364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subfrNr++, i_subfr += L_FRAME_BY2)
1365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Pre-processing on 80 samples */
1367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pre_big(mode, gamma1, gamma1_12k2, gamma2, A_t, i_subfr, st->speech,
1368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->mem_w, st->wsp, pOverflow);
1369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if ((mode != MR475) && (mode != MR515))
1372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Find open loop pitch lag for two subframes */
1374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[i_subfr],
1375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   &T_op[subfrNr], st->old_lags, st->ol_gain_flg, subfrNr,
1376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   st->dtx, pOverflow);
1377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((mode == MR475) || (mode == MR515))
1381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Find open loop pitch lag for ONE FRAME ONLY */
1383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* search on 160 samples */
1384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        ol_ltp(st->pitchOLWghtSt, st->vadSt, mode, &st->wsp[0], &T_op[0],
1386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               st->old_lags, st->ol_gain_flg, 1, st->dtx, pOverflow);
1387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        T_op[1] = T_op[0];
1388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef VAD2
1391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st->dtx)
1392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        LTP_flag_update(st->vadSt, (Word16) mode, pOverflow);
1394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
1396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifndef VAD2
1398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* run VAD pitch detection */
1399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st->dtx)
1400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        vad_pitch_detection(st->vadSt, T_op, pOverflow);
1402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif
1404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (*usedMode == MRDTX)
1406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        goto the_end;
1408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*------------------------------------------------------------------------*
1411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *          Loop for every subframe in the analysis frame                 *
1412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*
1413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  To find the pitch and innovation parameters. The subframe size is     *
1414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *
1415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the weighted LPC coefficients                               *
1416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the LPC residual signal res[]                               *
1417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - compute the target signal for pitch search                       *
1418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - compute impulse response of weighted synthesis filter (h1[])     *
1419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find the closed-loop pitch parameters                            *
1420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - encode the pitch dealy                                           *
1421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - update the impulse response h1[] by including fixed-gain pitch   *
1422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find target vector for codebook search                           *
1423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - codebook search                                                  *
1424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - encode codebook address                                          *
1425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - VQ of pitch and codebook gains                                   *
1426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - find synthesis speech                                            *
1427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *     - update states of weighting filter                                *
1428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *------------------------------------------------------------------------*/
1429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    A = A_t;      /* pointer to interpolated LPC parameters */
1431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Aq = Aq_t;    /* pointer to interpolated quantized LPC parameters */
1432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    evenSubfr = 0;
1434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    subfrNr = -1;
1435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
1436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        subfrNr++;
1438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        evenSubfr = 1 - evenSubfr;
1439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Save states for the MR475 mode */
1441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if ((evenSubfr != 0) && (*usedMode == MR475))
1443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            memcpy(mem_syn_save, st->mem_syn, M*sizeof(Word16));
1445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            memcpy(mem_w0_save, st->mem_w0, M*sizeof(Word16));
1446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            memcpy(mem_err_save, st->mem_err, M*sizeof(Word16));
1447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            sharp_save = st->sharp;
1449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-----------------------------------------------------------------*
1452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * - Preprocessing of subframe                                     *
1453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *-----------------------------------------------------------------*/
1454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (*usedMode != MR475)
1456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePreProc(*usedMode, gamma1, gamma1_12k2,
1458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            gamma2, A, Aq, &st->speech[i_subfr],
1459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->mem_err, st->mem_w0, st->zero,
1460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->ai_zero, &st->exc[i_subfr],
1461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->h1, xn, res, st->error);
1462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
1464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        { /* MR475 */
1465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePreProc(*usedMode, gamma1, gamma1_12k2,
1466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            gamma2, A, Aq, &st->speech[i_subfr],
1467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->mem_err, mem_w0_save, st->zero,
1468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->ai_zero, &st->exc[i_subfr],
1469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                            st->h1, xn, res, st->error);
1470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* save impulse response (modified in cbsearch) */
1472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (evenSubfr != 0)
1474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                memcpy(h1_sf0, st->h1, L_SUBFR*sizeof(Word16));
1476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* copy the LP residual (res2 is modified in the CL LTP search)    */
1481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memcpy(res2, res, L_SUBFR*sizeof(Word16));
1482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-----------------------------------------------------------------*
1484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * - Closed-loop LTP search                                        *
1485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *-----------------------------------------------------------------*/
1486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cl_ltp(st->clLtpSt, st->tonStabSt, *usedMode, i_subfr, T_op, st->h1,
1487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               &st->exc[i_subfr], res2, xn, lsp_flag, xn2, y1,
1488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               &T0, &T0_frac, &gain_pit, gCoeff, &ana,
1489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               &gp_limit, pOverflow);
1490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* update LTP lag history */
1492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if ((subfrNr == 0) && (st->ol_gain_flg[0] > 0))
1494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->old_lags[1] = T0;
1496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if ((subfrNr == 3) && (st->ol_gain_flg[1] > 0))
1500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->old_lags[0] = T0;
1502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*-----------------------------------------------------------------*
1505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * - Inovative codebook search (find index and gain)               *
1506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *-----------------------------------------------------------------*/
1507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        cbsearch(xn2, st->h1, T0, st->sharp, gain_pit, res2,
1508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 code, y2, &ana, *usedMode, subfrNr, pOverflow);
1509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*------------------------------------------------------*
1511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        * - Quantization of gains.                             *
1512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *------------------------------------------------------*/
1513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        gainQuant(st->gainQuantSt, *usedMode, res, &st->exc[i_subfr], code,
1514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  xn, xn2,  y1, y2, gCoeff, evenSubfr, gp_limit,
1515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  &gain_pit_sf0, &gain_code_sf0,
1516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  &gain_pit, &gain_code, &ana, pOverflow);
1517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* update gain history */
1519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        update_gp_clipping(st->tonStabSt, gain_pit, pOverflow);
1520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (*usedMode != MR475)
1523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* Subframe Post Porcessing */
1525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             gain_code, Aq, synth, xn, code, y1, y2, st->mem_syn,
1527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             st->mem_err, st->mem_w0, st->exc, &st->sharp, pOverflow);
1528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
1530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
1531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (evenSubfr != 0)
1533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                i_subfr_sf0 = i_subfr;
1535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                memcpy(xn_sf0, xn, L_SUBFR*sizeof(Word16));
1537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                memcpy(y2_sf0, y2, L_SUBFR*sizeof(Word16));
1538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                memcpy(code_sf0, code, L_SUBFR*sizeof(Word16));
1539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                T0_sf0 = T0;
1541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                T0_frac_sf0 = T0_frac;
1542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* Subframe Post Porcessing */
1544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 gain_code, Aq, synth, xn, code, y1, y2,
1546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 mem_syn_save, st->mem_err, mem_w0_save,
1547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 st->exc, &st->sharp, pOverflow);
1548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                st->sharp = sharp_save;
1549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
1551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* update both subframes for the MR475 */
1553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* Restore states for the MR475 mode */
1555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                memcpy(st->mem_err, mem_err_save, M*sizeof(Word16));
1556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* re-build excitation for sf 0 */
1559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Pred_lt_3or6(&st->exc[i_subfr_sf0], T0_sf0, T0_frac_sf0,
1560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             L_SUBFR, 1, pOverflow);
1561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Convolve(&st->exc[i_subfr_sf0], h1_sf0, y1, L_SUBFR);
1562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Aq -= MP1;
1564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subframePostProc(st->speech, *usedMode, i_subfr_sf0,
1565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 gain_pit_sf0, gain_code_sf0, Aq,
1566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 synth, xn_sf0, code_sf0, y1, y2_sf0,
1567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 st->mem_syn, st->mem_err, st->mem_w0, st->exc,
1568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 &sharp_save, pOverflow); /* overwrites sharp_save */
1569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Aq += MP1;
1570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* re-run pre-processing to get xn right (needed by postproc) */
1572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* (this also reconstructs the unsharpened h1 for sf 1)       */
1573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subframePreProc(*usedMode, gamma1, gamma1_12k2,
1574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                gamma2, A, Aq, &st->speech[i_subfr],
1575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                st->mem_err, st->mem_w0, st->zero,
1576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                st->ai_zero, &st->exc[i_subfr],
1577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                st->h1, xn, res, st->error);
1578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* re-build excitation sf 1 (changed if lag < L_SUBFR) */
1580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Pred_lt_3or6(&st->exc[i_subfr], T0, T0_frac, L_SUBFR, 1, pOverflow);
1581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Convolve(&st->exc[i_subfr], st->h1, y1, L_SUBFR);
1582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                subframePostProc(st->speech, *usedMode, i_subfr, gain_pit,
1584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 gain_code, Aq, synth, xn, code, y1, y2,
1585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 st->mem_syn, st->mem_err, st->mem_w0,
1586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 st->exc, &st->sharp, pOverflow);
1587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        A += MP1;    /* interpolated LPC parameters for next subframe */
1591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Aq += MP1;
1592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(&st->old_exc[0], &st->old_exc[L_FRAME], (PIT_MAX + L_INTERPOL)*sizeof(Word16));
1595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberthe_end:
1597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /*--------------------------------------------------*
1599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    * Update signal for next frame.                    *
1600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *--------------------------------------------------*/
1601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(&st->old_wsp[0], &st->old_wsp[L_FRAME], PIT_MAX*sizeof(Word16));
1603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(&st->old_speech[0], &st->old_speech[L_FRAME], (L_TOTAL - L_FRAME)*sizeof(Word16));
1604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(0);
1606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1609