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