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