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/dtx_enc.c
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Funtions: dtx_enc_init
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           dtx_enc_reset
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           dtx_enc_exit
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           dtx_enc
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           dtx_buffer
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           tx_dtx_handler
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     Date: 06/08/2000
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated template used to PV coding template. First attempt at
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          optimizing C code.
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated file per comments gathered from Phase 2/3 review.
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          Synched up with new template (Inputs/Outputs section). Deleted
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          lines leftover from original code prior to the code section of
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          dtx_enc_exit function. Deleted confusing comment in the log_en
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          calculation in dtx_enc function. Restructured IF statement in
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          the calculation of the sum of squares of speech signals in
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          dtx_buffer.
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added setting of Overflow flag in inlined code.
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UTMS version 3.2.0. Updated coding
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              template. Removed unnecessary include files.
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Modified FOR loops to count down.
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              2. Fixed typecasting issue with TI C compiler.
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              3. Fixed comment in dtx_enc pseudo-code.
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              4. Added dtx_enc code comment pertaining to possible assembly
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 implementation.
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added calls to add() in tx_dtx_handler. Updated copyright year.
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Pass in pointer to overflow flag to all functions requiring this
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              flag. This is to make the library EPOC compatible.
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  For dtx_enc_reset() only
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Replaced copy() with memcpy.
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              2. Eliminated include file copy.h
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              3. Eliminated printf statement
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              For dtx_buffer()
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Replaced copy() with memcpy.
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              2. Eliminated math operations that unnecessary checked for
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 saturation, in some cases this by shifting before adding and
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 in other cases by evaluating the operands
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              3. Unrolled loop to speed up execution
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  For dtx_buffer()
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Modified scaling and added check for saturation. Previous
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 scaling was correct but altered precision, this cause bit
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 exactness test failure.
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  For dtx_buffer()
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber              1. Modified scaling and saturation checks. Previous
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 scaling was correct but altered precision, this cause bit
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 exactness test failure for dtx vad2.
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               files that now are chosen by OSCL definitions
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description:
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This file contains the various functions that perform the computation of the
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Silence Indicator (SID) parameters when in Discontinuous Transmission (DTX)
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mode.
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <stdlib.h>
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include <string.h>
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "dtx_enc.h"
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "q_plsf.h"
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "mode.h"
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "log2.h"
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "lsp_lsf.h"
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "reorder.h"
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; MACROS
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Define module specific macros here
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberextern Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow);
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; DEFINES
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Include all pre-processor statements here. Include conditional
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; compile variables also.
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Function Prototype declaration
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*----------------------------------------------------------------------------
147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; LOCAL VARIABLE DEFINITIONS
148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; Variable declaration - defined here and used outside this module
149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/
150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: dtx_enc_init
155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to an array of pointers to structures of type
160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         dtx_encState
161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pointer pointed to by st is set to the address of the allocated
164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      memory
165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 0, if initialization was successful; -1, otherwise (int)
168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function allocates the state memory used by the dtx_enc function.
179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint dtx_enc_init (dtx_encState **st)
194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  dtx_encState* s;
196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if (st == (dtx_encState **) NULL){
198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    fprintf(stderr, "dtx_enc_init: invalid parameter\n");
199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return -1;
200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  *st = NULL;
203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  // allocate memory
205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if ((s= (dtx_encState *) malloc(sizeof(dtx_encState))) == NULL){
206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");
207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return -1;
208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  dtx_enc_reset(s);
211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  *st = s;
212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  return 0;
214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 dtx_enc_init(dtx_encState **st)
240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_encState* s;
242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st == (dtx_encState **) NULL)
244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *st = NULL;
249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* allocate memory */
251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((s = (dtx_encState *) malloc(sizeof(dtx_encState))) == NULL)
252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    dtx_enc_reset(s);
257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *st = s;
258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(0);
260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: dtx_enc_reset
267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to structures of type dtx_encState
272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    structure pointed to by st is initialized to its reset value
275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 1, if reset was successful; -1, otherwise (int)
278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lsp_init_data = table containing LSP initialization values;
284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            table elements are constants of type Word16;
285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            table length is M
286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function initializes the fields of the state memory used by dtx_enc
291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber to their reset values.
292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint dtx_enc_reset (dtx_encState *st)
307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word16 i;
309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  if (st == (dtx_encState *) NULL){
311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    fprintf(stderr, "dtx_enc_reset: invalid parameter\n");
312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return -1;
313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->hist_ptr = 0;
316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->log_en_index = 0;
317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->init_lsf_vq_index = 0;
318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->lsp_index[0] = 0;
319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->lsp_index[1] = 0;
320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->lsp_index[2] = 0;
321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  // Init lsp_hist[]
323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  for(i = 0; i < DTX_HIST_SIZE; i++)
324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  {
325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Copy(lsp_init_data, &st->lsp_hist[i * M], M);
326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  // Reset energy history
329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Set_zero(st->log_en_hist, M);
330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->dtxHangoverCount = DTX_HANG_CONST;
332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  st->decAnaElapsedCount = 32767;
333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  return 1;
335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 dtx_enc_reset(dtx_encState *st)
361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 i;
363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st == (dtx_encState *) NULL)
365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return(-1);
367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->hist_ptr = 0;
370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->log_en_index = 0;
371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->init_lsf_vq_index = 0;
372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->lsp_index[0] = 0;
373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->lsp_index[1] = 0;
374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->lsp_index[2] = 0;
375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Init lsp_hist[] */
377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = 0; i < DTX_HIST_SIZE; i++)
378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        memcpy(&st->lsp_hist[i * M], lsp_init_data, M*sizeof(Word16));
380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Reset energy history */
383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memset(st->log_en_hist, 0, sizeof(Word16)*M);
384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->dtxHangoverCount = DTX_HANG_CONST;
385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->decAnaElapsedCount = 32767;
386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(1);
388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: dtx_enc_exit
395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to an array of pointers to structures of type
400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         dtx_encState
401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st points to the NULL address
404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function deallocates the state memory used by dtx_enc function.
418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid dtx_enc_exit (dtx_encState **st)
433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (st == NULL || *st == NULL)
435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      return;
436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // deallocate memory
438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   free(*st);
439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *st = NULL;
440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return;
442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid dtx_enc_exit(dtx_encState **st)
468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st == NULL || *st == NULL)
470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        return;
472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* deallocate memory */
475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    free(*st);
476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *st = NULL;
477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return;
479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: dtx_enc
486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to structures of type dtx_encState
491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    computeSidFlag = compute SID flag of type Word16
492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    qSt = pointer to structures of type Q_plsfState
493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    predState = pointer to structures of type gc_predState
494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    anap = pointer to an array of pointers to analysis parameters of
495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber           type Word16
496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    structure pointed to by st contains the newly calculated SID
499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      parameters
500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    structure pointed to by predState contains the new logarithmic frame
501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      energy
502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pointer pointed to by anap points to the location of the new
503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      logarithmic frame energy and new LSPs
504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 0 (int)
507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function calculates the SID parameters when in the DTX mode.
518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint dtx_enc(dtx_encState *st,        // i/o : State struct
533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Word16 computeSidFlag,   // i   : compute SID
534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            Q_plsfState *qSt,        // i/o : Qunatizer state struct
535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            gc_predState* predState, // i/o : State struct
536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word16 **anap            // o   : analysis parameters
537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        )
538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 i,j;
540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 log_en;
541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 lsf[M];
542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 lsp[M];
543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 lsp_q[M];
544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word32 L_lsp[M];
545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // VOX mode computation of SID parameters
547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if ((computeSidFlag != 0)  ||
548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        (st->log_en_index == 0))
549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // compute new SID frame if safe i.e don't
551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // compute immediately after a talk spurt
552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = 0;
553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      for (i = 0; i < M; i++)
554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         L_lsp[i] = 0;
556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // average energy and lsp
559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      for (i = 0; i < DTX_HIST_SIZE; i++)
560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         log_en = add(log_en,
562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      shr(st->log_en_hist[i],2));
563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         for (j = 0; j < M; j++)
565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         {
566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            L_lsp[j] = L_add(L_lsp[j],
567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                             L_deposit_l(st->lsp_hist[i * M + j]));
568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         }
569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = shr(log_en, 1);
572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      for (j = 0; j < M; j++)
573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         lsp[j] = extract_l(L_shr(L_lsp[j], 3));   // divide by 8
575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      //  quantize logarithmic energy to 6 bits
578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->log_en_index = add(log_en, 2560);          // +2.5 in Q10
579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->log_en_index = add(st->log_en_index, 128); // add 0.5/4 in Q10
580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->log_en_index = shr(st->log_en_index, 8);
581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (sub(st->log_en_index, 63) > 0)
583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->log_en_index = 63;
585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (st->log_en_index < 0)
587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->log_en_index = 0;
589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // update gain predictor memory
592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = shl(st->log_en_index, -2+10); // Q11 and divide by 4
593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = sub(log_en, 2560);            // add 2.5 in Q11
594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = sub(log_en, 9000);
596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (log_en > 0)
597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         log_en = 0;
599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (sub(log_en, -14436) < 0)
601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {
602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         log_en = -14436;
603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // past_qua_en for other modes than MR122
606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en[0] = log_en;
607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en[1] = log_en;
608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en[2] = log_en;
609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en[3] = log_en;
610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // scale down by factor 20*log10(2) in Q15
612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      log_en = mult(5443, log_en);
613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // past_qua_en for mode MR122
615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en_MR122[0] = log_en;
616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en_MR122[1] = log_en;
617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en_MR122[2] = log_en;
618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      predState->past_qua_en_MR122[3] = log_en;
619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // make sure that LSP's are ordered
621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Lsp_lsf(lsp, lsf, M);
622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Reorder_lsf(lsf, LSF_GAP, M);
623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Lsf_lsp(lsf, lsp, M);
624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      // Quantize lsp and put on parameter list
626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      Q_plsf_3(qSt, MRDTX, lsp, lsp_q, st->lsp_index,
627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               &st->init_lsf_vq_index);
628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *(*anap)++ = st->init_lsf_vq_index; // 3 bits
631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *(*anap)++ = st->lsp_index[0];      // 8 bits
633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *(*anap)++ = st->lsp_index[1];      // 9 bits
634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *(*anap)++ = st->lsp_index[2];      // 9 bits
635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   *(*anap)++ = st->log_en_index;      // 6 bits
638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                       // = 35 bits
639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return 0;
641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid dtx_enc(dtx_encState *st,        /* i/o : State struct                  */
667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             Word16 computeSidFlag,   /* i   : compute SID                   */
668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             Q_plsfState *qSt,        /* i/o : Qunatizer state struct        */
669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             gc_predState* predState, /* i/o : State struct                  */
670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             Word16 **anap,           /* o   : analysis parameters           */
671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber             Flag   *pOverflow        /* i/o : overflow indicator            */
672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            )
673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    register Word16 i, j;
675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 temp;
676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 log_en;
677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 lsf[M];
678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 lsp[M];
679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 lsp_q[M];
680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word32 L_lsp[M];
681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* VOX mode computation of SID parameters */
683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if ((computeSidFlag != 0)  ||
685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            (st->log_en_index == 0))
686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* compute new SID frame if safe i.e don't
688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         * compute immediately after a talk spurt  */
689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = 0;
690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = M - 1; i >= 0; i--)
691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            L_lsp[i] = 0;
693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* average energy and lsp */
696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (i = DTX_HIST_SIZE - 1; i >= 0; i--)
697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (st->log_en_hist[i] < 0)
699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                temp = ~((~(st->log_en_hist[i])) >> 2);
701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                temp = st->log_en_hist[i] >> 2;
705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            log_en = add(log_en, temp, pOverflow);
707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            for (j = M - 1; j >= 0; j--)
709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                L_lsp[j] = L_add(L_lsp[j],
711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 (Word32)(st->lsp_hist[i * M + j]),
712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                 pOverflow);
713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (log_en < 0)
717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            log_en = ~((~log_en) >> 1);
719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            log_en = log_en >> 1;
723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        for (j = M - 1; j >= 0; j--)
726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* divide by 8 */
728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (L_lsp[j] < 0)
729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                lsp[j] = (Word16)(~((~L_lsp[j]) >> 3));
731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            else
733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                lsp[j] = (Word16)(L_lsp[j] >> 3);
735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*  quantize logarithmic energy to 6 bits */
739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* +2.5 in Q10 */
740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->log_en_index = add(log_en, 2560, pOverflow);
741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* add 0.5/4 in Q10 */
742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->log_en_index = add(st->log_en_index, 128, pOverflow);
743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (st->log_en_index < 0)
744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->log_en_index = ~((~st->log_en_index) >> 8);
746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->log_en_index = st->log_en_index >> 8;
750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*---------------------------------------------*/
753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Limit to max and min allowable 6-bit values */
754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Note: For assembly implementation, use the  */
755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*       following:                            */
756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*       if(st->long_en_index >> 6 != 0)       */
757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*       {                                     */
758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           if(st->long_en_index < 0)         */
759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           {                                 */
760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*               st->long_en_index = 0         */
761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           }                                 */
762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           else                              */
763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           {                                 */
764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*               st->long_en_index = 63        */
765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*           }                                 */
766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*       }                                     */
767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /*---------------------------------------------*/
768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (st->log_en_index > 63)
769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->log_en_index = 63;
771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else if (st->log_en_index < 0)
773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->log_en_index = 0;
775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* update gain predictor memory */
778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Q11 and divide by 4 */
779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = (Word16)(((Word32) st->log_en_index) << (-2 + 10));
780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = sub(log_en, 11560, pOverflow);
782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (log_en > 0)
784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            log_en = 0;
786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else if (log_en < -14436)
788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            log_en = -14436;
790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* past_qua_en for other modes than MR122 */
793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en[0] = log_en;
794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en[1] = log_en;
795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en[2] = log_en;
796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en[3] = log_en;
797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* scale down by factor 20*log10(2) in Q15 */
799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = (Word16)(((Word32)(5443 * log_en)) >> 15);
800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* past_qua_en for mode MR122 */
802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en_MR122[0] = log_en;
803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en_MR122[1] = log_en;
804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en_MR122[2] = log_en;
805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        predState->past_qua_en_MR122[3] = log_en;
806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* make sure that LSP's are ordered */
808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Lsp_lsf(lsp, lsf, M, pOverflow);
809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Reorder_lsf(lsf, LSF_GAP, M, pOverflow);
810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Lsf_lsp(lsf, lsp, M, pOverflow);
811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        /* Quantize lsp and put on parameter list */
813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Q_plsf_3(qSt, MRDTX, lsp, lsp_q, st->lsp_index,
814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 &st->init_lsf_vq_index, pOverflow);
815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *(*anap)++ = st->init_lsf_vq_index; /* 3 bits */
818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *(*anap)++ = st->lsp_index[0];      /* 8 bits */
819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *(*anap)++ = st->lsp_index[1];      /* 9 bits */
820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *(*anap)++ = st->lsp_index[2];      /* 9 bits */
821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    *(*anap)++ = st->log_en_index;      /* 6 bits    */
822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* = 35 bits */
823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: dtx_buffer
832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to structures of type dtx_encState
837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    lsp_new = LSP vector whose elements are of type Word16; vector
838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          length is M
839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    speech = vector of speech samples of type Word16; vector length is
840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         BFR_SIZE_GSM
841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    structure pointed to by st contains the new LSPs and logarithmic
844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      frame energy
845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return_value = 0 (int)
848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function handles the DTX buffer.
859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberint dtx_buffer(dtx_encState *st,   // i/o : State struct
874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               Word16 lsp_new[],   // i   : LSP vector
875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               Word16 speech[]     // i   : speech samples
876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber)
877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 i;
879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word32 L_frame_en;
880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 log_en_e;
881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 log_en_m;
882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 log_en;
883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // update pointer to circular buffer
885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->hist_ptr = add(st->hist_ptr, 1);
886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (sub(st->hist_ptr, DTX_HIST_SIZE) == 0)
887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->hist_ptr = 0;
889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // copy lsp vector into buffer
892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Copy(lsp_new, &st->lsp_hist[st->hist_ptr * M], M);
893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // compute log energy based on frame energy
895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   L_frame_en = 0;     // Q0
896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   for (i=0; i < L_FRAME; i++)
897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
898b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      L_frame_en = L_mac(L_frame_en, speech[i], speech[i]);
899b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
900b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Log2(L_frame_en, &log_en_e, &log_en_m);
901b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
902b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // convert exponent and mantissa to Word16 Q10
903b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   log_en = shl(log_en_e, 10);  // Q10
904b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   log_en = add(log_en, shr(log_en_m, 15-10));
905b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
906b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193
907b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   log_en = sub(log_en, 8521);
908b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
909b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // insert into log energy buffer with division by 2
910b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   log_en = shr(log_en, 1);
911b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->log_en_hist[st->hist_ptr] = log_en; // Q10
912b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
913b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return 0;
914b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
915b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
916b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
917b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
918b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
919b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
920b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
921b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
922b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
923b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
924b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
925b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
926b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
927b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
928b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
929b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
930b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
931b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
932b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
933b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
934b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
935b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
936b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
937b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
938b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
939b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid dtx_buffer(dtx_encState *st,   /* i/o : State struct                    */
940b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Word16 lsp_new[],   /* i   : LSP vector                      */
941b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Word16 speech[],    /* i   : speech samples                  */
942b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                Flag   *pOverflow   /* i/o : overflow indicator              */
943b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               )
944b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
945b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
946b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    register Word16 i;
947b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word32 L_frame_en;
948b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word32 L_temp;
949b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 log_en_e;
950b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 log_en_m;
951b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 log_en;
952b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 *p_speech = &speech[0];
953b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
954b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* update pointer to circular buffer      */
955b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->hist_ptr += 1;
956b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
957b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (st->hist_ptr == DTX_HIST_SIZE)
958b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
959b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->hist_ptr = 0;
960b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
961b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
962b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* copy lsp vector into buffer */
963b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    memcpy(&st->lsp_hist[st->hist_ptr * M], lsp_new, M*sizeof(Word16));
964b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
965b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* compute log energy based on frame energy */
966b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    L_frame_en = 0;     /* Q0 */
967b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
968b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for (i = L_FRAME; i != 0; i--)
969b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
970b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        L_frame_en += (((Word32) * p_speech) * *(p_speech)) << 1;
971b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        p_speech++;
972b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (L_frame_en < 0)
973b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {
974b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            L_frame_en = MAX_32;
975b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            break;
976b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
977b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
978b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
979b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Log2(L_frame_en, &log_en_e, &log_en_m, pOverflow);
980b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
981b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* convert exponent and mantissa to Word16 Q10 */
982b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* Q10 */
983b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    L_temp = ((Word32) log_en_e) << 10;
984b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (L_temp != (Word32)((Word16) L_temp))
985b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
986b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        *pOverflow = 1;
987b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = (log_en_e > 0) ? MAX_16 : MIN_16;
988b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
989b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
990b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
991b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        log_en = (Word16) L_temp;
992b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
993b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
994b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    log_en += log_en_m >> (15 - 10);
995b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
996b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */
997b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    log_en -= 8521;
998b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
999b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* insert into log energy buffer with division by 2 */
1000b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1001b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->log_en_hist[st->hist_ptr] = log_en >> 1; /* Q10 */
1002b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1003b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1004b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1005b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/****************************************************************************/
1006b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1007b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
1008b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1009b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: tx_dtx_handler
1010b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1011b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
1012b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1013b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs:
1014b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st = pointer to structures of type dtx_encState
1015b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    vad_flag = VAD decision flag of type Word16
1016b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    usedMode = pointer to the currently used mode of type enum Mode
1017b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1018b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs:
1019b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    structure pointed to by st contains the newly calculated speech
1020b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      hangover
1021b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1022b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns:
1023b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    compute_new_sid_possible = flag to indicate a change in the
1024b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                   used mode; store type is Word16
1025b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1026b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used:
1027b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
1028b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1029b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed:
1030b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    None
1031b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1032b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1033b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION
1034b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1035b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function adds extra speech hangover to analyze speech on the decoding
1036b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber side.
1037b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1038b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1039b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS
1040b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1041b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None
1042b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1043b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1044b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES
1045b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1046b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dtx_enc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1047b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1048b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1049b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE
1050b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1051b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 tx_dtx_handler(dtx_encState *st,      // i/o : State struct
1052b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      Word16 vad_flag,       // i   : vad decision
1053b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      enum Mode *usedMode    // i/o : mode changed or not
1054b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      )
1055b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
1056b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   Word16 compute_new_sid_possible;
1057b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1058b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   // this state machine is in synch with the GSMEFR txDtx machine
1059b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
1060b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1061b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   compute_new_sid_possible = 0;
1062b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1063b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   if (vad_flag != 0)
1064b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {
1065b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      st->dtxHangoverCount = DTX_HANG_CONST;
1066b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
1067b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   else
1068b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   {  // non-speech
1069b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      if (st->dtxHangoverCount == 0)
1070b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      {  // out of decoder analysis hangover
1071b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->decAnaElapsedCount = 0;
1072b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         *usedMode = MRDTX;
1073b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         compute_new_sid_possible = 1;
1074b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1075b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      else
1076b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      { // in possible analysis hangover
1077b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
1078b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1079b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH
1080b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),
1081b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                 DTX_ELAPSED_FRAMES_THRESH) < 0)
1082b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         {
1083b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *usedMode = MRDTX;
1084b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            // if short time since decoder update, do not add extra HO
1085b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         }
1086b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         // else
1087b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         //   override VAD and stay in
1088b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         //   speech mode *usedMode
1089b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber         //   and add extra hangover
1090b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
1091b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   }
1092b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1093b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber   return compute_new_sid_possible;
1094b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1095b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1096b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1097b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional]
1098b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1099b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the
1100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below.
1101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes
1103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes
1105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                used to represent cycle count for each subroutine
1108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                called)
1109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                                     name]
1111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional]
1114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function]
1115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------
1117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/
1118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas HuberWord16 tx_dtx_handler(dtx_encState *st,      /* i/o : State struct           */
1120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      Word16 vad_flag,       /* i   : vad decision           */
1121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      enum Mode *usedMode,   /* i/o : mode changed or not    */
1122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                      Flag   *pOverflow      /* i/o : overflow indicator     */
1123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                     )
1124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
1125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 compute_new_sid_possible;
1126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    Word16 count;
1127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    /* this state machine is in synch with the GSMEFR txDtx machine */
1129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1, pOverflow);
1130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    compute_new_sid_possible = 0;
1132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    if (vad_flag != 0)
1134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {
1135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        st->dtxHangoverCount = DTX_HANG_CONST;
1136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    else
1138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    {  /* non-speech */
1139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (st->dtxHangoverCount == 0)
1140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        {  /* out of decoder analysis hangover  */
1141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->decAnaElapsedCount = 0;
1142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            *usedMode = MRDTX;
1143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            compute_new_sid_possible = 1;
1144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else
1146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        { /* in possible analysis hangover */
1147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            st->dtxHangoverCount -= 1;
1148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* decAnaElapsedCount + dtxHangoverCount < */
1150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            /* DTX_ELAPSED_FRAMES_THRESH               */
1151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            count = add(st->decAnaElapsedCount, st->dtxHangoverCount,
1152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                        pOverflow);
1153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            if (count < DTX_ELAPSED_FRAMES_THRESH)
1154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            {
1155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                *usedMode = MRDTX;
1156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* if short time since decoder update, */
1157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                /* do not add extra HO                 */
1158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            }
1159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
1160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
1161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
1162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    return(compute_new_sid_possible);
1163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
1164