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 20 Filename: dct64.c 21 22------------------------------------------------------------------------------ 23 REVISION HISTORY 24 25 26 Who: Date: MM/DD/YYYY 27 Description: 28 29------------------------------------------------------------------------------ 30 INPUT AND OUTPUT DEFINITIONS 31 32 Int32 x 32-bit integer input length 64 33 34 35------------------------------------------------------------------------------ 36 FUNCTION DESCRIPTION 37 38 Implement dct of lenght 64 39 40------------------------------------------------------------------------------ 41 REQUIREMENTS 42 43 44------------------------------------------------------------------------------ 45 REFERENCES 46 47------------------------------------------------------------------------------ 48 PSEUDO-CODE 49 50------------------------------------------------------------------------------ 51*/ 52 53 54/*---------------------------------------------------------------------------- 55; INCLUDES 56----------------------------------------------------------------------------*/ 57 58#ifdef AAC_PLUS 59 60 61#include "dct16.h" 62#include "dct64.h" 63 64#include "pv_audio_type_defs.h" 65#include "synthesis_sub_band.h" 66 67#include "fxp_mul32.h" 68 69 70/*---------------------------------------------------------------------------- 71; MACROS 72; Define module specific macros here 73----------------------------------------------------------------------------*/ 74 75 76/*---------------------------------------------------------------------------- 77; DEFINES 78; Include all pre-processor statements here. Include conditional 79; compile variables also. 80----------------------------------------------------------------------------*/ 81 82#define Qfmt(a) (Int32)(a*((Int32)1<<26) + (a>=0?0.5F:-0.5F)) 83#define Qfmt31(a) (Int32)(a*0x7FFFFFFF) 84 85const Int32 CosTable_48[48] = 86{ 87 Qfmt31(0.50015063602065F) , Qfmt31(0.50135845244641F) , 88 Qfmt31(0.50378872568104F) , Qfmt31(0.50747117207256F) , 89 Qfmt31(0.51245147940822F) , Qfmt31(0.51879271310533F) , 90 Qfmt31(0.52657731515427F) , Qfmt31(0.53590981690799F) , 91 Qfmt31(0.54692043798551F) , Qfmt31(0.55976981294708F) , 92 Qfmt31(0.57465518403266F) , Qfmt31(0.59181853585742F) , 93 Qfmt31(0.61155734788251F) , Qfmt31(0.63423893668840F) , 94 Qfmt31(0.66031980781371F) , Qfmt31(0.69037212820021F) , 95 Qfmt31(0.72512052237720F) , Qfmt31(0.76549416497309F) , 96 Qfmt31(0.81270209081449F) , Qfmt31(0.86834471522335F) , 97 Qfmt(0.93458359703641F) , Qfmt(1.01440826499705F) , 98 Qfmt(1.11207162057972F) , Qfmt(1.23383273797657F) , 99 Qfmt(1.38929395863283F) , Qfmt(1.59397228338563F) , 100 Qfmt(1.87467598000841F) , Qfmt(2.28205006800516F) , 101 Qfmt(2.92462842815822F) , Qfmt(4.08461107812925F) , 102 Qfmt(6.79675071167363F) , Qfmt(20.37387816723145F) , /* 32 */ 103 Qfmt(0.50060299823520F) , Qfmt(0.50547095989754F) , 104 Qfmt(0.51544730992262F) , Qfmt(0.53104259108978F) , 105 Qfmt(0.55310389603444F) , Qfmt(0.58293496820613F) , 106 Qfmt(0.62250412303566F) , Qfmt(0.67480834145501F) , 107 Qfmt(0.74453627100230F) , Qfmt(0.83934964541553F) , 108 Qfmt(0.97256823786196F) , Qfmt(1.16943993343288F) , 109 Qfmt(1.48416461631417F) , Qfmt(2.05778100995341F) , 110 Qfmt(3.40760841846872F) , Qfmt(10.19000812354803F) 111}; 112 113 114 115 116/*---------------------------------------------------------------------------- 117; LOCAL FUNCTION DEFINITIONS 118; Function Prototype declaration 119----------------------------------------------------------------------------*/ 120 121/*---------------------------------------------------------------------------- 122; LOCAL STORE/BUFFER/POINTER DEFINITIONS 123; Variable declaration - defined here and used outside this module 124----------------------------------------------------------------------------*/ 125 126/*---------------------------------------------------------------------------- 127; EXTERNAL FUNCTION REFERENCES 128; Declare functions defined elsewhere and referenced in this module 129----------------------------------------------------------------------------*/ 130 131/*---------------------------------------------------------------------------- 132; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 133; Declare variables used in this module but defined elsewhere 134----------------------------------------------------------------------------*/ 135 136/*---------------------------------------------------------------------------- 137; FUNCTION CODE 138----------------------------------------------------------------------------*/ 139 140/*---------------------------------------------------------------------------- 141; dct_64 142----------------------------------------------------------------------------*/ 143 144void pv_split_LC(Int32 *vector, 145 Int32 *temp_o) 146{ 147 148 Int32 i; 149 Int32 *pt_vector = &vector[0]; 150 Int32 *pt_vector_N_1 = &vector[31]; 151 const Int32 *pt_cosTerms = &CosTable_48[32]; 152 Int32 *pt_temp_o = temp_o; 153 Int32 tmp1; 154 Int32 tmp2; 155 Int32 tmp3; 156 157 158 tmp1 = *(pt_vector); 159 tmp2 = *(pt_vector_N_1--); 160 for (i = 16; i != 0; i--) 161 { 162 tmp3 = *(pt_cosTerms++); 163 *(pt_vector++) = tmp1 + tmp2; 164 *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), tmp3); 165 tmp1 = *(pt_vector); 166 tmp2 = *(pt_vector_N_1--); 167 } 168 169} 170 171 172#ifdef HQ_SBR 173 174 175void dct_64(Int32 vec[], Int32 *scratch_mem) 176{ 177 Int32 *temp_e1; 178 Int32 *temp_o1; 179 180 Int32 *pt_vec; 181 182 Int i; 183 184 Int32 aux1; 185 Int32 aux2; 186 Int32 aux3; 187 Int32 aux4; 188 189 const Int32 *cosTerms = &CosTable_48[31]; 190 191 temp_o1 = &vec[32]; 192 temp_e1 = temp_o1 - 1; 193 194 195 for (i = 6; i != 0; i--) 196 { 197 aux1 = *(temp_e1); 198 aux2 = *(temp_o1); 199 aux3 = *(cosTerms--); 200 *(temp_e1--) = aux1 + aux2; 201 *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3); 202 aux1 = *(temp_e1); 203 aux2 = *(temp_o1); 204 aux3 = *(cosTerms--); 205 *(temp_e1--) = aux1 + aux2; 206 *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3); 207 } 208 209 210 for (i = 10; i != 0; i--) 211 { 212 aux1 = *(temp_e1); 213 aux2 = *(temp_o1); 214 aux3 = *(cosTerms--); 215 *(temp_e1--) = aux1 + aux2; 216 *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1; 217 aux1 = *(temp_e1); 218 aux2 = *(temp_o1); 219 aux3 = *(cosTerms--); 220 *(temp_e1--) = aux1 + aux2; 221 *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1; 222 } 223 224 225 pv_split(&vec[16]); 226 227 dct_16(&vec[16], 0); 228 dct_16(vec, 1); // Even terms 229 230 pv_merge_in_place_N32(vec); 231 232 pv_split_z(&vec[32]); 233 234 dct_16(&vec[32], 1); // Even terms 235 dct_16(&vec[48], 0); 236 237 pv_merge_in_place_N32(&vec[32]); 238 239 240 241 aux1 = vec[32]; 242 aux3 = vec[33]; 243 aux4 = vec[ 1]; /* vec[ 1] */ 244 245 /* -----------------------------------*/ 246 aux1 = vec[32] + vec[33]; 247 vec[ 0] += aux1; 248 vec[ 1] += aux1; 249 250 aux1 = vec[34]; 251 aux2 = vec[ 2]; /* vec[ 2] */ 252 aux3 += aux1; 253 vec[ 2] = aux4 + aux3; 254 aux4 = vec[ 3]; /* vec[ 3] */ 255 vec[ 3] = aux2 + aux3; 256 257 aux3 = vec[35]; 258 259 /* -----------------------------------*/ 260 aux1 += aux3; 261 vec[32] = vec[ 4]; 262 vec[33] = vec[ 5]; 263 vec[ 4] = aux2 + aux1; 264 vec[ 5] = aux4 + aux1; 265 266 aux1 = vec[36]; 267 aux2 = vec[32]; /* vec[ 4] */ 268 aux3 += aux1; 269 vec[34] = vec[ 6]; 270 vec[35] = vec[ 7]; 271 vec[ 6] = aux4 + aux3; 272 vec[ 7] = aux2 + aux3; 273 274 aux3 = vec[37]; 275 aux4 = vec[33]; /* vec[ 5] */ 276 277 /* -----------------------------------*/ 278 aux1 += aux3; 279 vec[32] = vec[ 8]; 280 vec[33] = vec[ 9]; 281 vec[ 8] = aux2 + aux1; 282 vec[ 9] = aux4 + aux1; 283 284 aux1 = vec[38]; 285 aux2 = vec[34]; /* vec[ 6] */ 286 aux3 += aux1; 287 vec[34] = vec[10]; 288 vec[10] = aux4 + aux3; 289 aux4 = vec[35]; /* vec[ 7] */ 290 vec[35] = vec[11]; 291 vec[11] = aux2 + aux3; 292 293 aux3 = vec[39]; 294 295 /* -----------------------------------*/ 296 aux1 += aux3; 297 vec[36] = vec[12]; 298 vec[37] = vec[13]; 299 vec[12] = aux2 + aux1; 300 vec[13] = aux4 + aux1; 301 302 aux1 = vec[40]; 303 aux2 = vec[32]; /* vec[ 8] */ 304 aux3 += aux1; 305 vec[32] = vec[14]; 306 vec[14] = aux4 + aux3; 307 aux4 = vec[33]; /* vec[ 9] */ 308 vec[33] = vec[15]; 309 vec[15] = aux2 + aux3; 310 311 aux3 = vec[41]; 312 313 /* -----------------------------------*/ 314 aux1 += aux3; 315 vec[38] = vec[16]; 316 vec[39] = vec[17]; 317 vec[16] = aux2 + aux1; 318 vec[17] = aux4 + aux1; 319 320 aux1 = vec[42]; 321 aux2 = vec[34]; /* vec[10] */ 322 aux3 += aux1; 323 vec[34] = vec[18]; 324 vec[18] = aux4 + aux3; 325 aux4 = vec[35]; /* vec[11] */ 326 vec[35] = vec[19]; 327 vec[19] = aux2 + aux3; 328 329 aux3 = vec[43]; 330 331 /* -----------------------------------*/ 332 aux1 += aux3; 333 vec[40] = vec[20]; 334 vec[41] = vec[21]; 335 vec[20] = aux2 + aux1; 336 vec[21] = aux4 + aux1; 337 338 aux1 = vec[44]; 339 aux2 = vec[36]; /* vec[12] */ 340 aux3 += aux1; 341 vec[42] = vec[22]; 342 vec[43] = vec[23]; 343 vec[22] = aux4 + aux3; 344 vec[23] = aux2 + aux3; 345 346 aux3 = vec[45]; 347 aux4 = vec[37]; /* vec[13] */ 348 349 /* -----------------------------------*/ 350 351 352 scratch_mem[0] = vec[24]; 353 scratch_mem[1] = vec[25]; 354 aux1 += aux3; 355 vec[24] = aux2 + aux1; 356 vec[25] = aux4 + aux1; 357 358 aux1 = vec[46]; 359 aux2 = vec[32]; /* vec[14] */ 360 scratch_mem[2] = vec[26]; 361 scratch_mem[3] = vec[27]; 362 aux3 += aux1; 363 vec[26] = aux4 + aux3; 364 vec[27] = aux2 + aux3; 365 366 aux3 = vec[47]; 367 aux4 = vec[33]; /* vec[15] */ 368 369 /* -----------------------------------*/ 370 scratch_mem[4] = vec[28]; 371 scratch_mem[5] = vec[29]; 372 aux1 += aux3; 373 vec[28] = aux2 + aux1; 374 vec[29] = aux4 + aux1; 375 376 aux1 = vec[48]; 377 aux2 = vec[38]; /* vec[16] */ 378 scratch_mem[6] = vec[30]; 379 scratch_mem[7] = vec[31]; 380 aux3 += aux1; 381 vec[30] = aux4 + aux3; 382 vec[31] = aux2 + aux3; 383 384 aux3 = vec[49]; 385 aux4 = vec[39]; /* vec[17] */ 386 387 /* -----------------------------------*/ 388 aux1 += aux3; 389 vec[32] = aux2 + aux1; 390 vec[33] = aux4 + aux1; 391 392 aux1 = vec[50]; 393 aux2 = vec[34]; /* vec[18] */ 394 aux3 += aux1; 395 vec[34] = aux4 + aux3; 396 aux4 = vec[35]; /* vec[19] */ 397 vec[35] = aux2 + aux3; 398 399 aux3 = vec[51]; 400 401 402 /* -----------------------------------*/ 403 aux1 += aux3; 404 vec[36] = aux2 + aux1; 405 vec[37] = aux4 + aux1; 406 407 aux1 = vec[52]; 408 aux2 = vec[40]; /* vec[20] */ 409 aux3 += aux1; 410 vec[38] = aux4 + aux3; 411 vec[39] = aux2 + aux3; 412 413 aux3 = vec[53]; 414 aux4 = vec[41]; /* vec[21] */ 415 416 /* -----------------------------------*/ 417 aux1 += aux3; 418 vec[40] = aux2 + aux1; 419 vec[41] = aux4 + aux1; 420 421 aux1 = vec[54]; 422 aux2 = vec[42]; /* vec[22] */ 423 aux3 += aux1; 424 vec[42] = aux4 + aux3; 425 aux4 = vec[43]; /* vec[23] */ 426 vec[43] = aux2 + aux3; 427 428 aux3 = vec[55]; 429 430 /* -----------------------------------*/ 431 432 pt_vec = &vec[44]; 433 temp_o1 = &vec[56]; 434 temp_e1 = &scratch_mem[0]; 435 436 for (i = 4; i != 0; i--) 437 { 438 aux1 += aux3; 439 *(pt_vec++) = aux2 + aux1; 440 *(pt_vec++) = aux4 + aux1; 441 442 aux1 = *(temp_o1++); 443 aux3 += aux1; 444 aux2 = *(temp_e1++); 445 *(pt_vec++) = aux4 + aux3; 446 *(pt_vec++) = aux2 + aux3; 447 448 aux3 = *(temp_o1++); 449 aux4 = *(temp_e1++); 450 } 451 452 aux1 += aux3; 453 vec[60] = aux2 + aux1; 454 vec[61] = aux4 + aux1; 455 vec[62] = aux4 + aux3; 456 457} 458 459 460#endif 461 462/*---------------------------------------------------------------------------- 463; pv_split 464----------------------------------------------------------------------------*/ 465 466 467void pv_split(Int32 *temp_o) 468{ 469 470 Int32 i; 471 const Int32 *pt_cosTerms = &CosTable_48[47]; 472 Int32 *pt_temp_o = temp_o; 473 Int32 *pt_temp_e = pt_temp_o - 1; 474 Int32 tmp1; 475 Int32 tmp2; 476 Int32 cosx; 477 478 for (i = 8; i != 0; i--) 479 { 480 tmp2 = *(pt_temp_o); 481 tmp1 = *(pt_temp_e); 482 cosx = *(pt_cosTerms--); 483 *(pt_temp_e--) = tmp1 + tmp2; 484 *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx); 485 tmp1 = *(pt_temp_e); 486 tmp2 = *(pt_temp_o); 487 cosx = *(pt_cosTerms--); 488 *(pt_temp_e--) = tmp1 + tmp2; 489 *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx); 490 } 491} 492 493 494 495void pv_split_z(Int32 *vector) 496{ 497 Int32 i; 498 Int32 *pt_vector = &vector[31]; 499 const Int32 *pt_cosTerms = &CosTable_48[32]; 500 Int32 *pt_temp_e = vector; 501 Int32 tmp1; 502 Int32 tmp2; 503 Int32 cosx; 504 505 for (i = 8; i != 0; i--) 506 { 507 tmp1 = *(pt_vector); 508 tmp2 = *(pt_temp_e); 509 cosx = *(pt_cosTerms++); 510 *(pt_temp_e++) = tmp1 + tmp2; 511 *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx); 512 tmp2 = *(pt_temp_e); 513 tmp1 = *(pt_vector); 514 cosx = *(pt_cosTerms++); 515 *(pt_temp_e++) = tmp1 + tmp2; 516 *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx); 517 } 518} 519 520 521void pv_merge_in_place_N32(Int32 vec[]) 522{ 523 524 Int32 temp[4]; 525 526 temp[0] = vec[14]; 527 vec[14] = vec[ 7]; 528 temp[1] = vec[12]; 529 vec[12] = vec[ 6]; 530 temp[2] = vec[10]; 531 vec[10] = vec[ 5]; 532 temp[3] = vec[ 8]; 533 vec[ 8] = vec[ 4]; 534 vec[ 6] = vec[ 3]; 535 vec[ 4] = vec[ 2]; 536 vec[ 2] = vec[ 1]; 537 538 vec[ 1] = vec[16] + vec[17]; 539 vec[16] = temp[3]; 540 vec[ 3] = vec[18] + vec[17]; 541 vec[ 5] = vec[19] + vec[18]; 542 vec[18] = vec[9]; 543 temp[3] = vec[11]; 544 545 vec[ 7] = vec[20] + vec[19]; 546 vec[ 9] = vec[21] + vec[20]; 547 vec[20] = temp[2]; 548 temp[2] = vec[13]; 549 vec[11] = vec[22] + vec[21]; 550 vec[13] = vec[23] + vec[22]; 551 vec[22] = temp[3]; 552 temp[3] = vec[15]; 553 vec[15] = vec[24] + vec[23]; 554 vec[17] = vec[25] + vec[24]; 555 vec[19] = vec[26] + vec[25]; 556 vec[21] = vec[27] + vec[26]; 557 vec[23] = vec[28] + vec[27]; 558 vec[25] = vec[29] + vec[28]; 559 vec[27] = vec[30] + vec[29]; 560 vec[29] = vec[30] + vec[31]; 561 vec[24] = temp[1]; 562 vec[26] = temp[2]; 563 vec[28] = temp[0]; 564 vec[30] = temp[3]; 565} 566 567#endif 568 569 570