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/c2_9pf.c 35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Funtions: code_2i40_9bits 36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber search_2i40 37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Test_search_2i40 38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber build_code 39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Test_build_code 40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Date: 05/26/2000 42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REVISION HISTORY 45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Changed template used to PV coding template. First attempt at 47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber optimizing C code. 48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Updated file per comments gathered from Phase 2/3 review. 50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added setting of Overflow flag in inlined code. 52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding 54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber template. 55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replaced basic_op.h with the header files of the math functions 57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used by the file. 58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Made the following changes per comments from Phase 2/3 review: 60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1. Defined one local variable per line. 61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Passed in pOverflow flag for EPOC compatibility. 63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Optimized search_2i40() to reduce clock cycle usage. 65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Removed unnecessary include files and #defines. 67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Changed function name to pv_round to avoid conflict with 69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber round function in C standard library. 70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Replaced "int" and/or "char" with OSCL defined types. 72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: Added #ifdef __cplusplus around extern'ed table. 74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Description: 76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODULE DESCRIPTION 79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This file contains the functions that search a 9 bit algebraic codebook 81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber containing 2 pulses in a frame of 40 samples. 82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber------------------------------------------------------------------------------ 84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*/ 85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*---------------------------------------------------------------------------- 87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber; INCLUDES 88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber----------------------------------------------------------------------------*/ 89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "c2_9pf.h" 90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h" 91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h" 92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "inv_sqrt.h" 93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cnst.h" 94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cor_h.h" 95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "cor_h_x.h" 96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "set_sign.h" 97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*--------------------------------------------------------------------------*/ 99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus 100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberextern "C" 101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{ 102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; MACROS 106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; Define module specific macros here 107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; DEFINES 111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; Include all pre-processor statements here. Include conditional 112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; compile variables also. 113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#define NB_PULSE 2 115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; LOCAL FUNCTION DEFINITIONS 118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; Function Prototype declaration 119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static void search_2i40( 121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[], /* i : correlation between target and h[] */ 123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[][L_CODE],/* i : matrix of autocorrelation */ 124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* o : algebraic codebook vector */ 125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ); 127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static Word16 build_code( 129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* i : algebraic codebook vector */ 131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn_sign[], /* i : sign of dn[] */ 132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 cod[], /* o : algebraic (fixed) codebook excitation */ 133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], /* i : impulse response of weighted synthesis filter */ 134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], /* o : filtered fixed codebook excitation */ 135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sign[], /* o : sign of 2 pulses */ 136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ); 138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; LOCAL VARIABLE DEFINITIONS 141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; Variable declaration - defined here and used outside this module 142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word16 trackTable[4*5] = 145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, 0, 1, -1, /* subframe 1; track to code; 147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * -1 do not code this position 148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, -1, 1, 0, 1, /* subframe 2 */ 150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, 0, -1, 1, /* subframe 3 */ 151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, -1, 0, 1 152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber };/* subframe 4 */ 153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ; Declare variables used in this module but defined elsewhere 158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber extern const Word16 startPos[]; 160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* 162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: code_2i40_9bits 164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr = subframe number (Word16) 169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber x = target buffer (Word16) 170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h = buffer containing the impulse response of the 171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber weighted synthesis filter; h[-L_subfr .. -1] must be 172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber set to zero (Word16) 173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber T0 = pitch lag (Word16) 174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pitch_sharp = last quantized pitch gain (Word16) 175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code = buffer containing the innovative codebook (Word16) 176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y = buffer containing the filtered fixed codebook excitation (Word16) 177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign = pointer to the signs of 2 pulses (Word16) 178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code buffer contains the new innovation vector gains 181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = code index (Word16) 184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Overflow = overflow flag (Flag) 187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function searches a 9 bit algebraic codebook containing 2 pulses in a 195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber frame of 40 samples. 196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber The code length is 40, containing 2 nonzero pulses: i0...i1. All pulses can 198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber have two possible amplitudes: +1 or -1. Pulse i0 can have 8 possible positions, 199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pulse i1 can have 8 positions. Also coded is which track pair should be used, 200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i.e. first or second pair. Where each pair contains 2 tracks. 201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber First subframe: 203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first i0 : 0, 5, 10, 15, 20, 25, 30, 35. 204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 2, 7, 12, 17, 22, 27, 32, 37. 205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber second i0 : 1, 6, 11, 16, 21, 26, 31, 36. 206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 3, 8, 13, 18, 23, 28, 33, 38. 207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Second subframe: 209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first i0 : 0, 5, 10, 15, 20, 25, 30, 35. 210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 3, 8, 13, 18, 23, 28, 33, 38. 211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber second i0 : 2, 7, 12, 17, 22, 27, 32, 37. 212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 4, 9, 14, 19, 24, 29, 34, 39. 213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Third subframe: 215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first i0 : 0, 5, 10, 15, 20, 25, 30, 35. 216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 2, 7, 12, 17, 22, 27, 32, 37. 217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber second i0 : 1, 6, 11, 16, 21, 26, 31, 36. 218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 4, 9, 14, 19, 24, 29, 34, 39. 219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 220b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Fourth subframe: 221b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first i0 : 0, 5, 10, 15, 20, 25, 30, 35. 222b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 3, 8, 13, 18, 23, 28, 33, 38. 223b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber second i0 : 1, 6, 11, 16, 21, 26, 31, 36. 224b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i1 : 4, 9, 14, 19, 24, 29, 34, 39. 225b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 226b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 227b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 228b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 229b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 230b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 231b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 232b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 233b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 234b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 235b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 236b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 237b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 238b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 239b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code_2i40_9bits( 240b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, // i : subframe number 241b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 x[], // i : target vector 242b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], // i : impulse response of weighted synthesis filter 243b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // h[-L_subfr..-1] must be set to zero. 244b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0, // i : Pitch lag 245b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 pitch_sharp, // i : Last quantized pitch gain 246b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code[], // o : Innovative codebook 247b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], // o : filtered fixed codebook excitation 248b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 * sign // o : Signs of 2 pulses 249b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 250b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 251b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[NB_PULSE]; 252b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[L_CODE], dn2[L_CODE], dn_sign[L_CODE]; 253b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[L_CODE][L_CODE]; 254b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i, index, sharp; 255b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 256b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp = shl(pitch_sharp, 1); 257b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(T0, L_CODE) < 0) 258b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = T0; i < L_CODE; i++) { 259b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h[i] = add(h[i], mult(h[i - T0], sharp)); 260b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 261b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cor_h_x(h, x, dn, 1); 262b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber set_sign(dn, dn_sign, dn2, 8); // dn2[] not used in this codebook search 263b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cor_h(h, dn_sign, rr); 264b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber search_2i40(subNr, dn, rr, codvec); 265b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = build_code(subNr, codvec, dn_sign, code, h, y, sign); 266b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 267b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 268b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Compute innovation vector gain. * 269b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Include fixed-gain pitch contribution into code[]. * 270b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------* 271b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 272b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (sub(T0, L_CODE) < 0) 273b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = T0; i < L_CODE; i++) { 274b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code[i] = add(code[i], mult(code[i - T0], sharp)); 275b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 276b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return index; 277b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 278b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 279b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 280b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 281b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 282b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 283b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 284b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 285b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 286b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 287b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 288b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 289b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 290b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 291b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 292b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 293b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 294b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 295b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 296b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 297b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 298b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 299b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 300b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 301b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 302b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code_2i40_9bits( 303b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 304b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 x[], /* i : target vector */ 305b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], /* i : impulse response of weighted synthesis */ 306b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* filter h[-L_subfr..-1] must be set to 0. */ 307b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 T0, /* i : Pitch lag */ 308b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 pitch_sharp, /* i : Last quantized pitch gain */ 309b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 code[], /* o : Innovative codebook */ 310b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], /* o : filtered fixed codebook excitation */ 311b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 * sign, /* o : Signs of 2 pulses */ 312b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 313b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 314b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 315b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[NB_PULSE]; 316b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[L_CODE]; 317b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn2[L_CODE]; 318b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn_sign[L_CODE]; 319b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[L_CODE][L_CODE]; 320b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 321b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 i; 322b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 323b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 index; 324b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sharp; 325b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 temp; 326b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 L_temp; 327b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 328b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_temp = ((Word32) pitch_sharp) << 1; 329b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 330b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Check for overflow condition */ 331b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (L_temp != (Word32)((Word16) L_temp)) 332b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 333b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(pOverflow) = 1; 334b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp = (pitch_sharp > 0) ? MAX_16 : MIN_16; 335b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 336b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 337b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 338b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp = (Word16) L_temp; 339b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 340b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 341b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (T0 < L_CODE) 342b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 343b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = T0; i < L_CODE; i++) 344b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 345b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber temp = 346b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mult( 347b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(h + i - T0), 348b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp, 349b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 350b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 351b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(h + i) = 352b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber add( 353b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(h + i), 354b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber temp, 355b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 356b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 357b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 358b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 359b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cor_h_x( 360b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h, 361b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber x, 362b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn, 363b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1, 364b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 365b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 366b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* dn2[] not used in this codebook search */ 367b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 368b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber set_sign( 369b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn, 370b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign, 371b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn2, 372b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 8); 373b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 374b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cor_h( 375b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h, 376b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign, 377b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr, 378b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 379b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 380b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber search_2i40( 381b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr, 382b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn, 383b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr, 384b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec, 385b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 386b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 387b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = 388b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber build_code( 389b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr, 390b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec, 391b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign, 392b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber code, 393b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h, 394b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y, 395b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign, 396b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 397b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 398b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*-----------------------------------------------------------------* 399b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Compute innovation vector gain. * 400b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * Include fixed-gain pitch contribution into code[]. * 401b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-----------------------------------------------------------------*/ 402b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 403b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (T0 < L_CODE) 404b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 405b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = T0; i < L_CODE; i++) 406b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 407b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber temp = 408b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber mult( 409b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(code + i - T0), 410b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sharp, 411b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 412b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 413b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(code + i) = 414b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber add( 415b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(code + i), 416b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber temp, 417b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 418b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 419b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 420b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 421b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(index); 422b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 423b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 424b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /****************************************************************************/ 425b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 426b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 427b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* 428b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 429b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: search_2i40 430b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 431b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 432b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 433b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 434b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr = subframe number (Word16) 435b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn = vector containing the correlation between target and the impulse 436b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber response of the weighted synthesis filter (Word16) 437b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr = autocorrelation matrix (Word16) 438b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = algebraic codebook vector (Word16) 439b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 440b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 441b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec contains the newly calculated codevectors 442b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 443b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 444b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 445b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 446b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 447b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 448b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 449b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 450b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber startPos = table containing the start positions used by fixed codebook 451b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber routines (const Word16) 452b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 453b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 454b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 455b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 456b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function searches the best codevector and determines the positions of 457b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the 2 pulses in the 40-sample frame. 458b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 459b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 460b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 461b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 462b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 463b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 464b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 465b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 466b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 467b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 468b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 469b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 470b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 471b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 472b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static void search_2i40( 473b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, // i : subframe number 474b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[], // i : correlation between target and h[] 475b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[][L_CODE], // i : matrix of autocorrelation 476b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[] // o : algebraic codebook vector 477b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 478b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 479b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i0, i1; 480b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ix = 0; // initialization only needed to keep gcc silent 481b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 track1, ipos[NB_PULSE]; 482b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 psk, ps0, ps1, sq, sq1; 483b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 alpk, alp, alp_16; 484b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 s, alp0, alp1; 485b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i; 486b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 487b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber psk = -1; 488b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alpk = 1; 489b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < NB_PULSE; i++) 490b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 491b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec[i] = i; 492b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 493b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 494b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (track1 = 0; track1 < 2; track1++) { 495b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // fix starting position 496b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 497b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ipos[0] = startPos[subNr*2+8*track1]; 498b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ipos[1] = startPos[subNr*2+1+8*track1]; 499b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 500b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 501b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 502b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * i0 loop: try 8 positions. * 503b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 504b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 505b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i0 = ipos[0]; i0 < L_CODE; i0 += STEP) { 506b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 507b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ps0 = dn[i0]; 508b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp0 = L_mult(rr[i0][i0], _1_4); 509b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 510b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 511b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * i1 loop: 8 positions. * 512b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 513b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 514b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq = -1; 515b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp = 1; 516b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ix = ipos[1]; 517b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 518b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-------------------------------------------------------------------* 519b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * These index have low complexity address computation because * 520b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * they are, in fact, pointers with fixed increment. For example, * 521b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * "rr[i0][i2]" is a pointer initialized to "&rr[i0][ipos[2]]" * 522b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and incremented by "STEP". * 523b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *-------------------------------------------------------------------* 524b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 525b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i1 = ipos[1]; i1 < L_CODE; i1 += STEP) { 526b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ps1 = add(ps0, dn[i1]); // idx increment = STEP 527b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 528b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // alp1 = alp0 + rr[i0][i1] + 1/2*rr[i1][i1]; 529b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 530b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp1 = L_mac(alp0, rr[i1][i1], _1_4); // idx incr = STEP 531b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp1 = L_mac(alp1, rr[i0][i1], _1_2); // idx incr = STEP 532b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 533b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq1 = mult(ps1, ps1); 534b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 535b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp_16 = pv_round(alp1); 536b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 537b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_msu(L_mult(alp, sq1), sq, alp_16); 538b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 539b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (s > 0) { 540b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq = sq1; 541b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp = alp_16; 542b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ix = i1; 543b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 544b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 545b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 546b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 547b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * memorise codevector if this one is better than the last one. * 548b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------------* 549b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 550b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_msu(L_mult(alpk, sq), psk, alp); 551b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 552b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (s > 0) { 553b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber psk = sq; 554b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alpk = alp; 555b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec[0] = i0; 556b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec[1] = ix; 557b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 558b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 559b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 560b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 561b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 562b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 563b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 564b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 565b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 566b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 567b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 568b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 569b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 570b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 571b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 572b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 573b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 574b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 575b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 576b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 577b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 578b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 579b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 580b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 581b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 582b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 583b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 584b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 585b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 586b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 587b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static void search_2i40( 588b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 589b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[], /* i : correlation between target and h[] */ 590b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[][L_CODE], /* i : matrix of autocorrelation */ 591b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* o : algebraic codebook vector */ 592b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 593b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 594b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 595b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 i0; 596b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 i1; 597b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ix = 0; /* initialization only needed to keep gcc silent */ 598b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 track1; 599b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ipos[NB_PULSE]; 600b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 psk; 601b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ps0; 602b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 ps1; 603b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sq; 604b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sq1; 605b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 alpk; 606b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 alp; 607b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 alp_16; 608b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 s; 609b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 alp0; 610b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 alp1; 611b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 i; 612b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 L_temp; 613b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *p_codvec = &codvec[0]; 614b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 615b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber OSCL_UNUSED_ARG(pOverflow); 616b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 617b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber psk = -1; 618b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alpk = 1; 619b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 620b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Unrolled the following FOR loop to save MIPS */ 621b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* for (i = 0; i < NB_PULSE; i++) */ 622b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* { */ 623b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* *(codvec + i) = i; */ 624b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* } */ 625b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 626b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(p_codvec++) = 0; 627b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(p_codvec) = 1; 628b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 629b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (track1 = 0; track1 < 2; track1++) 630b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 631b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* fix starting position */ 632b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 633b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i = (subNr << 1) + (track1 << 3); 634b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *ipos = *(startPos + i); 635b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(ipos + 1) = *(startPos + i + 1); 636b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 637b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 638b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*----------------------------------------------------------* 639b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * i0 loop: try 8 positions. * 640b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *----------------------------------------------------------*/ 641b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 642b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i0 = *ipos; i0 < L_CODE; i0 += STEP) 643b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 644b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ps0 = *(dn + i0); 645b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 646b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Left shift by 1 converts integer product to */ 647b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* fractional product. */ 648b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp0 = (Word32) rr[i0][i0] << 14; 649b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 650b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*--------------------------------------------------* 651b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * i1 loop: 8 positions. * 652b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *--------------------------------------------------*/ 653b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 654b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq = -1; 655b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp = 1; 656b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ix = *(ipos + 1); 657b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 658b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*--------------------------------------------------* 659b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * These index have low complexity address * 660b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * computation because they are, in fact, pointers * 661b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * with fixed increment. For example, "rr[i0][i2]" * 662b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * is a pointer initialized to "&rr[i0][ipos[2]]" * 663b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber * and incremented by "STEP". * 664b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *---------------------------------------------------*/ 665b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 666b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i1 = *(ipos + 1); i1 < L_CODE; i1 += STEP) 667b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 668b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* idx increment = STEP */ 669b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* ps1 = add(ps0, *(dn + i1), pOverflow); */ 670b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ps1 = ps0 + dn[i1]; 671b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 672b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* alp1 = alp0+rr[i0][i1]+1/2*rr[i1][i1]; */ 673b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 674b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* idx incr = STEP */ 675b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Extra left shift by 1 converts integer */ 676b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* product to fractional product */ 677b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* alp1 = L_add(alp0, s, pOverflow); */ 678b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp1 = alp0 + ((Word32) rr[i1][i1] << 14); 679b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 680b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* idx incr = STEP */ 681b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* Extra left shift by 1 converts integer */ 682b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* product to fractional product */ 683b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* alp1 = L_add(alp1, s, pOverflow); */ 684b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp1 += (Word32) rr[i0][i1] << 15; 685b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 686b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* sq1 = mult(ps1, ps1, pOverflow); */ 687b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq1 = (Word16)(((Word32) ps1 * ps1) >> 15); 688b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 689b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* alp_16 = pv_round(alp1, pOverflow); */ 690b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp_16 = (Word16)((alp1 + (Word32) 0x00008000L) >> 16); 691b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 692b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* L_temp = L_mult(alp, sq1, pOverflow); */ 693b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_temp = ((Word32) alp * sq1) << 1; 694b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 695b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* s = L_msu(L_temp, sq, alp_16, pOverflow); */ 696b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_temp - (((Word32) sq * alp_16) << 1); 697b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 698b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (s > 0) 699b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 700b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sq = sq1; 701b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alp = alp_16; 702b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ix = i1; 703b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 704b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 705b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 706b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* memorize codevector if this one is better than the last one. */ 707b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 708b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* L_temp = L_mult(alpk, sq, pOverflow); */ 709b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_temp = ((Word32) alpk * sq) << 1; 710b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 711b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* s = L_msu(L_temp, psk, alp, pOverflow); */ 712b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_temp - (((Word32) psk * alp) << 1); 713b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 714b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (s > 0) 715b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 716b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber psk = sq; 717b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber alpk = alp; 718b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p_codvec = &codvec[0]; 719b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(p_codvec++) = i0; 720b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(p_codvec) = ix; 721b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 722b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 723b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 724b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 725b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 726b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 727b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 728b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /****************************************************************************/ 729b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 730b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* 731b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 732b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: Test_search_2i40 733b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 734b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 735b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 736b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 737b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr = subframe number (Word16) 738b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn = vector containing the correlation between target and the impulse 739b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber response of the weighted synthesis filter (Word16) 740b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr = autocorrelation matrix (Word16) 741b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = algebraic codebook vector (Word16) 742b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 743b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 744b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec contains the newly calculated codevectors 745b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 746b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 747b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 748b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 749b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 750b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 751b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 752b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 753b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber startPos = table containing the start positions used by fixed codebook 754b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber routines (const Word16) 755b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 756b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 757b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 758b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 759b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function provides external access to the local function search_2i40. 760b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 761b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 762b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 763b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 764b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 765b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 766b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 767b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 768b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 769b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 770b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 771b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 772b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 773b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 774b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL search_2i40 ( subNr = subNr 775b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn = dn 776b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr = rr 777b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = codvec ) 778b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFYING(nothing) 779b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURNING(nothing) 780b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 781b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 782b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 783b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 784b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 785b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 786b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 787b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 788b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 789b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 790b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 791b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 792b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 793b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 794b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 795b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 796b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 797b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 798b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 799b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 800b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 801b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 802b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 803b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 804b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber void Test_search_2i40( 805b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 806b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn[], /* i : correlation between target and h[] */ 807b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 rr[][L_CODE], /* i : matrix of autocorrelation */ 808b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* o : algebraic codebook vector */ 809b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 810b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 811b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 812b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 813b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL search_2i40 ( subNr = subNr 814b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn = dn 815b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr = rr 816b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = codvec ) 817b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFYING(nothing) 818b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURNING(nothing) 819b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 820b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber search_2i40( 821b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr, 822b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn, 823b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rr, 824b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec, 825b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 826b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 827b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return; 828b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 829b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 830b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /****************************************************************************/ 831b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 832b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* 833b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 834b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: build_code 835b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 836b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 837b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 838b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 839b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr = subframe number (Word16) 840b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = vector containing the position of pulses (Word16) 841b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign = vector containing the sign of pulses (Word16) 842b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod = innovative code vector (Word16) 843b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h = vector containing the impulse response of the weighted 844b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synthesis filter (Word16) 845b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y = vector containing the filtered innovative code (Word16) 846b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign = vector containing the sign of 2 pulses (Word16) 847b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 848b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 849b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod vector contains the new innovative code 850b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y vector contains the new filtered innovative code 851b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign vector contains the sign of 2 pulses 852b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 853b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 854b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx = codebook index (Word16) 855b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 856b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 857b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 858b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 859b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 860b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber trackTable = table used for tracking codewords (Word16) 861b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 862b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 863b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 864b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 865b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function builds the codeword, the filtered codeword and index of the 866b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codevector, based on the signs and positions of 2 pulses. 867b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 868b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 869b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 870b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 871b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 872b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 873b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 874b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 875b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 876b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 877b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 878b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 879b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 880b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 881b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static Word16 build_code( 882b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, // i : subframe number 883b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], // i : position of pulses 884b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn_sign[], // i : sign of pulses 885b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 cod[], // o : innovative code vector 886b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], // i : impulse response of weighted synthesis filter 887b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], // o : filtered innovative code 888b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sign[] // o : sign of 2 pulses 889b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 890b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 891b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 i, j, k, track, first, index, _sign[NB_PULSE], indx, rsign; 892b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *p0, *p1, *pt; 893b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 s; 894b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static Word16 trackTable[4*5] = { 895b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, 0, 1, -1, // subframe 1; track to code; -1 do not code this position 896b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, -1, 1, 0, 1, // subframe 2 897b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, 0, -1, 1, // subframe 3 898b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 0, 1, -1, 0, 1};// subframe 4 899b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 900b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pt = &trackTable[add(subNr, shl(subNr, 2))]; 901b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 902b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < L_CODE; i++) { 903b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod[i] = 0; 904b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 905b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 906b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx = 0; 907b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rsign = 0; 908b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (k = 0; k < NB_PULSE; k++) { 909b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i = codvec[k]; // read pulse position 910b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber j = dn_sign[i]; // read sign 911b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 912b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = mult(i, 6554); // index = pos/5 913b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber // track = pos%5 914b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = sub(i, extract_l(L_shr(L_mult(index, 5), 1))); 915b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 916b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first = pt[track]; 917b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 918b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (first == 0) { 919b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (k == 0) { 920b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 0; 921b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } else { 922b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 1; 923b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = shl(index, 3); 924b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 925b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } else { 926b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (k == 0) { 927b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 0; 928b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = add(index, 64); // table bit is MSB 929b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } else { 930b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 1; 931b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = shl(index, 3); 932b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 933b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 934b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 935b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (j > 0) { 936b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod[i] = 8191; 937b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber _sign[k] = 32767; 938b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rsign = add(rsign, shl(1, track)); 939b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } else { 940b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod[i] = -8192; 941b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber _sign[k] = (Word16) - 32768L; 942b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 943b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 944b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx = add(indx, index); 945b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 946b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *sign = rsign; 947b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 948b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p0 = h - codvec[0]; 949b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p1 = h - codvec[1]; 950b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 951b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < L_CODE; i++) { 952b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = 0; 953b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_mac(s, *p0++, _sign[0]); 954b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = L_mac(s, *p1++, _sign[1]); 955b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y[i] = pv_round(s); 956b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 957b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 958b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return indx; 959b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 960b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 961b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 962b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 963b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 964b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 965b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 966b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 967b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 968b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 969b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 970b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 971b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 972b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 973b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 974b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 975b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 976b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 977b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 978b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 979b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 980b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 981b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 982b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 983b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 984b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber static Word16 build_code( 985b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 986b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* i : position of pulses */ 987b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn_sign[], /* i : sign of pulses */ 988b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 cod[], /* o : innovative code vector */ 989b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], /* i : impulse response of weighted synthesis */ 990b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* filter */ 991b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], /* o : filtered innovative code */ 992b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sign[], /* o : sign of 2 pulses */ 993b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag *pOverflow /* o : Flag set when overflow occurs */ 994b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 995b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 996b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 i; 997b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 j; 998b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 k; 999b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 track; 1000b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 first; 1001b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 index; 1002b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber register Word16 rsign; 1003b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 indx; 1004b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 _sign[NB_PULSE]; 1005b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *p0; 1006b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 *p1; 1007b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1008b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber const Word16 *pt; 1009b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1010b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word32 s; 1011b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1012b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pt = trackTable + subNr + (subNr << 2); 1013b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1014b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < L_CODE; i++) 1015b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1016b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(cod + i) = 0; 1017b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1018b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1019b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx = 0; 1020b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rsign = 0; 1021b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1022b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (k = 0; k < NB_PULSE; k++) 1023b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1024b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber i = *(codvec + k); /* read pulse position */ 1025b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber j = *(dn_sign + i); /* read sign */ 1026b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1027b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = ((Word32)(i * 6554)) >> 15; 1028b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index = (Word16) s; /* index = pos/5 */ 1029b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1030b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = i - (5 * index); /* track = pos%5 */ 1031b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1032b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber first = *(pt + track); 1033b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1034b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1035b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (k == 0) 1036b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1037b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 0; 1038b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1039b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (first != 0) 1040b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1041b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index += 64; /* table bit is MSB */ 1042b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1043b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1044b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1045b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1046b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber track = 1; 1047b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber index <<= 3; 1048b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1049b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1050b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber if (j > 0) 1051b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1052b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(cod + i) = 8191; 1053b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(_sign + k) = 32767; 1054b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber rsign += (1 << track); 1055b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1056b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber else 1057b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1058b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(cod + i) = ~(8192) + 1; 1059b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(_sign + k) = (Word16)(~(32768) + 1); 1060b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1061b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1062b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx += index; 1063b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1064b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1065b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *sign = rsign; 1066b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1067b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p0 = h - *codvec; 1068b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber p1 = h - *(codvec + 1); 1069b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1070b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber for (i = 0; i < L_CODE; i++) 1071b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1072b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = 0; 1073b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = 1074b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_mult( 1075b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *p0++, 1076b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *_sign, 1077b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 1078b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1079b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s = 1080b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber L_mac( 1081b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s, 1082b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *p1++, 1083b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(_sign + 1), 1084b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 1085b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1086b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber *(y + i) = 1087b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pv_round( 1088b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber s, 1089b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 1090b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1091b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1092b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(indx); 1093b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1094b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1095b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /****************************************************************************/ 1096b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1097b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* 1098b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1099b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION NAME: Test_build_code 1100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber INPUT AND OUTPUT DEFINITIONS 1102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Inputs: 1104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr = subframe number (Word16) 1105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = vector containing the position of pulses (Word16) 1106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign = vector containing the sign of pulses (Word16) 1107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod = innovative code vector (Word16) 1108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h = vector containing the impulse response of the weighted 1109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber synthesis filter (Word16) 1110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y = vector containing the filtered innovative code (Word16) 1111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign = vector containing the sign of 2 pulses (Word16) 1112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Outputs: 1114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod vector contains the new innovative code 1115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y vector contains the new filtered innovative code 1116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign vector contains the sign of 2 pulses 1117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Returns: 1119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber indx = codebook index (Word16) 1120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Global Variables Used: 1122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 1123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Local Variables Needed: 1125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber trackTable = table used for tracking codewords (Word16) 1126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber FUNCTION DESCRIPTION 1129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber This function provides external access to the local function build_code. 1131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REQUIREMENTS 1134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber None 1136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber REFERENCES 1139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [1] c2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 1141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber PSEUDO-CODE 1144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL build_code ( subNr = subNr 1146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = codvec 1147b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign = dn_sign 1148b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod = cod 1149b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h = h 1150b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y = y 1151b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign = sign ) 1152b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFYING(nothing) 1153b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURNING(indx) 1154b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1155b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1156b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RESOURCES USED [optional] 1157b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1158b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber When the code is written for a specific target processor the 1159b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber the resources used should be documented below. 1160b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1161b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber HEAP MEMORY USED: x bytes 1162b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1163b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber STACK MEMORY USED: x bytes 1164b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1165b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 1166b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber used to represent cycle count for each subroutine 1167b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber called) 1168b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber where: (cycle count variable) = cycle count for [subroutine 1169b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber name] 1170b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1171b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1172b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CAUTION [optional] 1173b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber [State any special notes, constraints or cautions for users of this function] 1174b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1175b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ------------------------------------------------------------------------------ 1176b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */ 1177b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1178b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 Test_build_code( 1179b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 subNr, /* i : subframe number */ 1180b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 codvec[], /* i : position of pulses */ 1181b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 dn_sign[], /* i : sign of pulses */ 1182b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 cod[], /* o : innovative code vector */ 1183b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 h[], /* i : impulse response of weighted synthesis */ 1184b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /* filter */ 1185b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 y[], /* o : filtered innovative code */ 1186b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 sign[], /* o : sign of 2 pulses */ 1187b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Flag * pOverflow /* o : Flag set when overflow occurs */ 1188b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ) 1189b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber { 1190b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber Word16 test_index; 1191b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1192b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber /*---------------------------------------------------------------------------- 1193b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber CALL build_code ( subNr = subNr 1194b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec = codvec 1195b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign = dn_sign 1196b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod = cod 1197b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h = h 1198b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y = y 1199b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign = sign ) 1200b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber MODIFYING(nothing) 1201b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber RETURNING(indx) 1202b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ----------------------------------------------------------------------------*/ 1203b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber test_index = 1204b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber build_code( 1205b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber subNr, 1206b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber codvec, 1207b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber dn_sign, 1208b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber cod, 1209b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber h, 1210b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber y, 1211b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber sign, 1212b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber pOverflow); 1213b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1214b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber return(test_index); 1215b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber } 1216b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber 1217b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#ifdef __cplusplus 1218b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber} 1219b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#endif 1220