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: synthesis_sub_band.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 vec[], Input vector, 32-bit 33 const Int32 *cosTerms, Cosine Terms 34 Int32 *scratch_mem Scratch memory 35 36 37 ------------------------------------------------------------------------------ 38 FUNCTION DESCRIPTION 39 40 Implement root squared of a number 41 42 ------------------------------------------------------------------------------ 43 REQUIREMENTS 44 45 46 ------------------------------------------------------------------------------ 47 REFERENCES 48 49 ------------------------------------------------------------------------------ 50 PSEUDO-CODE 51 52 ------------------------------------------------------------------------------ 53 */ 54 55 56 /*---------------------------------------------------------------------------- 57 ; INCLUDES 58 ----------------------------------------------------------------------------*/ 59 60 #ifdef AAC_PLUS 61 62 63 #include "pv_audio_type_defs.h" 64 #include "fxp_mul32.h" 65 #include "dct64.h" 66 #include "synthesis_sub_band.h" 67 #include "mdst.h" 68 #include "dct16.h" 69 70 71 /*---------------------------------------------------------------------------- 72 ; MACROS 73 ; Define module specific macros here 74 ----------------------------------------------------------------------------*/ 75 76 77 /*---------------------------------------------------------------------------- 78 ; DEFINES 79 ; Include all pre-processor statements here. Include conditional 80 ; compile variables also. 81 ----------------------------------------------------------------------------*/ 82 83 #define Qfmt_30(x) (Int32)(x*((Int32)(1<<30)) + (x>=0?0.5F:-0.5F)) 84 #define Qfmt_25(x) (Int32)(x*((Int32)(1<<25))*(1.5625F) + (x>=0?0.5F:-0.5F)) 85 86 #define SCALE_DOWN_LP Qfmt_30(0.075000F) /* 3/40 */ 87 #define SCALE_DOWN_HQ Qfmt_30(0.009375F*0.64F) /* 3/40 * 1/8 */ 88 89 /*---------------------------------------------------------------------------- 90 ; LOCAL FUNCTION DEFINITIONS 91 ; Function Prototype declaration 92 ----------------------------------------------------------------------------*/ 93 94 /*---------------------------------------------------------------------------- 95 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 96 ; Variable declaration - defined here and used outside this module 97 ----------------------------------------------------------------------------*/ 98 99 const Int32 CosTable_64[64] = 100 { 101 Qfmt_25(0.50003765191555F), Qfmt_25(40.74468810335183F), Qfmt_25(0.50033903744282F), Qfmt_25(13.58429025728446F), 102 Qfmt_25(0.50094271763809F), Qfmt_25(8.15384860246681F), Qfmt_25(0.50185051748424F), Qfmt_25(5.82768837784465F), 103 Qfmt_25(0.50306519130137F), Qfmt_25(4.53629093696936F), Qfmt_25(0.50459044322165F), Qfmt_25(3.71524273832697F), 104 Qfmt_25(0.50643095492855F), Qfmt_25(3.14746219178191F), Qfmt_25(0.50859242104981F), Qfmt_25(2.73164502877394F), 105 Qfmt_25(0.51108159270668F), Qfmt_25(2.41416000025008F), Qfmt_25(0.51390632984754F), Qfmt_25(2.16395781875198F), 106 Qfmt_25(0.51707566313349F), Qfmt_25(1.96181784857117F), Qfmt_25(0.52059986630189F), Qfmt_25(1.79520521907789F), 107 Qfmt_25(0.52449054011472F), Qfmt_25(1.65559652426412F), Qfmt_25(0.52876070920749F), Qfmt_25(1.53699410085250F), 108 Qfmt_25(0.53342493339713F), Qfmt_25(1.43505508844143F), Qfmt_25(0.53849943529198F), Qfmt_25(1.34655762820629F), 109 Qfmt_25(0.54400224638178F), Qfmt_25(1.26906117169912F), Qfmt_25(0.54995337418324F), Qfmt_25(1.20068325572942F), 110 Qfmt_25(0.55637499348989F), Qfmt_25(1.13994867510150F), Qfmt_25(0.56329166534170F), Qfmt_25(1.08568506425801F), 111 Qfmt_25(0.57073058801215F), Qfmt_25(1.03694904091039F), Qfmt_25(0.57872188513482F), Qfmt_25(0.99297296126755F), 112 Qfmt_25(0.58729893709379F), Qfmt_25(0.95312587439212F), Qfmt_25(0.59649876302446F), Qfmt_25(0.91688444618465F), 113 Qfmt_25(0.60636246227215F), Qfmt_25(0.88381100455962F), Qfmt_25(0.61693572600507F), Qfmt_25(0.85353675100661F), 114 Qfmt_25(0.62826943197077F), Qfmt_25(0.82574877386279F), Qfmt_25(0.64042033824166F), Qfmt_25(0.80017989562169F), 115 Qfmt_25(0.65345189537513F), Qfmt_25(0.77660065823396F), Qfmt_25(0.66743520092634F), Qfmt_25(0.75481293911653F), 116 Qfmt_25(0.68245012597642F), Qfmt_25(0.73464482364786F), Qfmt_25(0.69858665064723F), Qfmt_25(0.71594645497057F), 117 }; 118 119 120 /*---------------------------------------------------------------------------- 121 ; EXTERNAL FUNCTION REFERENCES 122 ; Declare functions defined elsewhere and referenced in this module 123 ----------------------------------------------------------------------------*/ 124 125 /*---------------------------------------------------------------------------- 126 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 127 ; Declare variables used in this module but defined elsewhere 128 ----------------------------------------------------------------------------*/ 129 130 /*---------------------------------------------------------------------------- 131 ; FUNCTION CODE 132 ----------------------------------------------------------------------------*/ 133 134 135 136 void synthesis_sub_band_LC(Int32 Sr[], Int16 data[]) 137 { 138 139 Int32 *temp_o1 = (Int32 *) & data[0]; 140 141 Int i; 142 Int32 *pt_temp_e; 143 Int32 *pt_temp_o = temp_o1; 144 Int32 *pt_temp_x = &Sr[63]; 145 Int32 temp1; 146 Int32 temp2; 147 Int32 temp3; 148 Int32 temp11; 149 150 Int16 *pt_data_1; 151 Int16 *pt_data_2; 152 153 Int32 *pt_Sr_1 = Sr; 154 Int16 tmp1; 155 Int16 tmp2; 156 Int16 tmp11; 157 Int16 tmp22; 158 const Int32 *pt_cosTerms = CosTable_48; 159 160 161 temp2 = *(pt_temp_x--); 162 for (i = 20; i != 0; i--) 163 { 164 temp1 = *(pt_Sr_1); 165 temp3 = *(pt_cosTerms++); 166 *(pt_Sr_1++) = temp1 + temp2; 167 *(pt_temp_o++) = fxp_mul32_Q31((temp1 - temp2), temp3) << 1; 168 temp2 = *(pt_temp_x--); 169 } 170 171 for (i = 12; i != 0; i--) 172 { 173 temp1 = *(pt_Sr_1); 174 temp3 = *(pt_cosTerms++); 175 *(pt_Sr_1++) = temp1 + temp2; 176 *(pt_temp_o++) = fxp_mul32_Q26((temp1 - temp2), temp3); 177 temp2 = *(pt_temp_x--); 178 } 179 180 181 pv_split_LC(temp_o1, &Sr[32]); 182 183 dct_16(temp_o1, 1); // Even terms 184 dct_16(&Sr[32], 1); // Odd terms 185 186 /* merge */ 187 188 189 pt_Sr_1 = &temp_o1[31]; 190 pt_temp_e = &temp_o1[15]; 191 pt_temp_o = &Sr[47]; 192 193 temp1 = *(pt_temp_o--); 194 *(pt_Sr_1--) = temp1; 195 for (i = 5; i != 0; i--) 196 { 197 temp2 = *(pt_temp_o--); 198 *(pt_Sr_1--) = *(pt_temp_e--); 199 *(pt_Sr_1--) = temp1 + temp2; 200 temp3 = *(pt_temp_o--); 201 *(pt_Sr_1--) = *(pt_temp_e--); 202 *(pt_Sr_1--) = temp2 + temp3; 203 temp1 = *(pt_temp_o--); 204 *(pt_Sr_1--) = *(pt_temp_e--); 205 *(pt_Sr_1--) = temp1 + temp3; 206 } 207 208 209 pv_split_LC(Sr, &Sr[32]); 210 211 dct_16(Sr, 1); // Even terms 212 dct_16(&Sr[32], 1); // Odd terms 213 214 215 pt_temp_x = &temp_o1[31]; 216 pt_temp_e = &Sr[15]; 217 pt_temp_o = &Sr[47]; 218 219 pt_data_1 = &data[95]; 220 221 temp2 = *(pt_temp_x--); 222 temp11 = *(pt_temp_x--); 223 temp1 = *(pt_temp_o--); 224 225 *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp2, SCALE_DOWN_LP); 226 *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp1, SCALE_DOWN_LP); 227 228 for (i = 5; i != 0; i--) 229 { 230 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP); 231 temp3 = *(pt_temp_x--); 232 *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP); 233 temp2 = *(pt_temp_o--); 234 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP); 235 temp11 = *(pt_temp_x--); 236 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp2), SCALE_DOWN_LP); 237 238 239 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP); 240 temp1 = *(pt_temp_x--); 241 *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP); 242 temp3 = *(pt_temp_o--); 243 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP); 244 temp11 = *(pt_temp_x--); 245 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp2 + temp3), SCALE_DOWN_LP); 246 247 248 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP); 249 temp2 = *(pt_temp_x--); 250 *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP); 251 temp1 = *(pt_temp_o--); 252 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP); 253 temp11 = *(pt_temp_x--); 254 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp3), SCALE_DOWN_LP); 255 } 256 257 *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP); 258 *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e), SCALE_DOWN_LP); 259 260 /* ---- merge ends---- */ 261 262 263 pt_data_1 = &data[95]; 264 pt_data_2 = &data[96]; 265 266 *(pt_data_2++) = 0; 267 tmp1 = *(pt_data_1--); 268 tmp2 = *(pt_data_1--); 269 tmp11 = *(pt_data_1--); 270 tmp22 = *(pt_data_1--); 271 272 for (i = 7; i != 0; i--) 273 { 274 *(pt_data_2++) = (-tmp1); 275 *(pt_data_2++) = (-tmp2); 276 *(pt_data_2++) = (-tmp11); 277 *(pt_data_2++) = (-tmp22); 278 tmp1 = *(pt_data_1--); 279 tmp2 = *(pt_data_1--); 280 tmp11 = *(pt_data_1--); 281 tmp22 = *(pt_data_1--); 282 } 283 284 285 *(pt_data_2++) = (-tmp1); 286 *(pt_data_2++) = (-tmp2); 287 *(pt_data_2++) = (-tmp11); 288 289 pt_data_2 = &data[0]; 290 291 *(pt_data_2++) = tmp22; 292 tmp1 = *(pt_data_1--); 293 tmp2 = *(pt_data_1--); 294 tmp11 = *(pt_data_1--); 295 tmp22 = *(pt_data_1--); 296 297 for (i = 7; i != 0; i--) 298 { 299 *(pt_data_2++) = tmp1; 300 *(pt_data_2++) = tmp2; 301 *(pt_data_2++) = tmp11; 302 *(pt_data_2++) = tmp22; 303 tmp1 = *(pt_data_1--); 304 tmp2 = *(pt_data_1--); 305 tmp11 = *(pt_data_1--); 306 tmp22 = *(pt_data_1--); 307 } 308 309 *(pt_data_2++) = tmp1; 310 *(pt_data_2++) = tmp2; 311 *(pt_data_2++) = tmp11; 312 *(pt_data_2) = tmp22; 313 314 } 315 316 317 void synthesis_sub_band_LC_down_sampled(Int32 Sr[], Int16 data[]) 318 { 319 320 Int i ; 321 Int16 *pt_data_1; 322 323 pt_data_1 = &data[0]; 324 325 dct_32(Sr); 326 327 for (i = 0; i < 16; i++) 328 { 329 pt_data_1[ i] = (Int16)(Sr[16-i] >> 5); 330 pt_data_1[16+i] = (Int16)(Sr[i] >> 5); 331 pt_data_1[32+i] = (Int16)(Sr[16+i] >> 5); 332 } 333 for (i = 0; i < 15; i++) 334 { 335 pt_data_1[49+i] = (Int16)(-Sr[31-i] >> 5); 336 } 337 pt_data_1[48] = 0; 338 } 339 340 341 #ifdef HQ_SBR 342 343 void synthesis_sub_band(Int32 Sr[], Int32 Si[], Int16 data[]) 344 { 345 346 347 Int32 i ; 348 Int16 *pt_data_1; 349 Int16 *pt_data_2; 350 Int32 *pt_Sr_1; 351 Int32 *pt_Sr_2; 352 Int32 *pt_Si_1; 353 Int32 *pt_Si_2; 354 355 Int32 tmp1; 356 Int32 tmp2; 357 Int32 tmp3; 358 Int32 tmp4; 359 360 Int32 cosx; 361 const Int32 *pt_CosTable = CosTable_64; 362 363 364 pt_Sr_1 = &Sr[0]; 365 pt_Sr_2 = &Sr[63]; 366 367 pt_Si_1 = &Si[0]; 368 pt_Si_2 = &Si[63]; 369 370 371 tmp3 = *pt_Sr_1; 372 373 for (i = 32; i != 0; i--) 374 { 375 tmp4 = *pt_Si_2; 376 cosx = *(pt_CosTable++); 377 *(pt_Sr_1++) = fxp_mul32_Q31(tmp3, cosx); 378 tmp3 = *pt_Si_1; 379 *(pt_Si_1++) = fxp_mul32_Q31(tmp4, cosx); 380 tmp4 = *pt_Sr_2; 381 cosx = *(pt_CosTable++); 382 *(pt_Si_2--) = fxp_mul32_Q31(tmp3, cosx); 383 *(pt_Sr_2--) = fxp_mul32_Q31(tmp4, cosx); 384 tmp3 = *pt_Sr_1; 385 } 386 387 388 dct_64(Sr, (Int32 *)data); 389 dct_64(Si, (Int32 *)data); 390 391 392 pt_data_1 = &data[0]; 393 pt_data_2 = &data[127]; 394 395 pt_Sr_1 = &Sr[0]; 396 pt_Si_1 = &Si[0]; 397 398 tmp1 = *(pt_Sr_1++); 399 tmp3 = *(pt_Sr_1++); 400 tmp2 = *(pt_Si_1++); 401 tmp4 = *(pt_Si_1++); 402 403 for (i = 32; i != 0; i--) 404 { 405 *(pt_data_1++) = (Int16) fxp_mul32_Q31((tmp2 - tmp1), SCALE_DOWN_HQ); 406 *(pt_data_1++) = (Int16) fxp_mul32_Q31(-(tmp3 + tmp4), SCALE_DOWN_HQ); 407 *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp1 + tmp2), SCALE_DOWN_HQ); 408 *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp3 - tmp4), SCALE_DOWN_HQ); 409 410 tmp1 = *(pt_Sr_1++); 411 tmp3 = *(pt_Sr_1++); 412 tmp2 = *(pt_Si_1++); 413 tmp4 = *(pt_Si_1++); 414 } 415 416 } 417 418 419 const Int32 exp_m0_25_phi[32] = 420 { 421 422 0x7FFEFE6E, 0x7FEAFB4A, 0x7FC2F827, 0x7F87F505, 423 0x7F38F1E4, 0x7ED6EEC6, 0x7E60EBAB, 0x7DD6E892, 424 0x7D3AE57D, 0x7C89E26D, 0x7BC6DF61, 0x7AEFDC59, 425 0x7A06D958, 0x790AD65C, 0x77FBD367, 0x76D9D079, 426 0x75A6CD92, 0x7460CAB2, 0x7308C7DB, 0x719EC50D, 427 0x7023C248, 0x6E97BF8C, 0x6CF9BCDA, 0x6B4BBA33, 428 0x698CB796, 0x67BDB505, 0x65DEB27F, 0x63EFB005, 429 0x61F1AD97, 0x5FE4AB36, 0x5DC8A8E2, 0x5B9DA69C 430 }; 431 432 void synthesis_sub_band_down_sampled(Int32 Sr[], Int32 Si[], Int16 data[]) 433 { 434 435 Int16 k; 436 Int16 *pt_data_1; 437 Int32 exp_m0_25; 438 const Int32 *pt_exp = exp_m0_25_phi; 439 440 Int32 *XX = Sr; 441 Int32 *YY = (Int32 *)data; 442 Int32 tmp1; 443 Int32 tmp2; 444 445 for (k = 0; k < 32; k++) 446 { 447 exp_m0_25 = *(pt_exp++); 448 tmp1 = Sr[k]; 449 tmp2 = Si[k]; 450 XX[k] = cmplx_mul32_by_16(-tmp1, tmp2, exp_m0_25); 451 YY[31-k] = cmplx_mul32_by_16(tmp2, tmp1, exp_m0_25); 452 } 453 454 mdct_32(XX); 455 mdct_32(YY); 456 457 for (k = 0; k < 32; k++) 458 { 459 Si[k] = YY[k]; 460 } 461 462 pt_data_1 = data; 463 464 for (k = 0; k < 16; k++) 465 { 466 *(pt_data_1++) = (Int16)((XX[2*k ] + Si[2*k ]) >> 14); 467 *(pt_data_1++) = (Int16)((XX[2*k+1] - Si[2*k+1]) >> 14); 468 } 469 470 for (k = 15; k > -1; k--) 471 { 472 *(pt_data_1++) = (Int16)(-(XX[2*k+1] + Si[2*k+1]) >> 14); 473 *(pt_data_1++) = (Int16)(-(XX[2*k ] - Si[2*k ]) >> 14); 474 } 475 476 } 477 478 479 #endif /* HQ_SBR */ 480 481 #endif /* AAC_PLUS */ 482 483 484