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