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/cbsearch.c 35 Functions: D_plsf_3 36 37 Date: 01/31/2002 38 39 ------------------------------------------------------------------------------ 40 REVISION HISTORY 41 42 Description: 43 (1) Removed "count.h" and "basic_op.h" and replaced with individual include 44 files (add.h, sub.h, etc.) 45 (2) Added pOverflow parameter to code_10i40_35bits() 46 47 Description: Replaced "int" and/or "char" with OSCL defined types. 48 49 Description: 50 51 ------------------------------------------------------------------------------ 52 INPUT AND OUTPUT DEFINITIONS 53 54 Inputs: 55 x[] -- array of type Word16 -- target vector, Q0 56 h[] -- array of type Word16 -- impulse response of weighted synthesis 57 filter h[-L_subfr..-1] must be set to 58 zero. Q12 59 T0 -- Word16 -- Pitch lag 60 pitch_sharp -- Word16 -- Last quantized pitch gain, Q14 61 gain_pit -- Word16 gain_pit -- Pitch gain, Q14 62 res2[] -- array of type Word16 -- Long term prediction residual, Q0 63 mode -- enum Mode -- coder mode 64 subNr -- Word16 -- subframe number 65 66 Outputs: 67 code[] -- array of type Word16 -- Innovative codebook, Q13 68 y[] -- array of type Word16 -- filtered fixed codebook excitation 69 Q12 70 71 anap -- Double pointer to Word16 -- Signs of the pulses 72 73 74 pOverflow -- pointer to Flag -- Flag set when overflow occurs 75 76 Returns: 77 Zero 78 79 Global Variables Used: 80 None 81 82 Local Variables Needed: 83 None 84 85 ------------------------------------------------------------------------------ 86 FUNCTION DESCRIPTION 87 88 Purpose : Inovative codebook search (find index and gain) 89 90 ------------------------------------------------------------------------------ 91 REQUIREMENTS 92 93 94 95 ------------------------------------------------------------------------------ 96 REFERENCES 97 98 cbsearch.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 99 100 ------------------------------------------------------------------------------ 101 PSEUDO-CODE 102 103 104 105 ------------------------------------------------------------------------------ 106 RESOURCES USED 107 When the code is written for a specific target processor the 108 the resources used should be documented below. 109 110 STACK USAGE: [stack count for this module] + [variable to represent 111 stack usage for each subroutine called] 112 113 where: [stack usage variable] = stack usage for [subroutine 114 name] (see [filename].ext) 115 116 DATA MEMORY USED: x words 117 118 PROGRAM MEMORY USED: x words 119 120 CLOCK CYCLES: [cycle count equation for this module] + [variable 121 used to represent cycle count for each subroutine 122 called] 123 124 where: [cycle count variable] = cycle count for [subroutine 125 name] (see [filename].ext) 126 127 ------------------------------------------------------------------------------ 128 */ 129 130 131 /*---------------------------------------------------------------------------- 132 ; INCLUDES 133 ----------------------------------------------------------------------------*/ 134 #include "cbsearch.h" 135 136 #include "typedef.h" 137 #include "c2_9pf.h" 138 #include "c2_11pf.h" 139 #include "c3_14pf.h" 140 #include "c4_17pf.h" 141 #include "c8_31pf.h" 142 #include "c1035pf.h" 143 #include "mode.h" 144 #include "basic_op.h" 145 #include "cnst.h" 146 147 /*---------------------------------------------------------------------------- 148 ; MACROS 149 ; Define module specific macros here 150 ----------------------------------------------------------------------------*/ 151 152 153 /*---------------------------------------------------------------------------- 154 ; DEFINES 155 ; Include all pre-processor statements here. Include conditional 156 ; compile variables also. 157 ----------------------------------------------------------------------------*/ 158 159 /*---------------------------------------------------------------------------- 160 ; LOCAL FUNCTION DEFINITIONS 161 ; Function Prototype declaration 162 ----------------------------------------------------------------------------*/ 163 164 165 /*---------------------------------------------------------------------------- 166 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 167 ; Variable declaration - defined here and used outside this module 168 ----------------------------------------------------------------------------*/ 169 170 /*---------------------------------------------------------------------------- 171 ; EXTERNAL FUNCTION REFERENCES 172 ; Declare functions defined elsewhere and referenced in this module 173 ----------------------------------------------------------------------------*/ 174 175 /*---------------------------------------------------------------------------- 176 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 177 ; Declare variables used in this module but defined elsewhere 178 ----------------------------------------------------------------------------*/ 179 180 /*---------------------------------------------------------------------------- 181 ; FUNCTION CODE 182 ----------------------------------------------------------------------------*/ 183 184 void cbsearch(Word16 x[], /* i : target vector, Q0 */ 185 Word16 h[], /* i : impulse response of weighted synthesis*/ 186 /* filter h[-L_subfr..-1] must be set to */ 187 /* zero. Q12 */ 188 Word16 T0, /* i : Pitch lag */ 189 Word16 pitch_sharp,/* i : Last quantized pitch gain, Q14 */ 190 Word16 gain_pit, /* i : Pitch gain, Q14 */ 191 Word16 res2[], /* i : Long term prediction residual, Q0 */ 192 Word16 code[], /* o : Innovative codebook, Q13 */ 193 Word16 y[], /* o : filtered fixed codebook excitation */ 194 /* Q12 */ 195 Word16 **anap, /* o : Signs of the pulses */ 196 enum Mode mode, /* i : coder mode */ 197 Word16 subNr, /* i : subframe number */ 198 Flag *pOverflow) /* o : Flag set when overflow occurs */ 199 { 200 Word16 index; 201 Word16 i; 202 Word16 temp; 203 Word16 pit_sharpTmp; 204 205 /* For MR74, the pre and post CB pitch sharpening is included in the 206 * codebook search routine, while for MR122 is it not. 207 */ 208 209 if ((mode == MR475) || (mode == MR515)) 210 { 211 /* MR475, MR515 */ 212 *(*anap)++ = 213 code_2i40_9bits( 214 subNr, 215 x, 216 h, 217 T0, 218 pitch_sharp, 219 code, 220 y, 221 &index, 222 pOverflow); 223 224 *(*anap)++ = index; /* sign index */ 225 } 226 else if (mode == MR59) 227 { /* MR59 */ 228 *(*anap)++ = 229 code_2i40_11bits( 230 x, 231 h, 232 T0, 233 pitch_sharp, 234 code, 235 y, 236 &index, 237 pOverflow); 238 239 *(*anap)++ = index; /* sign index */ 240 } 241 else if (mode == MR67) 242 { /* MR67 */ 243 *(*anap)++ = 244 code_3i40_14bits( 245 x, 246 h, 247 T0, 248 pitch_sharp, 249 code, 250 y, 251 &index, 252 pOverflow); 253 254 *(*anap)++ = index; /* sign index */ 255 } 256 else if ((mode == MR74) || (mode == MR795)) 257 { /* MR74, MR795 */ 258 *(*anap)++ = 259 code_4i40_17bits( 260 x, 261 h, 262 T0, 263 pitch_sharp, 264 code, 265 y, 266 &index, 267 pOverflow); 268 269 *(*anap)++ = index; /* sign index */ 270 } 271 else if (mode == MR102) 272 { /* MR102 */ 273 /*-------------------------------------------------------------* 274 * - include pitch contribution into impulse resp. h1[] * 275 *-------------------------------------------------------------*/ 276 /* pit_sharpTmp = pit_sharp; */ 277 /* if (pit_sharpTmp > 1.0) pit_sharpTmp = 1.0; */ 278 279 pit_sharpTmp = 280 shl( 281 pitch_sharp, 282 1, 283 pOverflow); 284 285 for (i = T0; i < L_SUBFR; i++) 286 { 287 temp = 288 mult( 289 h[i - T0], 290 pit_sharpTmp, 291 pOverflow); 292 293 h[i] = 294 add( 295 h[i], 296 temp, 297 pOverflow); 298 } 299 300 /*--------------------------------------------------------------* 301 * - Innovative codebook search (find index and gain) * 302 *--------------------------------------------------------------*/ 303 code_8i40_31bits( 304 x, 305 res2, 306 h, 307 code, 308 y, 309 *anap, 310 pOverflow); 311 312 *anap += 7; 313 314 /*-------------------------------------------------------* 315 * - Add the pitch contribution to code[]. * 316 *-------------------------------------------------------*/ 317 for (i = T0; i < L_SUBFR; i++) 318 { 319 temp = 320 mult( 321 code[i - T0], 322 pit_sharpTmp, 323 pOverflow); 324 325 code[i] = 326 add( 327 code[i], 328 temp, 329 pOverflow); 330 } 331 } 332 else 333 { /* MR122 */ 334 /*-------------------------------------------------------------* 335 * - include pitch contribution into impulse resp. h1[] * 336 *-------------------------------------------------------------*/ 337 338 /* pit_sharpTmp = gain_pit; */ 339 /* if (pit_sharpTmp > 1.0) pit_sharpTmp = 1.0; */ 340 341 pit_sharpTmp = shl(gain_pit, 1, pOverflow); 342 343 for (i = T0; i < L_SUBFR; i++) 344 { 345 temp = ((Word32)h[i - T0] * pit_sharpTmp) >> 15; 346 /* 347 mult( 348 h[i - T0], 349 , 350 pOverflow); 351 */ 352 h[i] = 353 add( 354 h[i], 355 temp, 356 pOverflow); 357 } 358 /*--------------------------------------------------------------* 359 * - Innovative codebook search (find index and gain) * 360 *--------------------------------------------------------------*/ 361 362 code_10i40_35bits( 363 x, 364 res2, 365 h, 366 code, 367 y, 368 *anap, 369 pOverflow); 370 371 *anap += 10; 372 373 /*-------------------------------------------------------* 374 * - Add the pitch contribution to code[]. * 375 *-------------------------------------------------------*/ 376 for (i = T0; i < L_SUBFR; i++) 377 { 378 temp = 379 mult( 380 code[i - T0], 381 pit_sharpTmp, 382 pOverflow); 383 384 code[i] = 385 add( 386 code[i], 387 temp, 388 pOverflow); 389 } 390 } 391 392 } 393