1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.073
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/vad1.c
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Functions:
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated template used to PV coding template.
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Changed to accept the pOverflow flag for EPOC compatibility.
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Made changes per review comments
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (1) Removed include of "count.h"
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (2) Replaced "basic_op.h" with individual include files
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (3) Removed some unnecessary instances of sub().
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               files that now are chosen by OSCL definitions
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Changed round function name to pv_round to avoid conflict with
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              round function in C standard library.
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Who:                           Date:
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <stdlib.h>
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <string.h>
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "vad.h"
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h"
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "shr.h"
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "basic_op.h"
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst_vad.h"
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also.
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: first_filter_stage
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- filter memory
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in   -- array of type Word16 -- input signal
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- filter memory
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    out  -- array of type Word16 -- output values, every other
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    output is low-pass part and
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    other is high-pass part every
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Scale input down by one bit. Calculate 5th order
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                half-band lowpass/highpass filter pair with
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                decimation.
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void first_filter_stage(
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 in[],      /* i   : input signal                  */
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 out[],     /* o   : output values, every other    */
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       output is low-pass part and   */
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       other is high-pass part every */
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 data[],    /* i/o : filter memory                 */
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp0;
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp1;
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp2;
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp3;
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 data0;
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 data1;
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data0 = data[0];
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data1 = data[1];
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < FRAME_LEN / 4; i++)
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp0 = mult(COEFF5_1, data0, pOverflow);
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = shr(in[4*i+0], 2, pOverflow);
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp0 = sub(temp1, temp0, pOverflow);
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = mult(COEFF5_1, temp0, pOverflow);
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = add(data0, temp1, pOverflow);
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp3 = mult(COEFF5_2, data1, pOverflow);
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = shr(in[4*i+1], 2, pOverflow);
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp3 = sub(temp2, temp3, pOverflow);
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = mult(COEFF5_2, temp3, pOverflow);
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = add(data1, temp2, pOverflow);
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        out[4*i+0] = add(temp1, temp2, pOverflow);
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        out[4*i+1] = sub(temp1, temp2, pOverflow);
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = mult(COEFF5_1, temp0, pOverflow);
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = shr(in[4*i+2], 2, pOverflow);
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        data0 = sub(temp2, temp1, pOverflow);
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = mult(COEFF5_1, data0, pOverflow);
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp1 = add(temp0, temp1, pOverflow);
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        data1 = mult(COEFF5_2, temp3, pOverflow);
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = shr(in[4*i+3], 2, pOverflow);
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        data1 = sub(temp2, data1, pOverflow);
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = mult(COEFF5_2, data1, pOverflow);
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp2 = add(temp3, temp2, pOverflow);
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        out[4*i+2] = add(temp1, temp2, pOverflow);
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        out[4*i+3] = sub(temp1, temp2, pOverflow);
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data[0] = data0;
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data[1] = data1;
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: filter5
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- updated filter memory
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- updated filter memory
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Fifth-order half-band lowpass/highpass filter pair with
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                decimation.
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void filter5(Word16 *in0,    /* i/o : input values; output low-pass part  */
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    Word16 *in1,    /* i/o : input values; output high-pass part */
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    Word16 data[],  /* i/o : updated filter memory               */
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    Flag  *pOverflow  /* o : Flag set when overflow occurs       */
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   )
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp0;
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp1;
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp2;
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = mult(COEFF5_1, data[0], pOverflow);
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = sub(*in0, temp0, pOverflow);
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = mult(COEFF5_1, temp0, pOverflow);
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = add(data[0], temp1, pOverflow);
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data[0] = temp0;
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = mult(COEFF5_2, data[1], pOverflow);
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = sub(*in1, temp0, pOverflow);
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp2 = mult(COEFF5_2, temp0, pOverflow);
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp2 = add(data[1], temp2, pOverflow);
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data[1] = temp0;
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = add(temp1, temp2, pOverflow);
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *in0 = shr(temp0, 1, pOverflow);
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp0 = sub(temp1, temp2, pOverflow);
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *in1 = shr(temp0, 1, pOverflow);
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: filter3
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- updated filter memory
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in0 -- array of type Word16 -- input values; output low-pass part
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in1 -- array of type Word16 -- input values; output high-pass part
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- updated filter memory
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Third-order half-band lowpass/highpass filter pair with
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                decimation.
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void filter3(
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *in0,      /* i/o : input values; output low-pass part  */
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *in1,      /* i/o : input values; output high-pass part */
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *data,     /* i/o : updated filter memory               */
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs         */
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp1;
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp2;
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = mult(COEFF3, *data, pOverflow);
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = sub(*in1, temp1, pOverflow);
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp2 = mult(COEFF3, temp1, pOverflow);
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp2 = add(*data, temp2, pOverflow);
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *data = temp1;
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = sub(*in0, temp2, pOverflow);
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *in1 = shr(temp1, 1, pOverflow);
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = add(*in0, temp2, pOverflow);
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *in0 = shr(temp1, 1, pOverflow);
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: level_calculation
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    data -- array of type Word16 -- signal buffer
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    sub_level -- pointer to type Word16 -- level calculated at the end of
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                           the previous frame
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    count1 -- Word16 -- number of samples to be counted
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    count2 -- Word16 -- number of samples to be counted
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ind_m  -- Word16 -- step size for the index of the data buffer
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ind_a  -- Word16 -- starting index of the data buffer
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    scale  -- Word16 -- scaling for the level calculation
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    sub_level -- pointer to tyep Word16 -- level of signal calculated from the
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                           last (count2 - count1) samples.
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    signal level
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Calculate signal level in a sub-band. Level is calculated
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                by summing absolute values of the input data.
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 level_calculation(
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 data[],     /* i   : signal buffer                                */
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *sub_level, /* i   : level calculate at the end of                */
508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       the previous frame                           */
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* o   : level of signal calculated from the last     */
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       (count2 - count1) samples                    */
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 count1,     /* i   : number of samples to be counted              */
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 count2,     /* i   : number of samples to be counted              */
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ind_m,      /* i   : step size for the index of the data buffer   */
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 ind_a,      /* i   : starting index of the data buffer            */
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 scale,      /* i   : scaling for the level calculation            */
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow   /* o : Flag set when overflow occurs                  */
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 l_temp1;
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 l_temp2;
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level;
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    l_temp1 = 0L;
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = count1; i < count2; i++)
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        l_temp1 = L_mac(l_temp1, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    l_temp2 = L_add(l_temp1, L_shl(*sub_level, sub(16, scale, pOverflow), pOverflow), pOverflow);
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *sub_level = extract_h(L_shl(l_temp1, scale, pOverflow));
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < count1; i++)
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        l_temp2 = L_mac(l_temp2, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level = extract_h(L_shl(l_temp2, scale, pOverflow));
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return level;
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: filter_bank
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in -- array of type Word16 -- input frame
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level -- array of type Word16 -- signal levels at each band
558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Divides input signal into 9-bands and calculas level of
574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                the signal in each band
575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void filter_bank(
614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : State struct                    */
615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 in[],      /* i   : input frame                     */
616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level[],   /* 0   : signal levels at each band      */
617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o   : Flag set when overflow occurs   */
618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 tmp_buf[FRAME_LEN];
622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* calculate the filter bank */
624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    first_filter_stage(in, tmp_buf, st->a_data5[0], pOverflow);
626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < FRAME_LEN / 4; i++)
628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1], pOverflow);
630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2], pOverflow);
631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < FRAME_LEN / 8; i++)
633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0], pOverflow);
635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1], pOverflow);
636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4], pOverflow);
637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < FRAME_LEN / 16; i++)
640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2], pOverflow);
642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3], pOverflow);
643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* calculate levels in each frequency band */
646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 3000 - 4000 Hz*/
648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN / 4 - 8,
649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 4, 4, 1, 15, pOverflow);
650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 2500 - 3000 Hz*/
651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN / 8 - 4,
652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 8, 8, 7, 16, pOverflow);
653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 2000 - 2500 Hz*/
654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN / 8 - 4,
655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 8, 8, 3, 16, pOverflow);
656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 1500 - 2000 Hz*/
657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN / 8 - 4,
658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 8, 8, 2, 16, pOverflow);
659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 1000 - 1500 Hz*/
660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN / 8 - 4,
661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 8, 8, 6, 16, pOverflow);
662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 750 - 1000 Hz*/
663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN / 16 - 2,
664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 16, 16, 4, 16, pOverflow);
665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 500 - 750 Hz*/
666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN / 16 - 2,
667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 16, 16, 12, 16, pOverflow);
668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 250 - 500 Hz*/
669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN / 16 - 2,
670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 16, 16, 8, 16, pOverflow);
671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* 0 - 250 Hz*/
672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN / 16 - 2,
673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 FRAME_LEN / 16, 16, 0, 16, pOverflow);
674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: update_cntrl
681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose    : Control update of the background noise estimate.
705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs     : pitch:      flags for pitch detection
706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              stat_count: stationary counter
707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              tone:       flags indicating presence of a tone
708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              complex:      flags for complex  detection
709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              vadreg:     intermediate VAD flags
710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Output     : stat_count: stationary counter
711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void update_cntrl(
751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,   /* i/o : State struct                       */
752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level[],  /* i   : sub-band levels of the input frame */
753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow /* o   : Flag set when overflow occurs      */
754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 stat_rat;
759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 exp;
760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 num;
761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 denom;
762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 alpha;
763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* handle highband complex signal input  separately       */
765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* if ther has been highband correlation for some time    */
766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* make sure that the VAD update speed is low for a while */
767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->complex_warning != 0)
768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->stat_count < CAD_MIN_STAT_COUNT)
770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->stat_count = CAD_MIN_STAT_COUNT;
772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* NB stat_count is allowed to be decreased by one below again  */
775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* deadlock in speech is not possible unless the signal is very */
776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* complex and need a high rate                                 */
777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* if fullband pitch or tone have been detected for a while, initialize stat_count */
779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (((Word16)(st->pitch & 0x6000) == 0x6000) ||
780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ((Word16)(st->tone & 0x7c00) == 0x7c00))
781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->stat_count = STAT_COUNT;
783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* if 8 last vad-decisions have been "0", reinitialize stat_count */
787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((st->vadreg & 0x7f80) == 0)
788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->stat_count = STAT_COUNT;
790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            stat_rat = 0;
794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < COMPLEN; i++)
795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (level[i] > st->ave_level[i])
797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    num = level[i];
799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    denom = st->ave_level[i];
800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    num = st->ave_level[i];
804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    denom = level[i];
805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (num < STAT_THR_LEVEL)
808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    num = STAT_THR_LEVEL;
810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (denom < STAT_THR_LEVEL)
812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    denom = STAT_THR_LEVEL;
814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                exp = norm_s(denom);
817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                denom = shl(denom, exp, pOverflow);
819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* stat_rat = num/denom * 64 */
821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                temp = shr(num, 1, pOverflow);
822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                temp = div_s(temp, denom);
823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                stat_rat = add(stat_rat, shr(temp, sub(8, exp, pOverflow), pOverflow), pOverflow);
825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* compare stat_rat with a threshold and update stat_count */
828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (stat_rat > STAT_THR)
829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->stat_count = STAT_COUNT;
831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if ((st->vadreg & 0x4000) != 0)
835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    if (st->stat_count != 0)
837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    {
838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        st->stat_count = sub(st->stat_count, 1, pOverflow);
839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    }
840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Update average amplitude estimate for stationarity estimation */
846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    alpha = ALPHA4;
847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->stat_count == STAT_COUNT)
848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        alpha = 32767;
850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if ((st->vadreg & 0x4000) == 0)
852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        alpha = ALPHA5;
854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub(level[i], st->ave_level[i], pOverflow);
859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = mult_r(alpha, temp, pOverflow);
860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->ave_level[i] =
862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            add(
863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->ave_level[i],
864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                temp,
865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: hangover_addition
874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    noise_level -- Word16 -- average level of the noise estimates
879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    low_power   -- Word16 -- flag power of the input frame
880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicato
884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    VAD_flag indicating final VAD decision (Word16)
887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function     : hangover_addition
898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Add hangover for complex signal or after speech bursts
899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs       : burst_count:  counter for the length of speech bursts
900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                hang_count:   hangover counter
901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                vadreg:       intermediate VAD decision
902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs      : burst_count:  counter for the length of speech bursts
903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                hang_count:   hangover counter
904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return value : VAD_flag indicating final VAD decision
905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 hangover_addition(
945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,      /* i/o : State struct                     */
946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 noise_level, /* i   : average level of the noise       */
947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       estimates                        */
948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 low_power,   /* i   : flag power of the input frame    */
949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow    /* o   : Flag set when overflow occurs    */
950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 hang_len;
953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 burst_len;
954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Calculate burst_len and hang_len
957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       burst_len: number of consecutive intermediate vad flags with "1"-decision
958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  required for hangover addition
959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       hang_len:  length of the hangover
960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       */
961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (noise_level > HANG_NOISE_THR)
963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        burst_len = BURST_LEN_HIGH_NOISE;
965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        hang_len = HANG_LEN_HIGH_NOISE;
966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        burst_len = BURST_LEN_LOW_NOISE;
970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        hang_len = HANG_LEN_LOW_NOISE;
971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* if the input power (pow_sum) is lower than a threshold, clear
974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       counters and set VAD_flag to "0"  "fast exit"                 */
975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (low_power != 0)
976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->burst_count = 0;
978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->hang_count = 0;
979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_hang_count = 0;
980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_hang_timer = 0;
981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return 0;
982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->complex_hang_timer > CVAD_HANG_LIMIT)
985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->complex_hang_count < CVAD_HANG_LENGTH)
987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->complex_hang_count = CVAD_HANG_LENGTH;
989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* long time very complex signal override VAD output function */
993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->complex_hang_count != 0)
994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->burst_count = BURST_LEN_HIGH_NOISE;
996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_hang_count = sub(st->complex_hang_count, 1, pOverflow);
997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return 1;
998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* let hp_corr work in from a noise_period indicated by the VAD */
1002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (((st->vadreg & 0x3ff0) == 0) &&
1003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (st->corr_hp_fast > CVAD_THRESH_IN_NOISE))
1004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            return 1;
1006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* update the counters (hang_count, burst_count) */
1010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((st->vadreg & 0x4000) != 0)
1011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->burst_count = add(st->burst_count, 1, pOverflow);
1013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->burst_count >= burst_len)
1015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->hang_count = hang_len;
1017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return 1;
1019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->burst_count = 0;
1023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->hang_count > 0)
1024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->hang_count = sub(st->hang_count, 1, pOverflow);
1026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            return 1;
1027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return 0;
1030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: noise_estimate_update
1037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
1043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose    : Update of background noise estimate
1061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs     : bckr_est:   background noise estimate
1062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              pitch:      flags for pitch detection
1063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              stat_count: stationary counter
1064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs    : bckr_est:   background noise estimate
1065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void noise_estimate_update(
1104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
1105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level[],   /* i   : sub-band levels of the input frame */
1106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
1107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
1110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 alpha_up;
1111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 alpha_down;
1112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 bckr_add;
1113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Control update of bckr_est[] */
1115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    update_cntrl(st, level, pOverflow);
1116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Choose update speed */
1118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    bckr_add = 2;
1119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (((0x7800 & st->vadreg) == 0) &&
1121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ((st->pitch & 0x7800) == 0)
1122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            && (st->complex_hang_count == 0))
1123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        alpha_up = ALPHA_UP1;
1125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        alpha_down = ALPHA_DOWN1;
1126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((st->stat_count == 0)
1130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                && (st->complex_hang_count == 0))
1131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha_up = ALPHA_UP2;
1133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha_down = ALPHA_DOWN2;
1134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha_up = 0;
1138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha_down = ALPHA3;
1139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            bckr_add = 0;
1140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Update noise estimate (bckr_est) */
1144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
1145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Word16 temp;
1147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub(st->old_level[i], st->bckr_est[i], pOverflow);
1149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (temp < 0)
1151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        { /* update downwards*/
1152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = mult_r(alpha_down, temp, pOverflow);
1153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = add(st->bckr_est[i], temp, pOverflow);
1154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->bckr_est[i] = add(-2, temp, pOverflow);
1156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* limit minimum value of the noise estimate to NOISE_MIN */
1158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (st->bckr_est[i] < NOISE_MIN)
1159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->bckr_est[i] = NOISE_MIN;
1161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        { /* update upwards */
1165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = mult_r(alpha_up, temp, pOverflow);
1166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = add(st->bckr_est[i], temp, pOverflow);
1167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->bckr_est[i] = add(bckr_add, temp, pOverflow);
1168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* limit maximum value of the noise estimate to NOISE_MAX */
1170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (st->bckr_est[i] > NOISE_MAX)
1171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->bckr_est[i] = NOISE_MAX;
1173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Update signal levels of the previous frame (old_level) */
1178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
1179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->old_level[i] = level[i];
1181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: complex_estimate_adapt
1188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    low_power -- Word16 -- very low level flag of the input frame
1194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function   : complex_estimate_adapt
1212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose    : Update/adapt of complex signal estimate
1213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs     : low_power:   low signal power flag
1214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs    : st->corr_hp_fast:   long term complex signal estimate
1215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void complex_estimate_adapt(
1254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,      /* i/o : VAD state struct                       */
1255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 low_power,   /* i   : very low level flag of the input frame */
1256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow    /* o : Flag set when overflow occurs            */
1257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 alpha;            /* Q15 */
1260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_tmp;            /* Q31 */
1261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* adapt speed on own state */
1264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->best_corr_hp < st->corr_hp_fast) /* decrease */
1265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
1267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  /* low state  */
1268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha = CVAD_ADAPT_FAST;
1269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  /* high state */
1272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha = CVAD_ADAPT_REALLY_FAST;
1273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else  /* increase */
1276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
1278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha = CVAD_ADAPT_FAST;
1280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            alpha = CVAD_ADAPT_SLOW;
1284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_tmp = L_deposit_h(st->corr_hp_fast);
1288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_tmp = L_msu(L_tmp, alpha, st->corr_hp_fast, pOverflow);
1289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_tmp = L_mac(L_tmp, alpha, st->best_corr_hp, pOverflow);
1290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->corr_hp_fast = pv_round(L_tmp, pOverflow);           /* Q15 */
1291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->corr_hp_fast < CVAD_MIN_CORR)
1293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->corr_hp_fast = CVAD_MIN_CORR;
1295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (low_power != 0)
1298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->corr_hp_fast = CVAD_MIN_CORR;
1300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: complex_vad
1307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    low_power -- Word16 -- flag power of the input frame
1313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    the complex background decision
1321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : complex background decision
1332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return value : the complex background decision
1333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 complex_vad(
1372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : VAD state struct              */
1373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 low_power, /* i   : flag power of the input frame */
1374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
1375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->complex_high = shr(st->complex_high, 1, pOverflow);
1378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->complex_low = shr(st->complex_low, 1, pOverflow);
1379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (low_power == 0)
1381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_HIGH)
1383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->complex_high |= 0x4000;
1385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_LOW)
1388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->complex_low |= 0x4000;
1390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->corr_hp_fast > CVAD_THRESH_HANG)
1394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_hang_timer = add(st->complex_hang_timer, 1, pOverflow);
1396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_hang_timer =  0;
1400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return ((Word16)(st->complex_high & 0x7f80) == 0x7f80 ||
1403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            (Word16)(st->complex_low & 0x7fff) == 0x7fff);
1404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad_decision
1410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    level -- array of type Word16 -- sub-band levels of the input frame
1416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pow_sum -- Word32 -- power of the input frame
1417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    VAD_flag (Word16)
1424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Calculates VAD_flag
1435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs       : bckr_est:    background noise estimate
1436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                vadreg:      intermediate VAD flags
1437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs      : noise_level: average level of the noise estimates
1438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                vadreg:      intermediate VAD flags
1439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return value : VAD_flag
1440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 vad_decision(
1479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,         /* i/o : State struct                       */
1480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level[COMPLEN], /* i   : sub-band levels of the input frame */
1481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 pow_sum,        /* i   : power of the input frame           */
1482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow       /* o : Flag set when overflow occurs        */
1483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
1486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 snr_sum;
1487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_temp;
1488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 vad_thr;
1489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
1490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 noise_level;
1491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 low_power_flag;
1492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp1;
1493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
1495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Calculate squared sum of the input levels (level)
1496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       divided by the background noise components (bckr_est).
1497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       */
1498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_temp = 0;
1499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
1501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Word16 exp;
1503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        exp = norm_s(st->bckr_est[i]);
1505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = shl(st->bckr_est[i], exp, pOverflow);
1506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = div_s(shr(level[i], 1, pOverflow), temp);
1507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = shl(temp, sub(exp, UNIRSHFT - 1, pOverflow), pOverflow);
1508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_mac(L_temp, temp, temp, pOverflow);
1509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    snr_sum = extract_h(L_shl(L_temp, 6, pOverflow));
1512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    snr_sum = mult(snr_sum, INV_COMPLEN, pOverflow);
1513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Calculate average level of estimated background noise */
1515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_temp = 0;
1516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
1517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_add(L_temp, st->bckr_est[i], pOverflow);
1519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    noise_level = extract_h(L_shl(L_temp, 13, pOverflow));
1522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Calculate VAD threshold */
1524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = sub(noise_level, VAD_P1, pOverflow);
1525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp1 = mult(VAD_SLOPE, temp1, pOverflow);
1526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vad_thr = add(temp1, VAD_THR_HIGH, pOverflow);
1527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (vad_thr < VAD_THR_LOW)
1529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        vad_thr = VAD_THR_LOW;
1531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Shift VAD decision register */
1534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->vadreg = shr(st->vadreg, 1, pOverflow);
1535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Make intermediate VAD decision */
1537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (snr_sum > vad_thr)
1538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->vadreg |= 0x4000;
1540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* primary vad decsion made */
1542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* check if the input power (pow_sum) is lower than a threshold" */
1544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (L_sub(pow_sum, VAD_POW_LOW, pOverflow) < 0)
1545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        low_power_flag = 1;
1547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        low_power_flag = 0;
1551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* update complex signal estimate st->corr_hp_fast and hangover reset timer using */
1554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* low_power_flag and corr_hp_fast  and various adaptation speeds                 */
1555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    complex_estimate_adapt(st, low_power_flag, pOverflow);
1556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* check multiple thresholds of the st->corr_hp_fast value */
1558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->complex_warning = complex_vad(st, low_power_flag, pOverflow);
1559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Update speech subband vad background noise estimates */
1561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    noise_estimate_update(st, level, pOverflow);
1562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*  Add speech and complex hangover and return speech VAD_flag */
1564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*  long term complex hangover may be added */
1565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->speech_vad_decision = hangover_addition(st, noise_level, low_power_flag, pOverflow);
1566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (st->speech_vad_decision);
1568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad1_init
1574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- double pointer to type vadState1 -- pointer to memory to
1579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                                 be initialized.
1580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- points to initalized area in memory.
1583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Allocates state memory and initializes state memory
1597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1635a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 vad1_init(vadState1 **state)
1636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1* s;
1638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (state == (vadState1 **) NULL)
1640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return -1;
1642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *state = NULL;
1644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* allocate memory */
1646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((s = (vadState1 *) malloc(sizeof(vadState1))) == NULL)
1647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return -1;
1649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vad1_reset(s);
1652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *state = s;
1654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return 0;
1656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad1_reset
1661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- pointer to type vadState1 --  State struct
1666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- pointer to type vadState1 --  State struct
1669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose:    Resets state memory to zero
1683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1721a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 vad1_reset(vadState1 *state)
1722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
1724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 j;
1725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (state == (vadState1 *) NULL)
1727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return -1;
1729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize pitch detection variables */
1732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->oldlag_count = 0;
1733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->oldlag = 0;
1734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->pitch = 0;
1735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->tone = 0;
1736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->complex_high = 0;
1738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->complex_low = 0;
1739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->complex_hang_timer = 0;
1740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->vadreg = 0;
1742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->stat_count = 0;
1744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->burst_count = 0;
1745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->hang_count = 0;
1746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->complex_hang_count = 0;
1747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* initialize memory used by the filter bank */
1749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < 3; i++)
1750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 0; j < 2; j++)
1752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            state->a_data5[i][j] = 0;
1754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < 5; i++)
1758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->a_data3[i] = 0;
1760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* initialize the rest of the memory */
1763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < COMPLEN; i++)
1764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->bckr_est[i] = NOISE_INIT;
1766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->old_level[i] = NOISE_INIT;
1767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->ave_level[i] = NOISE_INIT;
1768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->sub_level[i] = 0;
1769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->best_corr_hp = CVAD_LOWPOW_RESET;
1772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->speech_vad_decision = 0;
1774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->complex_warning = 0;
1775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->sp_burst_count = 0;
1776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->corr_hp_fast = CVAD_LOWPOW_RESET;
1778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return 0;
1780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad1_exit
1786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- pointer to type vadState1 --  State struct
1791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    The memory used for state memory is freed
1808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1846a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid vad1_exit(vadState1 **state)
1847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (state == NULL || *state == NULL)
1849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return;
1850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* deallocate memory */
1852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    free(*state);
1853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *state = NULL;
1854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
1856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad_complex_detection_update
1862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    best_corr_hp -- Word16 -- best Corr
1867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- pointer to type vadState1 --  State struct
1868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state -- pointer to type vadState1 --  State struct
1871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : update vad->bestCorr_hp  complex signal feature state
1885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1922a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid vad_complex_detection_update(
1923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,       /* i/o : State struct */
1924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 best_corr_hp) /* i   : best Corr    */
1925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->best_corr_hp = best_corr_hp;
1927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
1932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad_tone_detection
1934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
1936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
1938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    t0 -- Word32 -- autocorrelation maxima
1940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    t1 -- Word32 -- energy
1941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
1943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
1944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
1945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
1947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
1950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
1953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
1954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
1957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Set tone flag if pitch gain is high. This is used to detect
1959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                signaling tones and other signals with high pitch gain.
1960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs       : tone: flags indicating presence of a tone
1961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs      : tone: flags indicating presence of a tone
1962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
1964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
1966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
1969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
1974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1999a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid vad_tone_detection(
2000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
2001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t0,        /* i   : autocorrelation maxima             */
2002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 t1,        /* i   : energy                             */
2003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
2004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
2005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
2006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
2007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
2008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       if (t0 > TONE_THR * t1)
2009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       set tone flag
2010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       */
2011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp = pv_round(t1, pOverflow);
2012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((temp > 0) && (L_msu(t0, temp, TONE_THR, pOverflow) > 0))
2014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->tone |= 0x4000;
2016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
2018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
2021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad_tone_detection_update
2023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
2025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
2027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    one_lag_per_frame -- Word16 -- 1 if one open-loop lag is calculated per
2028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                   each frame, otherwise 0
2029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
2032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
2034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
2036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
2039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
2042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
2046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Update the tone flag register. Tone flags are shifted right
2048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                by one bit. This function should be called from the speech
2049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                encoder before call to Vad_tone_detection() function.
2050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
2053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
2055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
2058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
2060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
2063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
2067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
2069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
2070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
2072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
2074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
2077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
2078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
2080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
2083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
2084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
2087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2088a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid vad_tone_detection_update(
2089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,              /* i/o : State struct           */
2090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 one_lag_per_frame,   /* i   : 1 if one open-loop lag */
2091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       is calculated per each */
2092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*       frame, otherwise 0     */
2093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag *pOverflow             /* o   : Flags overflow         */
2094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
2095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
2096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Shift tone flags right by one bit */
2097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->tone = shr(st->tone, 1, pOverflow);
2098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* If open-loop lag is calculated only once in each frame, do extra update
2100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       and assume that the other tone flag of the frame is one. */
2101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (one_lag_per_frame != 0)
2102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->tone = shr(st->tone, 1, pOverflow);
2104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->tone |= 0x2000;
2105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
2107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
2110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad_pitch_detection
2112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
2114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
2116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    T_op -- array of type Word16 -- speech encoder open loop lags
2117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
2120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
2122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
2124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
2127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
2130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
2134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Test whether signal contains pitch or other periodic
2136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                component.
2137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return value : Boolean voiced / unvoiced decision in state variable
2138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
2141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
2143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
2146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
2148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
2151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
2155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
2157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
2158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
2160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
2162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
2165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
2166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
2168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
2171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
2172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
2175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2176a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid vad_pitch_detection(
2177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : State struct                  */
2178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 T_op[],    /* i   : speech encoder open loop lags */
2179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
2180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
2181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
2182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lagcount;
2183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
2184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
2185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lagcount = 0;
2187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < 2; i++)
2189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub(st->oldlag, T_op[i], pOverflow);
2191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = abs_s(temp);
2192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (temp < LTHRESH)
2194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lagcount = add(lagcount, 1, pOverflow);
2196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* Save the current LTP lag */
2199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->oldlag = T_op[i];
2200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Make pitch decision.
2203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Save flag of the pitch detection to the variable pitch.
2204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       */
2205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->pitch = shr(st->pitch, 1, pOverflow);
2206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    temp =
2208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        add(
2209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->oldlag_count,
2210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lagcount,
2211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
2212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (temp >= NTHRESH)
2214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->pitch |= 0x4000;
2216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Update oldlagcount */
2219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->oldlag_count = lagcount;
2220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
2221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
2223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: vad1
2225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
2227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
2229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    in_buf -- array of type Word16 -- samples of the input frame
2231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
2233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st -- pointer to type vadState1 --  State struct
2234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to type Flag -- overflow indicator
2235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
2237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    VAD Decision, 1 = speech, 0 = noise
2238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
2240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
2243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
2244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
2247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose      : Main program for Voice Activity Detection (VAD) for AMR
2249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return value : VAD Decision, 1 = speech, 0 = noise
2250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
2253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
2255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
2258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
2260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
2263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
2267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
2269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
2270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
2272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
2274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
2277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
2278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
2280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
2283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
2284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
2286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
2287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2288a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 vad1(
2289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    vadState1 *st,    /* i/o : State struct                       */
2290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 in_buf[],  /* i   : samples of the input frame         */
2291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow  /* o   : Flag set when overflow occurs      */
2292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
2293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
2294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 level[COMPLEN];
2295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 pow_sum;
2296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
2297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Calculate power of the input frame. */
2299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pow_sum = 0L;
2300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < FRAME_LEN; i++)
2302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pow_sum = L_mac(pow_sum, in_buf[i-LOOKAHEAD], in_buf[i-LOOKAHEAD], pOverflow);
2304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
2307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      If input power is very low, clear pitch flag of the current frame
2308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
2309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (L_sub(pow_sum, POW_PITCH_THR, pOverflow) < 0)
2310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->pitch = st->pitch & 0x3fff;
2312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
2315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      If input power is very low, clear complex flag of the "current" frame
2316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
2317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (L_sub(pow_sum, POW_COMPLEX_THR, pOverflow) < 0)
2318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
2319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->complex_low = st->complex_low & 0x3fff;
2320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*
2323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Run the filter bank which calculates signal levels at each band
2324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      */
2325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    filter_bank(st, in_buf, level, pOverflow);
2326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (vad_decision(st, level, pow_sum, pOverflow));
2328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
2329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2331