1d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* ------------------------------------------------------------------ 2d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 4d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * you may not use this file except in compliance with the License. 6d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * You may obtain a copy of the License at 7d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 8d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * 10d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Unless required by applicable law or agreed to in writing, software 11d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * express or implied. 14d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * See the License for the specific language governing permissions 15d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * and limitations under the License. 16d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * ------------------------------------------------------------------- 17d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */ 18d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/**************************************************************************************** 19d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPortions of this file are derived from the following 3GPP standard: 20d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 21d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 3GPP TS 26.073 22d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Available from http://www.3gpp.org 24d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 25d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPermission to distribute, modify and use this file under the standard license 27d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberterms listed above has been obtained from the copyright holder. 28d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber****************************************************************************************/ 29d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 30d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 31d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 32d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 33d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 34d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pathname: ./audio/gsm-amr/c/src/enc_lag6.c 35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Functions: 36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Date: 02/05/2002 38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REVISION HISTORY 41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Updated template used to PV coding template. 43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Changed to accept the pOverflow flag for EPOC compatibility. 44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: 46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (1) Removed optimization -- mult(i, 6, pOverflow) is NOT the same as adding 47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i to itself 6 times. The reason is because the mult function does a 48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber right shift by 15, which will obliterate smaller numbers. 49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: Replaced "int" and/or "char" with OSCL defined types. 51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Description: 53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION 56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES 63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "enc_lag6.h" 65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "typedef.h" 66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h" 67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS 70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here 71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES 75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional 76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also. 77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS 81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration 82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*---------------------------------------------------------------------------- 85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS 86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module 87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/ 88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* 91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Enc_lag6 93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS 95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs: 97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber T0 -- Word16 -- Pitch delay 98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber T0_frac -- Word16 -- Fractional pitch delay 99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber T0_min -- Word16 -- minimum of search range 100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber delta_flag -- Word16 -- Flag for 1st (or 3rd) subframe 101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs: 103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber pOverflow -- Pointer to Flag -- overflow indicator 104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns: 106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 -- Return index of encoding 107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used: 109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed: 112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION 116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PURPOSE: Encoding of fractional pitch lag with 1/6 resolution. 118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber DESCRIPTION: 120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber First and third subframes: 121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber -------------------------- 122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The pitch range is divided as follows: 123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 17 3/6 to 94 3/6 resolution 1/6 124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 95 to 143 resolution 1 125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The period is encoded with 9 bits. 127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber For the range with fractions: 128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = (T-17)*6 + frac - 3; 129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where T=[17..94] and frac=[-2,-1,0,1,2,3] 130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber and for the integer only range 131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = (T - 95) + 463; where T=[95..143] 132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Second and fourth subframes: 134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber ---------------------------- 135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber For the 2nd and 4th subframes a resolution of 1/6 is always used, 136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber and the search range is relative to the lag in previous subframe. 137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber If t0 is the lag in the previous subframe then 138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber t_min=t0-5 and t_max=t0+4 and the range is given by 139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber (t_min-1) 3/6 to (t_max) 3/6 140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The period in the 2nd (and 4th) subframe is encoded with 6 bits: 142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = (T-(t_min-1))*6 + frac - 3; 143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where T=[t_min-1..t_max] and frac=[-2,-1,0,1,2,3] 144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Note that only 61 values are used. If the decoder receives 61, 62, 146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber or 63 as the relative pitch index, it means that a transmission 147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber error occurred and the pitch from previous subframe should be used. 148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS 151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None 153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES 156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber enc_lag6.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE 161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional] 165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the 167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below. 168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes 170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 171d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes 172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable 174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber used to represent cycle count for each subroutine 175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber called) 176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where: (cycle count variable) = cycle count for [subroutine 177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber name] 178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional] 181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function] 182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------ 184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/ 185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 186d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Enc_lag6( /* o : Return index of encoding */ 187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T0, /* i : Pitch delay */ 188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T0_frac, /* i : Fractional pitch delay */ 189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 T0_min, /* i : minimum of search range */ 190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 delta_flag, /* i : Flag for 1st (or 3rd) subframe */ 191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Flag *pOverflow /* o : overflow indicator */ 192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber) 193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{ 194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 index; 195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 i; 196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Word16 temp; 197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (delta_flag == 0) /* if 1st or 3rd subframe */ 199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* encode pitch delay (with fraction) */ 201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber if (T0 <= 94) 202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* index = T0*6 - 105 + T0_frac */ 204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i = 6 * T0 - 105; 205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = add(i, T0_frac, pOverflow); 207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = add(T0, 368, pOverflow); 211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber else 215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* if second or fourth subframe */ 216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber { 217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber /* index = 6*(T0-T0_min) + 3 + T0_frac */ 218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber temp = sub(T0, T0_min, pOverflow); 219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i = add(temp, temp, pOverflow); 221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i = add(temp, i, pOverflow); 222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i = add(i, i, pOverflow); 223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber i = add(i, 3, pOverflow); 225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber index = add(i, T0_frac, pOverflow); 227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber } 228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber 229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber return index; 230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber} 231