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/calc_cor.c
35
36 Date: 06/12/2000
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41 Description: Initial Optimization
42
43 Description: Optimize code by calculating two correlation per iteration
44 of the outer loop.
45
46 Description: Delete psedocode
47
48 Description: Synchronized file with UMTS version 3.2.0. Updated coding
49 template. Removed unnecessary include files.
50
51 Description: Made the following changes per comments from Phase 2/3 review:
52 1. Defined one local variable per line.
53
54 Description:
55 1. Eliminated unused include file typedef.h.
56 2. Replaced array addressing by pointers
57 3. Unrolled loops to save extra accesses to memory
58
59 Description: Replaced "int" and/or "char" with OSCL defined types.
60
61 Description: Using inline functions from fxp_arithmetic.h for mac operations.
62
63 Description: Replacing fxp_arithmetic.h with basic_op.h.
64
65 Description:
66
67 ------------------------------------------------------------------------------
68 */
69
70 /*----------------------------------------------------------------------------
71 ; INCLUDES
72 ----------------------------------------------------------------------------*/
73 #include "calc_cor.h"
74 #include "basic_op.h"
75 /*----------------------------------------------------------------------------
76 ; MACROS
77 ; Define module specific macros here
78 ----------------------------------------------------------------------------*/
79
80
81 /*----------------------------------------------------------------------------
82 ; DEFINES
83 ; Include all pre-processor statements here. Include conditional
84 ; compile variables also.
85 ----------------------------------------------------------------------------*/
86
87 /*----------------------------------------------------------------------------
88 ; LOCAL FUNCTION DEFINITIONS
89 ; Function Prototype declaration
90 ----------------------------------------------------------------------------*/
91
92 /*----------------------------------------------------------------------------
93 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
94 ; Variable declaration - defined here and used outside this module
95 ----------------------------------------------------------------------------*/
96
97
98 /*
99 ------------------------------------------------------------------------------
100 FUNCTION NAME: comp_corr
101 ------------------------------------------------------------------------------
102 INPUT AND OUTPUT DEFINITIONS
103
104 Inputs:
105 scal_sig = array of input samples. (Word16)
106 L_frame = length of frame used to compute pitch(Word16)
107 lag_max = maximum lag (Word16)
108 lag_min = minimum lag (Word16)
109 corr = pointer to array of correlations corresponding to the selected
110 lags. (Word32)
111
112 Outputs:
113 corr = pointer to array of correlations corresponding to the selected
114 lags. (Word32)
115
116 Returns:
117 none
118
119 Global Variables Used:
120 none
121
122 Local Variables Needed:
123 none
124
125 ------------------------------------------------------------------------------
126 FUNCTION DESCRIPTION
127
128 This function calculates all correlations of scal_sig[] in a given delay
129 range.
130
131 The correlation is given by
132
133 cor[t] = <scal_sig[n],scal_sig[n-t]>, t=lag_min,...,lag_max
134
135 The function outputs all of the correlations
136
137 ------------------------------------------------------------------------------
138 REQUIREMENTS
139
140 none
141
142 ------------------------------------------------------------------------------
143 REFERENCES
144
145 [1] calc_cor.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
146
147 ------------------------------------------------------------------------------
148 PSEUDO-CODE
149
150 void comp_corr (
151 Word16 scal_sig[], // i : scaled signal.
152 Word16 L_frame, // i : length of frame to compute pitch
153 Word16 lag_max, // i : maximum lag
154 Word16 lag_min, // i : minimum lag
155 Word32 corr[]) // o : correlation of selected lag
156 {
157 Word16 i, j;
158 Word16 *p, *p1;
159 Word32 t0;
160
161 for (i = lag_max; i >= lag_min; i--)
162 {
163 p = scal_sig;
164 p1 = &scal_sig[-i];
165 t0 = 0;
166
167 for (j = 0; j < L_frame; j++, p++, p1++)
168 {
169 t0 = L_mac (t0, *p, *p1);
170 }
171 corr[-i] = t0;
172 }
173
174 return;
175 }
176
177 ------------------------------------------------------------------------------
178 RESOURCES USED [optional]
179
180 When the code is written for a specific target processor the
181 the resources used should be documented below.
182
183 HEAP MEMORY USED: x bytes
184
185 STACK MEMORY USED: x bytes
186
187 CLOCK CYCLES: (cycle count equation for this function) + (variable
188 used to represent cycle count for each subroutine
189 called)
190 where: (cycle count variable) = cycle count for [subroutine
191 name]
192
193 ------------------------------------------------------------------------------
194 CAUTION [optional]
195 [State any special notes, constraints or cautions for users of this function]
196
197 ------------------------------------------------------------------------------
198 */
199
comp_corr(Word16 scal_sig[],Word16 L_frame,Word16 lag_max,Word16 lag_min,Word32 corr[])200 void comp_corr(
201 Word16 scal_sig[], /* i : scaled signal. */
202 Word16 L_frame, /* i : length of frame to compute pitch */
203 Word16 lag_max, /* i : maximum lag */
204 Word16 lag_min, /* i : minimum lag */
205 Word32 corr[]) /* o : correlation of selected lag */
206 {
207
208
209
210
211 /*---------------------------------------------------
212 ; lag_max and lag_min are typically negative numbers
213 -----------------------------------------------------*/
214
215
216 /* PIT_MIN_MR122 18 Minimum pitch lag (MR122 mode) */
217 /* PIT_MIN 20 Minimum pitch lag (all other modes) */
218 /* PIT_MAX 143 Maximum pitch lag */
219
220
221 Word16 i;
222 Word16 j;
223 Word16 *p;
224 Word16 *p1;
225 Word16 *p2;
226 Word16 *p_scal_sig;
227 Word32 t1;
228 Word32 t2;
229 Word32 t3;
230 Word32 t4;
231
232 corr = corr - lag_max ;
233 p_scal_sig = &scal_sig[-lag_max];
234
235 for (i = ((lag_max - lag_min) >> 2) + 1; i > 0; i--)
236 {
237 t1 = 0;
238 t2 = 0;
239 t3 = 0;
240 t4 = 0;
241 p = &scal_sig[0];
242 p1 = p_scal_sig++;
243 p_scal_sig++;
244 p2 = p_scal_sig++;
245 p_scal_sig++;
246 for (j = (L_frame >> 1); j != 0; j--)
247 {
248 t1 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p1++), t1);
249 t2 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p1), t2);
250 t3 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p2++), t3);
251 t4 = amrnb_fxp_mac_16_by_16bb((Word32) * (p++), (Word32) * (p2), t4);
252
253 t1 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p1++), t1);
254 t2 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p1), t2);
255 t3 = amrnb_fxp_mac_16_by_16bb((Word32) * (p), (Word32) * (p2++), t3);
256 t4 = amrnb_fxp_mac_16_by_16bb((Word32) * (p++), (Word32) * (p2), t4);
257 }
258
259 *(corr++) = t1 << 1;
260 *(corr++) = t2 << 1;
261 *(corr++) = t3 << 1;
262 *(corr++) = t4 << 1;
263
264 }
265
266 return;
267 }
268