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