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: ps_hybrid_analysis.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         Does Hybrid analysis
     38 
     39 ------------------------------------------------------------------------------
     40  REQUIREMENTS
     41 
     42 
     43 ------------------------------------------------------------------------------
     44  REFERENCES
     45 
     46 SC 29 Software Copyright Licencing Disclaimer:
     47 
     48 This software module was originally developed by
     49   Coding Technologies
     50 
     51 and edited by
     52   -
     53 
     54 in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
     55 standards for reference purposes and its performance may not have been
     56 optimized. This software module is an implementation of one or more tools as
     57 specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
     58 ISO/IEC gives users free license to this software module or modifications
     59 thereof for use in products claiming conformance to audiovisual and
     60 image-coding related ITU Recommendations and/or ISO/IEC International
     61 Standards. ISO/IEC gives users the same free license to this software module or
     62 modifications thereof for research purposes and further ISO/IEC standardisation.
     63 Those intending to use this software module in products are advised that its
     64 use may infringe existing patents. ISO/IEC have no liability for use of this
     65 software module or modifications thereof. Copyright is not released for
     66 products that do not conform to audiovisual and image-coding related ITU
     67 Recommendations and/or ISO/IEC International Standards.
     68 The original developer retains full right to modify and use the code for its
     69 own purpose, assign or donate the code to a third party and to inhibit third
     70 parties from using the code for products that do not conform to audiovisual and
     71 image-coding related ITU Recommendations and/or ISO/IEC International Standards.
     72 This copyright notice must be included in all copies or derivative works.
     73 Copyright (c) ISO/IEC 2003.
     74 
     75 ------------------------------------------------------------------------------
     76  PSEUDO-CODE
     77 
     78 ------------------------------------------------------------------------------
     79 */
     80 
     81 
     82 /*----------------------------------------------------------------------------
     83 ; INCLUDES
     84 ----------------------------------------------------------------------------*/
     85 
     86 #ifdef AAC_PLUS
     87 
     88 #ifdef PARAMETRICSTEREO
     89 
     90 #include    "s_hybrid.h"
     91 #include    "aac_mem_funcs.h"
     92 #include    "ps_fft_rx8.h"
     93 #include    "ps_channel_filtering.h"
     94 #include    "pv_audio_type_defs.h"
     95 #include    "fxp_mul32.h"
     96 /*----------------------------------------------------------------------------
     97 ; MACROS
     98 ; Define module specific macros here
     99 ----------------------------------------------------------------------------*/
    100 
    101 
    102 /*----------------------------------------------------------------------------
    103 ; DEFINES
    104 ; Include all pre-processor statements here. Include conditional
    105 ; compile variables also.
    106 ----------------------------------------------------------------------------*/
    107 #define R_SHIFT     29
    108 #define Q29_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
    109 
    110 #define Qfmt31(a)   (Int32)(-a*((Int32)1<<31)  + (a>=0?0.5F:-0.5F))
    111 
    112 /*----------------------------------------------------------------------------
    113 ; LOCAL FUNCTION DEFINITIONS
    114 ; Function Prototype declaration
    115 ----------------------------------------------------------------------------*/
    116 
    117 /*----------------------------------------------------------------------------
    118 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    119 ; Variable declaration - defined here and used outside this module
    120 ----------------------------------------------------------------------------*/
    121 
    122 
    123 /*----------------------------------------------------------------------------
    124 ; EXTERNAL FUNCTION REFERENCES
    125 ; Declare functions defined elsewhere and referenced in this module
    126 ----------------------------------------------------------------------------*/
    127 
    128 /*----------------------------------------------------------------------------
    129 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    130 ; Declare variables used in this module but defined elsewhere
    131 ----------------------------------------------------------------------------*/
    132 
    133 
    134 /*----------------------------------------------------------------------------
    135 ; FUNCTION CODE
    136 ----------------------------------------------------------------------------*/
    137 
    138 
    139 void two_ch_filtering(const Int32 *pQmf_r,
    140                       const Int32 *pQmf_i,
    141                       Int32 *mHybrid_r,
    142                       Int32 *mHybrid_i)
    143 {
    144 
    145     Int32 cum0;
    146     Int32 cum1;
    147     Int32 cum2;
    148     Int32 tmp1;
    149     Int32 tmp2;
    150 
    151     tmp1 = pQmf_r[ 1] + pQmf_r[11];
    152     tmp2 = pQmf_i[ 1] + pQmf_i[11];
    153     cum1 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp1);
    154     cum2 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp2);
    155     tmp1 = pQmf_r[ 3] + pQmf_r[ 9];
    156     tmp2 = pQmf_i[ 3] + pQmf_i[ 9];
    157     cum1 =   fxp_msu32_Q31(cum1, Qfmt31(0.14586278335076f), tmp1);
    158     cum2 =   fxp_msu32_Q31(cum2, Qfmt31(0.14586278335076f), tmp2);
    159     tmp1 = pQmf_r[ 5] + pQmf_r[ 7];
    160     tmp2 = pQmf_i[ 5] + pQmf_i[ 7];
    161     cum1 =   fxp_mac32_Q31(cum1, Qfmt31(0.61193261090336f), tmp1);
    162     cum2 =   fxp_mac32_Q31(cum2, Qfmt31(0.61193261090336f), tmp2);
    163 
    164     cum0 = pQmf_r[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */
    165 
    166     mHybrid_r[0] = (cum0 + cum1);
    167     mHybrid_r[1] = (cum0 - cum1);
    168 
    169     cum0 = pQmf_i[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */
    170 
    171     mHybrid_i[0] = (cum0 + cum2);
    172     mHybrid_i[1] = (cum0 - cum2);
    173 
    174 }
    175 
    176 
    177 
    178 
    179 
    180 /*----------------------------------------------------------------------------
    181 ; FUNCTION CODE
    182 ----------------------------------------------------------------------------*/
    183 
    184 
    185 void eight_ch_filtering(const Int32 *pQmfReal,
    186                         const Int32 *pQmfImag,
    187                         Int32 *mHybridReal,
    188                         Int32 *mHybridImag,
    189                         Int32 scratch_mem[])
    190 
    191 {
    192 
    193     Int32 real;
    194     Int32 imag;
    195     Int32 tmp1;
    196     Int32 tmp2;
    197 
    198     real  = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfReal[ 4]);
    199 
    200     real  = fxp_mac32_Q31(real, Qfmt31(0.01055120626280f), pQmfReal[12]);
    201     imag  = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfImag[ 4]);
    202 
    203     imag  = fxp_mac32_Q31(imag, Qfmt31(0.01055120626280f), pQmfImag[12]);
    204 
    205     mHybridReal[2] = (imag - real);
    206     mHybridImag[2] = -(imag + real);
    207 
    208     real  = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfReal[ 3]);
    209 
    210     real  = fxp_mac32_Q31(real, Qfmt31(0.04540841899650f), pQmfReal[11]);
    211     imag  = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfImag[ 3]);
    212 
    213     imag  = fxp_mac32_Q31(imag, Qfmt31(0.04540841899650f), pQmfImag[11]);
    214 
    215     tmp1           =  fxp_mul32_Q29(Q29_fmt(-0.38268343236509f), real);
    216     mHybridReal[3] =  fxp_mac32_Q29(Q29_fmt(0.92387953251129f), imag, tmp1);
    217     tmp2           =  fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real);
    218     mHybridImag[3] =  fxp_mac32_Q29(Q29_fmt(-0.38268343236509f), imag, tmp2);
    219 
    220 
    221     mHybridImag[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfReal[ 2] - pQmfReal[10]));
    222     mHybridReal[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfImag[10] - pQmfImag[ 2]));
    223 
    224 
    225     real  = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfReal[ 1]);
    226 
    227     real  = fxp_mac32_Q31(real, Qfmt31(0.14532227859182f), pQmfReal[ 9]);
    228     imag  = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfImag[ 1]);
    229 
    230     imag  = fxp_mac32_Q31(imag, Qfmt31(0.14532227859182f), pQmfImag[ 9]);
    231 
    232     tmp1           =  fxp_mul32_Q29(Q29_fmt(0.92387953251129f), imag);
    233 
    234     mHybridReal[5] =  fxp_mac32_Q31(tmp1, Qfmt31(0.76536686473018f), real);
    235     tmp2           =  fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real);
    236 
    237     mHybridImag[5] =  fxp_mac32_Q31(tmp2, Qfmt31(0.76536686473018f), imag);
    238 
    239     real  = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfReal[ 0]);
    240 
    241     real  = fxp_mac32_Q31(real, Qfmt31(0.13979654612668f), pQmfReal[ 8]);
    242     imag  = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfImag[ 0]);
    243 
    244     imag  = fxp_mac32_Q31(imag, Qfmt31(0.13979654612668f), pQmfImag[ 8]);
    245 
    246     mHybridReal[6] = (imag + real);
    247     mHybridImag[6] = (imag - real);
    248 
    249 
    250     tmp1            =  fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfReal[ 7]);
    251     mHybridReal[7]  =  fxp_mac32_Q31(tmp1, Qfmt31(0.09026515280366f), pQmfImag[ 7]);
    252 
    253     tmp2            =  fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfReal[ 7]);
    254 
    255     mHybridImag[7]  =  fxp_mac32_Q31(tmp2, Qfmt31(0.21791935610828f), pQmfImag[ 7]);
    256 
    257     mHybridReal[0] = pQmfReal[HYBRID_FILTER_DELAY] >> 3;
    258     mHybridImag[0] = pQmfImag[HYBRID_FILTER_DELAY] >> 3;
    259 
    260     tmp1           =  fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfImag[ 5]);
    261 
    262     mHybridReal[1] =  fxp_mac32_Q31(tmp1, Qfmt31(0.21791935610828f), pQmfReal[ 5]);
    263 
    264 
    265     tmp2            =  fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfImag[ 5]);
    266     mHybridImag[1]  =  fxp_mac32_Q31(tmp2, Qfmt31(0.09026515280366f), pQmfReal[ 5]);
    267 
    268     /*
    269      *  8*ifft
    270      */
    271 
    272     ps_fft_rx8(mHybridReal, mHybridImag, scratch_mem);
    273 
    274 }
    275 
    276 
    277 #endif
    278 
    279 
    280 #endif
    281 
    282