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