1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------ 2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License. 6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at 7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied. 14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions 15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License. 16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * ------------------------------------------------------------------- 17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/**************************************************************************************** 19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard: 20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3GPP TS 26.073 22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Available from http://www.3gpp.org 24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license 27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder. 28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/ 29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/d8_31pf.c 35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Functions: 36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Date: 01/28/2002 39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY 42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Modified to pass overflow flag through to basic math function. 44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber The flag is passed back to the calling function by pointer reference. 45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Per review comments... 47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (1) Removed include of "count.h" and "basic_op.h" 48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (2) Added includes of mult.h, shl.h, shr.h, add.h, sub.h, negate.h, 49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_mult.h, and L_shr.h 50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Replaced "int" and/or "char" with OSCL defined types. 52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: 54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION 57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES 61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d8_31pf.h" 63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h" 64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "basic_op.h" 65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst.h" 66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS 70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here 71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES 75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional 76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also. 77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NB_PULSE 8 /* number of pulses */ 79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* define values/representation for output codevector and sign */ 81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define POS_CODE 8191 82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define NEG_CODE 8191 83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS 87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration 88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS 92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module 93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: decompress10 98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs -- Word16 -- MSB part of the index 103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs -- Word16 -- LSB part of the index 104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index1 -- Word16 -- index for first pos in pos_index[] 105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index2 -- Word16 -- index for second pos in pos_index[] 106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index3 -- Word16 -- index for third pos in pos_index[] 107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[] -- array of type Word16 -- position of 3 pulses (decompressed) 110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow Flag set when overflow occurs, pointer of type Flag * 112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void decompress10( 164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 MSBs, /* i : MSB part of the index */ 165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 LSBs, /* i : LSB part of the index */ 166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index1, /* i : index for first pos in pos_index[] */ 167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index2, /* i : index for second pos in pos_index[] */ 168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index3, /* i : index for third pos in pos_index[] */ 169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pos_indx[], /* o : position of 3 pulses (decompressed) */ 170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Flag *pOverflow) /* o : Flag set when overflow occurs */ 171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 ia; 173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 ib; 174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 ic; 175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word32 tempWord32; 176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index1] = ((MSBs-25*(MSBs/25))%5)*2 + (LSBs-4*(LSBs/4))%2; 179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index2] = ((MSBs-25*(MSBs/25))/5)*2 + (LSBs-4*(LSBs/4))/2; 180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index3] = (MSBs/25)*2 + LSBs/4; 181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (MSBs > 124) 184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = 124; 186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = 189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs, 191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1311, 192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tempWord32 = 195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_mult( 196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia, 197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25, 198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = (Word16)(MSBs - (tempWord32 >> 1)); 202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia, 205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6554, 206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tempWord32 = 209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_mult( 210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 5, 212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = ia - (Word16)(tempWord32 >> 1); 215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shl( 218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ic = LSBs - ((LSBs >> 2) << 2); 224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index1] = ib + (ic & 1); 227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia, 232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6554, 233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shl( 237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index2] = ib + (ic >> 1); 243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = LSBs >> 2; 246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ic = 248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs, 250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1311, 251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ic = 254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shl( 255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ic, 256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[index3] = 260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber add( 261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ic, 263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: decompress_code 272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber indx[] -- array of type Word16 -- position and sign of 277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 8 pulses (compressed) 278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sign_indx[] -- array of type Word16 -- signs of 4 pulses (signs only) 281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[] -- array of type Word16 -- position index of 8 pulses 282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (position only) 283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow pointer to type Flag -- Flag set when overflow occurs 284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PURPOSE: decompression of the linear codewords to 4+three indeces 298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber one bit from each pulse is made robust to errors by 299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber minimizing the phase shift of a bit error. 300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 4 signs (one for each track) 301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i0,i4,i1 => one index (7+3) bits, 3 LSBs more robust 302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i2,i6,i5 => one index (7+3) bits, 3 LSBs more robust 303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i3,i7 => one index (5+2) bits, 2-3 LSbs more robust 304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic void decompress_code( 343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 indx[], /* i : position and sign of 8 pulses (compressed) */ 344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 sign_indx[], /* o : signs of 4 pulses (signs only) */ 345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pos_indx[], /* o : position index of 8 pulses (position only) */ 346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Flag *pOverflow /* o : Flag set when overflow occurs */ 347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 ia; 351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 ib; 352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 MSBs; 353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 LSBs; 354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 MSBs0_24; 355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word32 tempWord32; 356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < NB_TRACK_MR102; i++) 358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sign_indx[i] = indx[i]; 360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber First index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits 364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK]/8; 365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK]%8; 366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK_MR102] >> 3; 368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK_MR102] & 0x7; 370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decompress10( 372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs, 373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs, 374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 0, 375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 4, 376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx, 378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Second index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits 382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK+1]/8; 383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK+1]%8; 384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK_MR102+1] >> 3; 386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK_MR102+1] & 0x7; 388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decompress10( 390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs, 391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs, 392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2, 393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6, 394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 5, 395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx, 396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* 399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Third index: 10x10 -> 2x5x2x5-> 25x2x2 -> 5+1x2 bits 400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK+2]/4; 401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK+2]%4; 402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs0_24 = (MSBs*25+12)/32; 403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((MSBs0_24/5)%2==1) 404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[3] = (4-(MSBs0_24%5))*2 + LSBs%2; 405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[3] = (MSBs0_24%5)*2 + LSBs%2; 407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[7] = (MSBs0_24/5)*2 + LSBs/2; 408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs = indx[NB_TRACK_MR102+2] >> 2; 411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber LSBs = indx[NB_TRACK_MR102+2] & 0x3; 413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tempWord32 = 415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_mult( 416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs, 417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25, 418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = 421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber (Word16) 422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_shr( 423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tempWord32, 424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia += 12; 428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs0_24 = ia >> 5; 430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = 433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs0_24, 435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6554, 436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia &= 1; 439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs0_24, 444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6554, 445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tempWord32 = 448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_mult( 449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 5, 451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = MSBs0_24 - (Word16)(tempWord32 >> 1); 455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (ia == 1) 457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 4 - ib; 459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib = 464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shl( 465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = LSBs & 0x1; 470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[3] = 472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber add( 473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ib, 474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia, 475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = 478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult( 479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MSBs0_24, 480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6554, 481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia = 484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shl( 485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ia, 486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1, 487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos_indx[7] = ia + (LSBs >> 1); 490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* 494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: dec_8i40_31bits 496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS 498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs: 500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index array of type Word16 -- index of 8 pulses (sign+position) 501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs: 503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber cod array of type Word16 -- algebraic (fixed) codebook excitation 504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow pointer to type Flag -- Flag set when overflow occurs 505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns: 507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used: 510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed: 513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION 517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PURPOSE: Builds the innovative codevector from the received 519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index of algebraic codebook. 520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS 523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None 525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES 528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE 533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional] 537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the 539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below. 540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes 542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes 544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber used to represent cycle count for each subroutine 547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber called) 548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber where: (cycle count variable) = cycle count for [subroutine 549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber name] 550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional] 553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function] 554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------ 556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 558a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid dec_8i40_31bits( 559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 index[], /* i : index of 8 pulses (sign+position) */ 560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 cod[], /* o : algebraic (fixed) codebook excitation */ 561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Flag *pOverflow /* o : Flag set when overflow occurs */ 562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 i; 565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 j; 566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pos1; 567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 pos2; 568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 sign; 569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 linear_signs[NB_TRACK_MR102]; 571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Word16 linear_codewords[NB_PULSE]; 572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = 0; i < L_CODE; i++) 574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber cod[i] = 0; 576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber decompress_code( 579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber index, 580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber linear_signs, 581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber linear_codewords, 582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pOverflow); 583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* decode the positions and signs of pulses and build the codeword */ 585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (j = 0; j < NB_TRACK_MR102; j++) /* NB_TRACK_MR102 = 4 */ 586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* position of pulse "j" */ 588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos1 = (linear_codewords[j] << 2) + j; 590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (linear_signs[j] == 0) 593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sign = POS_CODE; /* +1.0 */ 595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sign = -NEG_CODE; /* -1.0 */ 599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pos1 < L_SUBFR) 602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber cod[pos1] = sign; /* avoid buffer overflow */ 604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* compute index i */ 607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* position of pulse "j+4" */ 608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pos2 = (linear_codewords[j + 4] << 2) + j; 610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pos2 < pos1) 613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sign = negate(sign); 615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (pos2 < L_SUBFR) 618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber cod[pos2] += sign; /* avoid buffer overflow */ 620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } /* for (j = 0; j < NB_TRACK_MR102; j++) */ 624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 627