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/spstproc.c 35 Functions: subframePostProc 36 37 Date: 02/06/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. Eliminated unused include files. 47 2. Replaced array addressing by pointers 48 3. Eliminated math operations that unnecessary checked for 49 saturation 50 4. Replaced loop counter with decrement loops 51 52 Description: Added casting to eliminate warnings 53 54 Description: Replaced "int" and/or "char" with OSCL defined types. 55 56 Description: 57 58 ------------------------------------------------------------------------------ 59 MODULE DESCRIPTION 60 61 Subframe post processing 62 ------------------------------------------------------------------------------ 63 */ 64 65 /*---------------------------------------------------------------------------- 66 ; INCLUDES 67 ----------------------------------------------------------------------------*/ 68 #include "spstproc.h" 69 #include "syn_filt.h" 70 #include "cnst.h" 71 72 /*---------------------------------------------------------------------------- 73 ; MACROS 74 ; Define module specific macros here 75 ----------------------------------------------------------------------------*/ 76 77 /*---------------------------------------------------------------------------- 78 ; DEFINES 79 ; Include all pre-processor statements here. Include conditional 80 ; compile variables also. 81 ----------------------------------------------------------------------------*/ 82 83 /*---------------------------------------------------------------------------- 84 ; LOCAL FUNCTION DEFINITIONS 85 ; Function Prototype declaration 86 ----------------------------------------------------------------------------*/ 87 88 /*---------------------------------------------------------------------------- 89 ; LOCAL VARIABLE DEFINITIONS 90 ; Variable declaration - defined here and used outside this module 91 ----------------------------------------------------------------------------*/ 92 93 /* 94 ------------------------------------------------------------------------------ 95 FUNCTION NAME: subframePostProc 96 ------------------------------------------------------------------------------ 97 INPUT AND OUTPUT DEFINITIONS 98 99 100 Inputs: 101 speech -- Pointer to Word16 -- speech segment 102 mode -- enum Mode -- coder mode 103 i_subfr -- Word16 -- Subframe nr 104 gain_pit -- Word16 -- Pitch gain Q14 105 gain_code -- Word16 -- Decoded innovation gain 106 Aq -- Pointer to Word16 -- A(z) quantized for the 4 subframes 107 synth -- Word16 Array -- Local synthesis 108 xn -- Word16 Array -- Target vector for pitch search 109 code -- Word16 Array -- Fixed codebook exitation 110 y1 -- Word16 Array -- Filtered adaptive exitation 111 y2 -- Word16 Array -- Filtered fixed codebook excitation 112 mem_syn -- Pointer to Word16 -- memory of synthesis filter 113 114 Outputs: 115 mem_syn -- Pointer to Word16 -- memory of synthesis filter 116 mem_err -- Pointer to Word16 -- pointer to error signal 117 mem_w0 -- Pointer to Word16 -- memory of weighting filter 118 exc -- Pointer to Word16 -- long term prediction residual 119 sharp -- Pointer to Word16 -- pitch sharpening value 120 pOverflow -- Pointer to Flag -- overflow indicator 121 122 Returns: 123 None 124 125 Global Variables Used: 126 None 127 128 Local Variables Needed: 129 None 130 131 ------------------------------------------------------------------------------ 132 FUNCTION DESCRIPTION 133 134 135 ------------------------------------------------------------------------------ 136 REQUIREMENTS 137 138 None 139 140 ------------------------------------------------------------------------------ 141 REFERENCES 142 143 spstproc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 144 145 ------------------------------------------------------------------------------ 146 PSEUDO-CODE 147 148 149 ------------------------------------------------------------------------------ 150 RESOURCES USED [optional] 151 152 When the code is written for a specific target processor the 153 the resources used should be documented below. 154 155 HEAP MEMORY USED: x bytes 156 157 STACK MEMORY USED: x bytes 158 159 CLOCK CYCLES: (cycle count equation for this function) + (variable 160 used to represent cycle count for each subroutine 161 called) 162 where: (cycle count variable) = cycle count for [subroutine 163 name] 164 165 ------------------------------------------------------------------------------ 166 CAUTION [optional] 167 [State any special notes, constraints or cautions for users of this function] 168 169 ------------------------------------------------------------------------------ 170 */ 171 172 void subframePostProc( 173 Word16 *speech, /* i : speech segment */ 174 enum Mode mode, /* i : coder mode */ 175 Word16 i_subfr, /* i : Subframe nr */ 176 Word16 gain_pit, /* i : Pitch gain Q14 */ 177 Word16 gain_code, /* i : Decoded innovation gain */ 178 Word16 *Aq, /* i : A(z) quantized for the 4 subframes */ 179 Word16 synth[], /* i : Local snthesis */ 180 Word16 xn[], /* i : Target vector for pitch search */ 181 Word16 code[], /* i : Fixed codebook exitation */ 182 Word16 y1[], /* i : Filtered adaptive exitation */ 183 Word16 y2[], /* i : Filtered fixed codebook excitation */ 184 Word16 *mem_syn, /* i/o : memory of synthesis filter */ 185 Word16 *mem_err, /* o : pointer to error signal */ 186 Word16 *mem_w0, /* o : memory of weighting filter */ 187 Word16 *exc, /* o : long term prediction residual */ 188 Word16 *sharp, /* o : pitch sharpening value */ 189 Flag *pOverflow /* o : overflow indicator */ 190 ) 191 { 192 Word16 i; 193 Word16 j; 194 Word16 temp; 195 Word32 L_temp; 196 Word32 L_temp2; 197 Word16 tempShift; 198 Word16 kShift; 199 Word16 pitch_fac; 200 Word16 *p_exc; 201 Word16 *p_code; 202 203 OSCL_UNUSED_ARG(pOverflow); 204 205 if (mode != MR122) 206 { 207 tempShift = 1; 208 kShift = 16 - 2 - 1; 209 pitch_fac = gain_pit; 210 } 211 else 212 { 213 tempShift = 2; 214 kShift = 16 - 4 - 1; 215 pitch_fac = gain_pit >> 1; 216 } 217 218 /*------------------------------------------------------------* 219 * - Update pitch sharpening "sharp" with quantized gain_pit * 220 *------------------------------------------------------------*/ 221 222 if (gain_pit < SHARPMAX) 223 { 224 *sharp = gain_pit; 225 } 226 else 227 { 228 *sharp = SHARPMAX; 229 } 230 231 /*------------------------------------------------------* 232 * - Find the total excitation * 233 * - find synthesis speech corresponding to exc[] * 234 * - update filters memories for finding the target * 235 * vector in the next subframe * 236 * (update error[-m..-1] and mem_w_err[]) * 237 *------------------------------------------------------*/ 238 239 p_exc = &exc[ i_subfr]; 240 p_code = &code[0]; 241 242 for (i = L_SUBFR >> 1; i != 0 ; i--) 243 { 244 /* exc[i] = gain_pit*exc[i] + gain_code*code[i]; */ 245 246 /* 247 * 12k2 others 248 * --------------------------------- 249 * exc Q0 Q0 250 * gain_pit Q14 Q14 251 * pitch_fac Q13 Q14 252 * product: Q14 Q15 253 * 254 * code Q12 Q13 255 * gain_code Q1 Q1 256 * product Q14 Q15 257 * sum Q14 Q15 258 * 259 * tempShift 2 1 260 * sum<<tempShift Q16 Q16 261 * result -> exc Q0 Q0 262 */ 263 L_temp = ((Word32) * (p_exc++) * pitch_fac) << 1; 264 L_temp2 = ((Word32) * (p_exc--) * pitch_fac) << 1; 265 L_temp += ((Word32) * (p_code++) * gain_code) << 1; 266 L_temp2 += ((Word32) * (p_code++) * gain_code) << 1; 267 L_temp <<= tempShift; 268 L_temp2 <<= tempShift; 269 *(p_exc++) = (Word16)((L_temp + 0x08000L) >> 16); 270 *(p_exc++) = (Word16)((L_temp2 + 0x08000L) >> 16); 271 272 } 273 274 Syn_filt( 275 Aq, 276 &exc[i_subfr], 277 &synth[i_subfr], 278 L_SUBFR, 279 mem_syn, 280 1); 281 282 for (i = L_SUBFR - M, j = 0; i < L_SUBFR; i++, j++) 283 { 284 mem_err[j] = speech[i_subfr + i] - synth[i_subfr + i]; 285 286 /* 287 * 12k2 others 288 * --------------------------------- 289 * y1 Q0 Q0 290 * gain_pit Q14 Q14 291 * product Q15 Q15 292 * shifted prod. Q16 Q16 293 * temp Q0 Q0 294 * 295 * y2 Q10 Q12 296 * gain_code Q1 Q1 297 * product Q12 Q14 298 * kshift 4 2 299 * shifted prod. Q16 Q16 300 * k Q0 Q0 301 * mem_w0,xn,sum Q0 Q0 302 */ 303 304 L_temp = ((Word32)y1[i] * gain_pit); 305 temp = (Word16)(L_temp >> 14); 306 307 L_temp = ((Word32)y2[i] * gain_code); 308 temp += (Word16)(L_temp >> kShift); 309 310 mem_w0[j] = xn[i] - temp; 311 } 312 313 return; 314 } 315