Home | History | Annotate | Download | only in aacdec
      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