Home | History | Annotate | Download | only in src
      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: ps_stereo_processing.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 
     33 
     34 ------------------------------------------------------------------------------
     35  FUNCTION DESCRIPTION
     36 
     37         Stereo Process or reconstruction
     38 
     39            l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
     40 
     41            r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
     42 
     43      _______                                              ________
     44     |       |                                  _______   |        |
     45   ->|Hybrid | LF ----                         |       |->| Hybrid |-->
     46     | Anal. |        |                        |       |  | Synth  |   QMF -> L
     47      -------         o----------------------->|       |   --------    Synth
     48 QMF                  |                s_k(n)  |Stereo |-------------->
     49 Anal.              -------------------------->|       |
     50      _______       | |                        |       |   ________
     51     |       | HF --o |   -----------          |Process|  |        |
     52   ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
     53      -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
     54                    ---->|           |-------->|       |   --------    Synth
     55                          -----------          |_______|-------------->
     56 
     57 
     58 ------------------------------------------------------------------------------
     59  REQUIREMENTS
     60 
     61 
     62 ------------------------------------------------------------------------------
     63  REFERENCES
     64 
     65 SC 29 Software Copyright Licencing Disclaimer:
     66 
     67 This software module was originally developed by
     68   Coding Technologies
     69 
     70 and edited by
     71   -
     72 
     73 in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
     74 standards for reference purposes and its performance may not have been
     75 optimized. This software module is an implementation of one or more tools as
     76 specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
     77 ISO/IEC gives users free license to this software module or modifications
     78 thereof for use in products claiming conformance to audiovisual and
     79 image-coding related ITU Recommendations and/or ISO/IEC International
     80 Standards. ISO/IEC gives users the same free license to this software module or
     81 modifications thereof for research purposes and further ISO/IEC standardisation.
     82 Those intending to use this software module in products are advised that its
     83 use may infringe existing patents. ISO/IEC have no liability for use of this
     84 software module or modifications thereof. Copyright is not released for
     85 products that do not conform to audiovisual and image-coding related ITU
     86 Recommendations and/or ISO/IEC International Standards.
     87 The original developer retains full right to modify and use the code for its
     88 own purpose, assign or donate the code to a third party and to inhibit third
     89 parties from using the code for products that do not conform to audiovisual and
     90 image-coding related ITU Recommendations and/or ISO/IEC International Standards.
     91 This copyright notice must be included in all copies or derivative works.
     92 Copyright (c) ISO/IEC 2003.
     93 
     94 ------------------------------------------------------------------------------
     95  PSEUDO-CODE
     96 
     97 ------------------------------------------------------------------------------
     98 */
     99 
    100 
    101 /*----------------------------------------------------------------------------
    102 ; INCLUDES
    103 ----------------------------------------------------------------------------*/
    104 
    105 #ifdef AAC_PLUS
    106 
    107 #ifdef PARAMETRICSTEREO
    108 #include    "pv_audio_type_defs.h"
    109 #include    "ps_stereo_processing.h"
    110 #include    "fxp_mul32.h"
    111 #include    "ps_all_pass_filter_coeff.h"
    112 
    113 /*----------------------------------------------------------------------------
    114 ; MACROS
    115 ; Define module specific macros here
    116 ----------------------------------------------------------------------------*/
    117 
    118 #ifndef min
    119 #define min(a, b) ((a) < (b) ? (a) : (b))
    120 #endif
    121 
    122 /*----------------------------------------------------------------------------
    123 ; DEFINES
    124 ; Include all pre-processor statements here. Include conditional
    125 ; compile variables also.
    126 ----------------------------------------------------------------------------*/
    127 
    128 /*----------------------------------------------------------------------------
    129 ; LOCAL FUNCTION DEFINITIONS
    130 ; Function Prototype declaration
    131 ----------------------------------------------------------------------------*/
    132 
    133 /*----------------------------------------------------------------------------
    134 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    135 ; Variable declaration - defined here and used outside this module
    136 ----------------------------------------------------------------------------*/
    137 
    138 
    139 /*----------------------------------------------------------------------------
    140 ; EXTERNAL FUNCTION REFERENCES
    141 ; Declare functions defined elsewhere and referenced in this module
    142 ----------------------------------------------------------------------------*/
    143 
    144 /*----------------------------------------------------------------------------
    145 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    146 ; Declare variables used in this module but defined elsewhere
    147 ----------------------------------------------------------------------------*/
    148 
    149 
    150 /*----------------------------------------------------------------------------
    151 ; FUNCTION CODE
    152 ----------------------------------------------------------------------------*/
    153 
    154 void ps_stereo_processing(STRUCT_PS_DEC  *pms,
    155                           Int32          *qmfLeftReal,
    156                           Int32          *qmfLeftImag,
    157                           Int32          *qmfRightReal,
    158                           Int32          *qmfRightImag)
    159 {
    160     Int32     group;
    161     Int32     subband;
    162     Int32     maxSubband;
    163     Int32     usb;
    164     Char     index;
    165 
    166 
    167     Int32  *hybrLeftReal;
    168     Int32  *hybrLeftImag;
    169     Int32  *hybrRightReal;
    170     Int32  *hybrRightImag;
    171     Int32  *ptr_hybrLeftReal;
    172     Int32  *ptr_hybrLeftImag;
    173     Int32  *ptr_hybrRightReal;
    174     Int32  *ptr_hybrRightImag;
    175 
    176 
    177     Int16   h11;
    178     Int16   h12;
    179     Int16   h21;
    180     Int16   h22;
    181 
    182     Int32   temp1;
    183     Int32   temp2;
    184     Int32   temp3;
    185 
    186     usb = pms->usb;
    187 
    188     /*
    189      *   Complete Linear interpolation
    190      */
    191 
    192     hybrLeftReal  = pms->mHybridRealLeft;
    193     hybrLeftImag  = pms->mHybridImagLeft;
    194     hybrRightReal = pms->mHybridRealRight;
    195     hybrRightImag = pms->mHybridImagRight;
    196 
    197     for (group = 0; group < SUBQMF_GROUPS; group++)     /* SUBQMF_GROUPS == 10 */
    198     {
    199 
    200         temp1 = pms->deltaH11[group];
    201         temp2 = pms->deltaH12[group];
    202 
    203         pms->H11[group]  += temp1;
    204         h11  = (Int16)(pms->H11[group] >> 16);
    205         pms->H12[group]  += temp2;
    206         h12  = (Int16)(pms->H12[group] >> 16);
    207 
    208         temp1 = pms->deltaH21[group];
    209         temp2 = pms->deltaH22[group];
    210 
    211         pms->H21[group]  += temp1;
    212         h21  = (Int16)(pms->H21[group] >> 16);
    213         pms->H22[group]  += temp2;
    214         h22  = (Int16)(pms->H22[group] >> 16);
    215 
    216         index = groupBorders[group];
    217 
    218         /*
    219          *  Reconstruction of Stereo sub-band signal
    220          *
    221          *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
    222          *
    223          *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
    224          */
    225         ptr_hybrLeftReal  = &hybrLeftReal[  index];
    226         ptr_hybrRightReal = &hybrRightReal[ index];
    227 
    228         temp1 = *(ptr_hybrLeftReal) << 1;
    229         temp2 = *(ptr_hybrRightReal) << 1;
    230 
    231         temp3 = fxp_mul32_by_16(temp1, h11);
    232         *(ptr_hybrLeftReal)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    233 
    234         temp3 = fxp_mul32_by_16(temp1, h12);
    235         *(ptr_hybrRightReal) = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    236 
    237 
    238         ptr_hybrLeftImag  = &hybrLeftImag[  index];
    239         ptr_hybrRightImag = &hybrRightImag[ index];
    240 
    241         temp1 = *(ptr_hybrLeftImag) << 1;
    242         temp2 = *(ptr_hybrRightImag) << 1;
    243 
    244         temp3 = fxp_mul32_by_16(temp1, h11);
    245         *(ptr_hybrLeftImag)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    246 
    247         temp3 = fxp_mul32_by_16(temp1, h12);
    248         *(ptr_hybrRightImag) = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    249 
    250 
    251     } /* groups loop */
    252 
    253     temp1 = pms->deltaH11[SUBQMF_GROUPS];
    254     temp2 = pms->deltaH12[SUBQMF_GROUPS];
    255 
    256     pms->H11[SUBQMF_GROUPS]  += temp1;
    257     h11  = (Int16)(pms->H11[SUBQMF_GROUPS] >> 16);
    258     pms->H12[SUBQMF_GROUPS]  += temp2;
    259     h12  = (Int16)(pms->H12[SUBQMF_GROUPS] >> 16);
    260 
    261     temp1 = pms->deltaH21[SUBQMF_GROUPS];
    262     temp2 = pms->deltaH22[SUBQMF_GROUPS];
    263 
    264     pms->H21[SUBQMF_GROUPS]  += temp1;
    265     h21  = (Int16)(pms->H21[SUBQMF_GROUPS] >> 16);
    266     pms->H22[SUBQMF_GROUPS]  += temp2;
    267     h22  = (Int16)(pms->H22[SUBQMF_GROUPS] >> 16);
    268 
    269 
    270     ptr_hybrLeftReal  = &qmfLeftReal[  3];
    271     ptr_hybrRightReal = &qmfRightReal[ 3];
    272 
    273     /*
    274      *  Reconstruction of Stereo sub-band signal
    275      *
    276      *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
    277      *
    278      *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
    279      */
    280     temp1 = *(ptr_hybrLeftReal) << 1;
    281     temp2 = *(ptr_hybrRightReal) << 1;
    282 
    283 
    284     temp3 = fxp_mul32_by_16(temp1, h11);
    285     *(ptr_hybrLeftReal)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    286 
    287     temp3 = fxp_mul32_by_16(temp1, h12);
    288     *(ptr_hybrRightReal)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    289 
    290     ptr_hybrLeftImag  = &qmfLeftImag[  3];
    291     ptr_hybrRightImag = &qmfRightImag[ 3];
    292 
    293 
    294     temp1 = *(ptr_hybrLeftImag) << 1;
    295     temp2 = *(ptr_hybrRightImag) << 1;
    296 
    297     temp3 = fxp_mul32_by_16(temp1, h11);
    298     *(ptr_hybrLeftImag)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    299 
    300     temp3 = fxp_mul32_by_16(temp1, h12);
    301     *(ptr_hybrRightImag)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    302 
    303 
    304     for (group = SUBQMF_GROUPS + 1; group < NO_IID_GROUPS; group++)   /* 11 to NO_IID_GROUPS == 22 */
    305     {
    306         temp1 = pms->deltaH11[group];
    307         temp2 = pms->deltaH12[group];
    308 
    309         pms->H11[group]  += temp1;
    310         h11  = (Int16)(pms->H11[group] >> 16);
    311         pms->H12[group]  += temp2;
    312         h12  = (Int16)(pms->H12[group] >> 16);
    313 
    314         temp1 = pms->deltaH21[group];
    315         temp2 = pms->deltaH22[group];
    316 
    317         pms->H21[group]  += temp1;
    318         h21  = (Int16)(pms->H21[group] >> 16);
    319         pms->H22[group]  += temp2;
    320         h22  = (Int16)(pms->H22[group] >> 16);
    321 
    322         index = groupBorders[group];
    323         maxSubband = groupBorders[group + 1];
    324         maxSubband = min(usb, maxSubband);
    325 
    326         /*
    327          *  Reconstruction of Stereo sub-band signal
    328          *
    329          *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
    330          *
    331          *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
    332          */
    333 
    334         ptr_hybrLeftReal  = &qmfLeftReal[  index];
    335         ptr_hybrRightReal = &qmfRightReal[ index];
    336 
    337         for (subband = index; subband < maxSubband; subband++)
    338         {
    339             temp1 = *(ptr_hybrLeftReal) << 1;
    340             temp2 = *(ptr_hybrRightReal) << 1;
    341             temp3 = fxp_mul32_by_16(temp1, h11);
    342             *(ptr_hybrLeftReal++)   = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    343 
    344             temp3 = fxp_mul32_by_16(temp1, h12);
    345             *(ptr_hybrRightReal++)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    346         }
    347 
    348         ptr_hybrLeftImag  = &qmfLeftImag[  index];
    349         ptr_hybrRightImag = &qmfRightImag[ index];
    350 
    351         for (subband = index; subband < maxSubband; subband++)
    352         {
    353             temp1 = *(ptr_hybrLeftImag) << 1;
    354             temp2 = *(ptr_hybrRightImag) << 1;
    355             temp3 = fxp_mul32_by_16(temp1, h11);
    356             *(ptr_hybrLeftImag++)   = fxp_mac32_by_16(temp2, h21, temp3) << 1;
    357 
    358             temp3 = fxp_mul32_by_16(temp1, h12);
    359             *(ptr_hybrRightImag++)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
    360 
    361         } /* subband loop */
    362 
    363     } /* groups loop */
    364 
    365 } /* END ps_stereo_processing */
    366 
    367 
    368 #endif
    369 
    370 
    371 #endif
    372 
    373