Home | History | Annotate | Download | only in include
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /******************* Library for basic calculation routines ********************
     96 
     97    Author(s):   M. Gayer
     98 
     99    Description: Fixed point specific mathematical functions
    100 
    101 *******************************************************************************/
    102 
    103 #ifndef FIXPOINT_MATH_H
    104 #define FIXPOINT_MATH_H
    105 
    106 #include "common_fix.h"
    107 #include "scale.h"
    108 
    109 /*
    110  * Data definitions
    111  */
    112 
    113 #define LD_DATA_SCALING (64.0f)
    114 #define LD_DATA_SHIFT 6 /* pow(2, LD_DATA_SHIFT) = LD_DATA_SCALING */
    115 
    116 #define MAX_LD_PRECISION 10
    117 #define LD_PRECISION 10
    118 
    119 /* Taylor series coefficients for ln(1-x), centered at 0 (MacLaurin polynomial).
    120  */
    121 #ifndef LDCOEFF_16BIT
    122 LNK_SECTION_CONSTDATA_L1
    123 static const FIXP_DBL ldCoeff[MAX_LD_PRECISION] = {
    124     FL2FXCONST_DBL(-1.0),       FL2FXCONST_DBL(-1.0 / 2.0),
    125     FL2FXCONST_DBL(-1.0 / 3.0), FL2FXCONST_DBL(-1.0 / 4.0),
    126     FL2FXCONST_DBL(-1.0 / 5.0), FL2FXCONST_DBL(-1.0 / 6.0),
    127     FL2FXCONST_DBL(-1.0 / 7.0), FL2FXCONST_DBL(-1.0 / 8.0),
    128     FL2FXCONST_DBL(-1.0 / 9.0), FL2FXCONST_DBL(-1.0 / 10.0)};
    129 #else  /* LDCOEFF_16BIT */
    130 LNK_SECTION_CONSTDATA_L1
    131 static const FIXP_SGL ldCoeff[MAX_LD_PRECISION] = {
    132     FL2FXCONST_SGL(-1.0),       FL2FXCONST_SGL(-1.0 / 2.0),
    133     FL2FXCONST_SGL(-1.0 / 3.0), FL2FXCONST_SGL(-1.0 / 4.0),
    134     FL2FXCONST_SGL(-1.0 / 5.0), FL2FXCONST_SGL(-1.0 / 6.0),
    135     FL2FXCONST_SGL(-1.0 / 7.0), FL2FXCONST_SGL(-1.0 / 8.0),
    136     FL2FXCONST_SGL(-1.0 / 9.0), FL2FXCONST_SGL(-1.0 / 10.0)};
    137 #endif /* LDCOEFF_16BIT */
    138 
    139 /*****************************************************************************
    140 
    141     functionname: invSqrtNorm2
    142     description:  delivers 1/sqrt(op) normalized to .5...1 and the shift value
    143 of the OUTPUT
    144 
    145 *****************************************************************************/
    146 #define SQRT_BITS 7
    147 #define SQRT_VALUES (128 + 2)
    148 #define SQRT_BITS_MASK 0x7f
    149 #define SQRT_FRACT_BITS_MASK 0x007FFFFF
    150 
    151 extern const FIXP_DBL invSqrtTab[SQRT_VALUES];
    152 
    153 /*
    154  * Hardware specific implementations
    155  */
    156 
    157 #if defined(__x86__)
    158 #include "x86/fixpoint_math_x86.h"
    159 #endif /* target architecture selector */
    160 
    161 /*
    162  * Fallback implementations
    163  */
    164 #if !defined(FUNCTION_fIsLessThan)
    165 /**
    166  * \brief Compares two fixpoint values incl. scaling.
    167  * \param a_m mantissa of the first input value.
    168  * \param a_e exponent of the first input value.
    169  * \param b_m mantissa of the second input value.
    170  * \param b_e exponent of the second input value.
    171  * \return non-zero if (a_m*2^a_e) < (b_m*2^b_e), 0 otherwise
    172  */
    173 FDK_INLINE INT fIsLessThan(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e) {
    174   if (a_e > b_e) {
    175     return ((b_m >> fMin(a_e - b_e, DFRACT_BITS - 1)) > a_m);
    176   } else {
    177     return ((a_m >> fMin(b_e - a_e, DFRACT_BITS - 1)) < b_m);
    178   }
    179 }
    180 
    181 FDK_INLINE INT fIsLessThan(FIXP_SGL a_m, INT a_e, FIXP_SGL b_m, INT b_e) {
    182   if (a_e > b_e) {
    183     return ((b_m >> fMin(a_e - b_e, FRACT_BITS - 1)) > a_m);
    184   } else {
    185     return ((a_m >> fMin(b_e - a_e, FRACT_BITS - 1)) < b_m);
    186   }
    187 }
    188 #endif
    189 
    190 /**
    191  * \brief deprecated. Use fLog2() instead.
    192  */
    193 #define CalcLdData(op) fLog2(op, 0)
    194 
    195 void LdDataVector(FIXP_DBL *srcVector, FIXP_DBL *destVector, INT number);
    196 
    197 extern const UINT exp2_tab_long[32];
    198 extern const UINT exp2w_tab_long[32];
    199 extern const UINT exp2x_tab_long[32];
    200 
    201 LNK_SECTION_CODE_L1
    202 FDK_INLINE FIXP_DBL CalcInvLdData(const FIXP_DBL x) {
    203   int set_zero = (x < FL2FXCONST_DBL(-31.0 / 64.0)) ? 0 : 1;
    204   int set_max = (x >= FL2FXCONST_DBL(31.0 / 64.0)) | (x == FL2FXCONST_DBL(0.0));
    205 
    206   FIXP_SGL frac = (FIXP_SGL)((LONG)x & 0x3FF);
    207   UINT index3 = (UINT)(LONG)(x >> 10) & 0x1F;
    208   UINT index2 = (UINT)(LONG)(x >> 15) & 0x1F;
    209   UINT index1 = (UINT)(LONG)(x >> 20) & 0x1F;
    210   int exp = fMin(31, ((x > FL2FXCONST_DBL(0.0f)) ? (31 - (int)(x >> 25))
    211                                                  : (int)(-(x >> 25))));
    212 
    213   UINT lookup1 = exp2_tab_long[index1] * set_zero;
    214   UINT lookup2 = exp2w_tab_long[index2];
    215   UINT lookup3 = exp2x_tab_long[index3];
    216   UINT lookup3f =
    217       lookup3 + (UINT)(LONG)fMultDiv2((FIXP_DBL)(0x0016302F), (FIXP_SGL)frac);
    218 
    219   UINT lookup12 = (UINT)(LONG)fMult((FIXP_DBL)lookup1, (FIXP_DBL)lookup2);
    220   UINT lookup = (UINT)(LONG)fMult((FIXP_DBL)lookup12, (FIXP_DBL)lookup3f);
    221 
    222   FIXP_DBL retVal = (lookup << 3) >> exp;
    223 
    224   if (set_max) {
    225     retVal = (FIXP_DBL)MAXVAL_DBL;
    226   }
    227 
    228   return retVal;
    229 }
    230 
    231 void InitLdInt();
    232 FIXP_DBL CalcLdInt(INT i);
    233 
    234 extern const USHORT sqrt_tab[49];
    235 
    236 inline FIXP_DBL sqrtFixp_lookup(FIXP_DBL x) {
    237   UINT y = (INT)x;
    238   UCHAR is_zero = (y == 0);
    239   INT zeros = fixnormz_D(y) & 0x1e;
    240   y <<= zeros;
    241   UINT idx = (y >> 26) - 16;
    242   USHORT frac = (y >> 10) & 0xffff;
    243   USHORT nfrac = 0xffff ^ frac;
    244   UINT t = (UINT)nfrac * sqrt_tab[idx] + (UINT)frac * sqrt_tab[idx + 1];
    245   t = t >> (zeros >> 1);
    246   return (is_zero ? 0 : t);
    247 }
    248 
    249 inline FIXP_DBL sqrtFixp_lookup(FIXP_DBL x, INT *x_e) {
    250   UINT y = (INT)x;
    251   INT e;
    252 
    253   if (x == (FIXP_DBL)0) {
    254     return x;
    255   }
    256 
    257   /* Normalize */
    258   e = fixnormz_D(y);
    259   y <<= e;
    260   e = *x_e - e + 2;
    261 
    262   /* Correct odd exponent. */
    263   if (e & 1) {
    264     y >>= 1;
    265     e++;
    266   }
    267   /* Get square root */
    268   UINT idx = (y >> 26) - 16;
    269   USHORT frac = (y >> 10) & 0xffff;
    270   USHORT nfrac = 0xffff ^ frac;
    271   UINT t = (UINT)nfrac * sqrt_tab[idx] + (UINT)frac * sqrt_tab[idx + 1];
    272 
    273   /* Write back exponent */
    274   *x_e = e >> 1;
    275   return (FIXP_DBL)(LONG)(t >> 1);
    276 }
    277 
    278 void InitInvSqrtTab();
    279 
    280 #ifndef FUNCTION_invSqrtNorm2
    281 /**
    282  * \brief calculate 1.0/sqrt(op)
    283  * \param op_m mantissa of input value.
    284  * \param result_e pointer to return the exponent of the result
    285  * \return mantissa of the result
    286  */
    287 /*****************************************************************************
    288   delivers 1/sqrt(op) normalized to .5...1 and the shift value of the OUTPUT,
    289   i.e. the denormalized result is 1/sqrt(op) = invSqrtNorm(op) * 2^(shift)
    290   uses Newton-iteration for approximation
    291       Q(n+1) = Q(n) + Q(n) * (0.5 - 2 * V * Q(n)^2)
    292       with Q = 0.5* V ^-0.5; 0.5 <= V < 1.0
    293 *****************************************************************************/
    294 static FDK_FORCEINLINE FIXP_DBL invSqrtNorm2(FIXP_DBL op, INT *shift) {
    295   FIXP_DBL val = op;
    296   FIXP_DBL reg1, reg2;
    297 
    298   if (val == FL2FXCONST_DBL(0.0)) {
    299     *shift = 16;
    300     return ((LONG)MAXVAL_DBL); /* maximum positive value */
    301   }
    302 
    303 #define INVSQRTNORM2_LINEAR_INTERPOLATE
    304 #define INVSQRTNORM2_LINEAR_INTERPOLATE_HQ
    305 
    306   /* normalize input, calculate shift value */
    307   FDK_ASSERT(val > FL2FXCONST_DBL(0.0));
    308   *shift = fNormz(val) - 1; /* CountLeadingBits() is not necessary here since
    309                                test value is always > 0 */
    310   val <<= *shift;           /* normalized input V */
    311   *shift += 2;              /* bias for exponent */
    312 
    313 #if defined(INVSQRTNORM2_LINEAR_INTERPOLATE)
    314   INT index =
    315       (INT)(val >> (DFRACT_BITS - 1 - (SQRT_BITS + 1))) & SQRT_BITS_MASK;
    316   FIXP_DBL Fract =
    317       (FIXP_DBL)(((INT)val & SQRT_FRACT_BITS_MASK) << (SQRT_BITS + 1));
    318   FIXP_DBL diff = invSqrtTab[index + 1] - invSqrtTab[index];
    319   reg1 = invSqrtTab[index] + (fMultDiv2(diff, Fract) << 1);
    320 #if defined(INVSQRTNORM2_LINEAR_INTERPOLATE_HQ)
    321   /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ...
    322                                        + (1-fract)fract*(t[i+2]-t[i+1])/2 */
    323   if (Fract != (FIXP_DBL)0) {
    324     /* fract = fract * (1 - fract) */
    325     Fract = fMultDiv2(Fract, (FIXP_DBL)((ULONG)0x80000000 - (ULONG)Fract)) << 1;
    326     diff = diff - (invSqrtTab[index + 2] - invSqrtTab[index + 1]);
    327     reg1 = fMultAddDiv2(reg1, Fract, diff);
    328   }
    329 #endif /* INVSQRTNORM2_LINEAR_INTERPOLATE_HQ */
    330 #else
    331 #error \
    332     "Either define INVSQRTNORM2_NEWTON_ITERATE or INVSQRTNORM2_LINEAR_INTERPOLATE"
    333 #endif
    334   /* calculate the output exponent = input exp/2 */
    335   if (*shift & 0x00000001) { /* odd shift values ? */
    336     /* Note: Do not use rounded value 0x5A82799A to avoid overflow with
    337      * shift-by-2 */
    338     reg2 = (FIXP_DBL)0x5A827999;
    339     /* FL2FXCONST_DBL(0.707106781186547524400844362104849f);*/ /* 1/sqrt(2);
    340                                                                 */
    341     reg1 = fMultDiv2(reg1, reg2) << 2;
    342   }
    343 
    344   *shift = *shift >> 1;
    345 
    346   return (reg1);
    347 }
    348 #endif /* FUNCTION_invSqrtNorm2 */
    349 
    350 #ifndef FUNCTION_sqrtFixp
    351 static FDK_FORCEINLINE FIXP_DBL sqrtFixp(FIXP_DBL op) {
    352   INT tmp_exp = 0;
    353   FIXP_DBL tmp_inv = invSqrtNorm2(op, &tmp_exp);
    354 
    355   FDK_ASSERT(tmp_exp > 0);
    356   return ((FIXP_DBL)(fMultDiv2((op << (tmp_exp - 1)), tmp_inv) << 2));
    357 }
    358 #endif /* FUNCTION_sqrtFixp */
    359 
    360 #ifndef FUNCTION_invFixp
    361 /**
    362  * \brief calculate 1.0/op
    363  * \param op mantissa of the input value.
    364  * \return mantissa of the result with implicit exponent of 31
    365  * \exceptions are provided for op=0,1 setting max. positive value
    366  */
    367 static inline FIXP_DBL invFixp(FIXP_DBL op) {
    368   if ((op == (FIXP_DBL)0x00000000) || (op == (FIXP_DBL)0x00000001)) {
    369     return ((LONG)MAXVAL_DBL);
    370   }
    371   INT tmp_exp;
    372   FIXP_DBL tmp_inv = invSqrtNorm2(op, &tmp_exp);
    373   FDK_ASSERT((31 - (2 * tmp_exp + 1)) >= 0);
    374   int shift = 31 - (2 * tmp_exp + 1);
    375   tmp_inv = fPow2Div2(tmp_inv);
    376   if (shift) {
    377     tmp_inv = ((tmp_inv >> (shift - 1)) + (FIXP_DBL)1) >> 1;
    378   }
    379   return tmp_inv;
    380 }
    381 
    382 /**
    383  * \brief calculate 1.0/(op_m * 2^op_e)
    384  * \param op_m mantissa of the input value.
    385  * \param op_e pointer into were the exponent of the input value is stored, and
    386  * the result will be stored into.
    387  * \return mantissa of the result
    388  */
    389 static inline FIXP_DBL invFixp(FIXP_DBL op_m, int *op_e) {
    390   if ((op_m == (FIXP_DBL)0x00000000) || (op_m == (FIXP_DBL)0x00000001)) {
    391     *op_e = 31 - *op_e;
    392     return ((LONG)MAXVAL_DBL);
    393   }
    394 
    395   INT tmp_exp;
    396   FIXP_DBL tmp_inv = invSqrtNorm2(op_m, &tmp_exp);
    397 
    398   *op_e = (tmp_exp << 1) - *op_e + 1;
    399   return fPow2Div2(tmp_inv);
    400 }
    401 #endif /* FUNCTION_invFixp */
    402 
    403 #ifndef FUNCTION_schur_div
    404 
    405 /**
    406  * \brief Divide two FIXP_DBL values with given precision.
    407  * \param num dividend
    408  * \param denum divisor
    409  * \param count amount of significant bits of the result (starting to the MSB)
    410  * \return num/divisor
    411  */
    412 
    413 FIXP_DBL schur_div(FIXP_DBL num, FIXP_DBL denum, INT count);
    414 
    415 #endif /* FUNCTION_schur_div */
    416 
    417 FIXP_DBL mul_dbl_sgl_rnd(const FIXP_DBL op1, const FIXP_SGL op2);
    418 
    419 #ifndef FUNCTION_fMultNorm
    420 /**
    421  * \brief multiply two values with normalization, thus max precision.
    422  * Author: Robert Weidner
    423  *
    424  * \param f1 first factor
    425  * \param f2 second factor
    426  * \param result_e pointer to an INT where the exponent of the result is stored
    427  * into
    428  * \return mantissa of the product f1*f2
    429  */
    430 FIXP_DBL fMultNorm(FIXP_DBL f1, FIXP_DBL f2, INT *result_e);
    431 
    432 /**
    433  * \brief Multiply 2 values using maximum precision. The exponent of the result
    434  * is 0.
    435  * \param f1_m mantissa of factor 1
    436  * \param f2_m mantissa of factor 2
    437  * \return mantissa of the result with exponent equal to 0
    438  */
    439 inline FIXP_DBL fMultNorm(FIXP_DBL f1, FIXP_DBL f2) {
    440   FIXP_DBL m;
    441   INT e;
    442 
    443   m = fMultNorm(f1, f2, &e);
    444 
    445   m = scaleValueSaturate(m, e);
    446 
    447   return m;
    448 }
    449 
    450 /**
    451  * \brief Multiply 2 values with exponent and use given exponent for the
    452  * mantissa of the result.
    453  * \param f1_m mantissa of factor 1
    454  * \param f1_e exponent of factor 1
    455  * \param f2_m mantissa of factor 2
    456  * \param f2_e exponent of factor 2
    457  * \param result_e exponent for the returned mantissa of the result
    458  * \return mantissa of the result with exponent equal to result_e
    459  */
    460 inline FIXP_DBL fMultNorm(FIXP_DBL f1_m, INT f1_e, FIXP_DBL f2_m, INT f2_e,
    461                           INT result_e) {
    462   FIXP_DBL m;
    463   INT e;
    464 
    465   m = fMultNorm(f1_m, f2_m, &e);
    466 
    467   m = scaleValueSaturate(m, e + f1_e + f2_e - result_e);
    468 
    469   return m;
    470 }
    471 #endif /* FUNCTION_fMultNorm */
    472 
    473 #ifndef FUNCTION_fMultI
    474 /**
    475  * \brief Multiplies a fractional value and a integer value and performs
    476  * rounding to nearest
    477  * \param a fractional value
    478  * \param b integer value
    479  * \return integer value
    480  */
    481 inline INT fMultI(FIXP_DBL a, INT b) {
    482   FIXP_DBL m, mi;
    483   INT m_e;
    484 
    485   m = fMultNorm(a, (FIXP_DBL)b, &m_e);
    486 
    487   if (m_e < (INT)0) {
    488     if (m_e > (INT)-DFRACT_BITS) {
    489       m = m >> ((-m_e) - 1);
    490       mi = (m + (FIXP_DBL)1) >> 1;
    491     } else {
    492       mi = (FIXP_DBL)0;
    493     }
    494   } else {
    495     mi = scaleValueSaturate(m, m_e);
    496   }
    497 
    498   return ((INT)mi);
    499 }
    500 #endif /* FUNCTION_fMultI */
    501 
    502 #ifndef FUNCTION_fMultIfloor
    503 /**
    504  * \brief Multiplies a fractional value and a integer value and performs floor
    505  * rounding
    506  * \param a fractional value
    507  * \param b integer value
    508  * \return integer value
    509  */
    510 inline INT fMultIfloor(FIXP_DBL a, INT b) {
    511   FIXP_DBL m, mi;
    512   INT m_e;
    513 
    514   m = fMultNorm(a, (FIXP_DBL)b, &m_e);
    515 
    516   if (m_e < (INT)0) {
    517     if (m_e > (INT)-DFRACT_BITS) {
    518       mi = m >> (-m_e);
    519     } else {
    520       mi = (FIXP_DBL)0;
    521       if (m < (FIXP_DBL)0) {
    522         mi = (FIXP_DBL)-1;
    523       }
    524     }
    525   } else {
    526     mi = scaleValueSaturate(m, m_e);
    527   }
    528 
    529   return ((INT)mi);
    530 }
    531 #endif /* FUNCTION_fMultIfloor */
    532 
    533 #ifndef FUNCTION_fMultIceil
    534 /**
    535  * \brief Multiplies a fractional value and a integer value and performs ceil
    536  * rounding
    537  * \param a fractional value
    538  * \param b integer value
    539  * \return integer value
    540  */
    541 inline INT fMultIceil(FIXP_DBL a, INT b) {
    542   FIXP_DBL m, mi;
    543   INT m_e;
    544 
    545   m = fMultNorm(a, (FIXP_DBL)b, &m_e);
    546 
    547   if (m_e < (INT)0) {
    548     if (m_e > (INT)-DFRACT_BITS) {
    549       mi = (m >> (-m_e));
    550       if ((LONG)m & ((1 << (-m_e)) - 1)) {
    551         mi = mi + (FIXP_DBL)1;
    552       }
    553     } else {
    554       mi = (FIXP_DBL)1;
    555       if (m < (FIXP_DBL)0) {
    556         mi = (FIXP_DBL)0;
    557       }
    558     }
    559   } else {
    560     mi = scaleValueSaturate(m, m_e);
    561   }
    562 
    563   return ((INT)mi);
    564 }
    565 #endif /* FUNCTION_fMultIceil */
    566 
    567 #ifndef FUNCTION_fDivNorm
    568 /**
    569  * \brief Divide 2 FIXP_DBL values with normalization of input values.
    570  * \param num numerator
    571  * \param denum denominator
    572  * \param result_e pointer to an INT where the exponent of the result is stored
    573  * into
    574  * \return num/denum with exponent = *result_e
    575  */
    576 FIXP_DBL fDivNorm(FIXP_DBL num, FIXP_DBL denom, INT *result_e);
    577 
    578 /**
    579  * \brief Divide 2 positive FIXP_DBL values with normalization of input values.
    580  * \param num numerator
    581  * \param denum denominator
    582  * \return num/denum with exponent = 0
    583  */
    584 FIXP_DBL fDivNorm(FIXP_DBL num, FIXP_DBL denom);
    585 
    586 /**
    587  * \brief Divide 2 signed FIXP_DBL values with normalization of input values.
    588  * \param num numerator
    589  * \param denum denominator
    590  * \param result_e pointer to an INT where the exponent of the result is stored
    591  * into
    592  * \return num/denum with exponent = *result_e
    593  */
    594 FIXP_DBL fDivNormSigned(FIXP_DBL L_num, FIXP_DBL L_denum, INT *result_e);
    595 
    596 /**
    597  * \brief Divide 2 signed FIXP_DBL values with normalization of input values.
    598  * \param num numerator
    599  * \param denum denominator
    600  * \return num/denum with exponent = 0
    601  */
    602 FIXP_DBL fDivNormSigned(FIXP_DBL num, FIXP_DBL denom);
    603 #endif /* FUNCTION_fDivNorm */
    604 
    605 /**
    606  * \brief Adjust mantissa to exponent -1
    607  * \param a_m mantissa of value to be adjusted
    608  * \param pA_e pointer to the exponen of a_m
    609  * \return adjusted mantissa
    610  */
    611 inline FIXP_DBL fAdjust(FIXP_DBL a_m, INT *pA_e) {
    612   INT shift;
    613 
    614   shift = fNorm(a_m) - 1;
    615   *pA_e -= shift;
    616 
    617   return scaleValue(a_m, shift);
    618 }
    619 
    620 #ifndef FUNCTION_fAddNorm
    621 /**
    622  * \brief Add two values with normalization
    623  * \param a_m mantissa of first summand
    624  * \param a_e exponent of first summand
    625  * \param a_m mantissa of second summand
    626  * \param a_e exponent of second summand
    627  * \param pResult_e pointer to where the exponent of the result will be stored
    628  * to.
    629  * \return mantissa of result
    630  */
    631 inline FIXP_DBL fAddNorm(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e,
    632                          INT *pResult_e) {
    633   INT result_e;
    634   FIXP_DBL result_m;
    635 
    636   /* If one of the summands is zero, return the other.
    637      This is necessary for the summation of a very small number to zero */
    638   if (a_m == (FIXP_DBL)0) {
    639     *pResult_e = b_e;
    640     return b_m;
    641   }
    642   if (b_m == (FIXP_DBL)0) {
    643     *pResult_e = a_e;
    644     return a_m;
    645   }
    646 
    647   a_m = fAdjust(a_m, &a_e);
    648   b_m = fAdjust(b_m, &b_e);
    649 
    650   if (a_e > b_e) {
    651     result_m = a_m + (b_m >> fMin(a_e - b_e, DFRACT_BITS - 1));
    652     result_e = a_e;
    653   } else {
    654     result_m = (a_m >> fMin(b_e - a_e, DFRACT_BITS - 1)) + b_m;
    655     result_e = b_e;
    656   }
    657 
    658   *pResult_e = result_e;
    659   return result_m;
    660 }
    661 
    662 inline FIXP_DBL fAddNorm(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e,
    663                          INT result_e) {
    664   FIXP_DBL result_m;
    665 
    666   a_m = scaleValue(a_m, a_e - result_e);
    667   b_m = scaleValue(b_m, b_e - result_e);
    668 
    669   result_m = a_m + b_m;
    670 
    671   return result_m;
    672 }
    673 #endif /* FUNCTION_fAddNorm */
    674 
    675 /**
    676  * \brief Divide 2 FIXP_DBL values with normalization of input values.
    677  * \param num numerator
    678  * \param denum denomintator
    679  * \return num/denum with exponent = 0
    680  */
    681 FIXP_DBL fDivNormHighPrec(FIXP_DBL L_num, FIXP_DBL L_denum, INT *result_e);
    682 
    683 #ifndef FUNCTION_fPow
    684 /**
    685  * \brief return 2 ^ (exp_m * 2^exp_e)
    686  * \param exp_m mantissa of the exponent to 2.0f
    687  * \param exp_e exponent of the exponent to 2.0f
    688  * \param result_e pointer to a INT where the exponent of the result will be
    689  * stored into
    690  * \return mantissa of the result
    691  */
    692 FIXP_DBL f2Pow(const FIXP_DBL exp_m, const INT exp_e, INT *result_e);
    693 
    694 /**
    695  * \brief return 2 ^ (exp_m * 2^exp_e). This version returns only the mantissa
    696  * with implicit exponent of zero.
    697  * \param exp_m mantissa of the exponent to 2.0f
    698  * \param exp_e exponent of the exponent to 2.0f
    699  * \return mantissa of the result
    700  */
    701 FIXP_DBL f2Pow(const FIXP_DBL exp_m, const INT exp_e);
    702 
    703 /**
    704  * \brief return x ^ (exp_m * 2^exp_e), where log2(x) = baseLd_m * 2^(baseLd_e).
    705  * This saves the need to compute log2() of constant values (when x is a
    706  * constant).
    707  * \param baseLd_m mantissa of log2() of x.
    708  * \param baseLd_e exponent of log2() of x.
    709  * \param exp_m mantissa of the exponent to 2.0f
    710  * \param exp_e exponent of the exponent to 2.0f
    711  * \param result_e pointer to a INT where the exponent of the result will be
    712  * stored into
    713  * \return mantissa of the result
    714  */
    715 FIXP_DBL fLdPow(FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e,
    716                 INT *result_e);
    717 
    718 /**
    719  * \brief return x ^ (exp_m * 2^exp_e), where log2(x) = baseLd_m * 2^(baseLd_e).
    720  * This saves the need to compute log2() of constant values (when x is a
    721  * constant). This version does not return an exponent, which is
    722  * implicitly 0.
    723  * \param baseLd_m mantissa of log2() of x.
    724  * \param baseLd_e exponent of log2() of x.
    725  * \param exp_m mantissa of the exponent to 2.0f
    726  * \param exp_e exponent of the exponent to 2.0f
    727  * \return mantissa of the result
    728  */
    729 FIXP_DBL fLdPow(FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e);
    730 
    731 /**
    732  * \brief return (base_m * 2^base_e) ^ (exp * 2^exp_e). Use fLdPow() instead
    733  * whenever possible.
    734  * \param base_m mantissa of the base.
    735  * \param base_e exponent of the base.
    736  * \param exp_m mantissa of power to be calculated of the base.
    737  * \param exp_e exponent of power to be calculated of the base.
    738  * \param result_e pointer to a INT where the exponent of the result will be
    739  * stored into.
    740  * \return mantissa of the result.
    741  */
    742 FIXP_DBL fPow(FIXP_DBL base_m, INT base_e, FIXP_DBL exp_m, INT exp_e,
    743               INT *result_e);
    744 
    745 /**
    746  * \brief return (base_m * 2^base_e) ^ N
    747  * \param base_m mantissa of the base
    748  * \param base_e exponent of the base
    749  * \param N power to be calculated of the base
    750  * \param result_e pointer to a INT where the exponent of the result will be
    751  * stored into
    752  * \return mantissa of the result
    753  */
    754 FIXP_DBL fPowInt(FIXP_DBL base_m, INT base_e, INT N, INT *result_e);
    755 #endif /* #ifndef FUNCTION_fPow */
    756 
    757 #ifndef FUNCTION_fLog2
    758 /**
    759  * \brief Calculate log(argument)/log(2) (logarithm with base 2). deprecated.
    760  * Use fLog2() instead.
    761  * \param arg mantissa of the argument
    762  * \param arg_e exponent of the argument
    763  * \param result_e pointer to an INT to store the exponent of the result
    764  * \return the mantissa of the result.
    765  * \param
    766  */
    767 FIXP_DBL CalcLog2(FIXP_DBL arg, INT arg_e, INT *result_e);
    768 
    769 /**
    770  * \brief calculate logarithm of base 2 of x_m * 2^(x_e)
    771  * \param x_m mantissa of the input value.
    772  * \param x_e exponent of the input value.
    773  * \param pointer to an INT where the exponent of the result is returned into.
    774  * \return mantissa of the result.
    775  */
    776 FDK_INLINE FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e, INT *result_e) {
    777   FIXP_DBL result_m;
    778 
    779   /* Short cut for zero and negative numbers. */
    780   if (x_m <= FL2FXCONST_DBL(0.0f)) {
    781     *result_e = DFRACT_BITS - 1;
    782     return FL2FXCONST_DBL(-1.0f);
    783   }
    784 
    785   /* Calculate log2() */
    786   {
    787     FIXP_DBL x2_m;
    788 
    789     /* Move input value x_m * 2^x_e toward 1.0, where the taylor approximation
    790        of the function log(1-x) centered at 0 is most accurate. */
    791     {
    792       INT b_norm;
    793 
    794       b_norm = fNormz(x_m) - 1;
    795       x2_m = x_m << b_norm;
    796       x_e = x_e - b_norm;
    797     }
    798 
    799     /* map x from log(x) domain to log(1-x) domain. */
    800     x2_m = -(x2_m + FL2FXCONST_DBL(-1.0));
    801 
    802     /* Taylor polynomial approximation of ln(1-x) */
    803     {
    804       FIXP_DBL px2_m;
    805       result_m = FL2FXCONST_DBL(0.0);
    806       px2_m = x2_m;
    807       for (int i = 0; i < LD_PRECISION; i++) {
    808         result_m = fMultAddDiv2(result_m, ldCoeff[i], px2_m);
    809         px2_m = fMult(px2_m, x2_m);
    810       }
    811     }
    812     /* Multiply result with 1/ln(2) = 1.0 + 0.442695040888 (get log2(x) from
    813      * ln(x) result). */
    814     result_m =
    815         fMultAddDiv2(result_m, result_m,
    816                      FL2FXCONST_DBL(2.0 * 0.4426950408889634073599246810019));
    817 
    818     /* Add exponent part. log2(x_m * 2^x_e) = log2(x_m) + x_e */
    819     if (x_e != 0) {
    820       int enorm;
    821 
    822       enorm = DFRACT_BITS - fNorm((FIXP_DBL)x_e);
    823       /* The -1 in the right shift of result_m compensates the fMultDiv2() above
    824        * in the taylor polynomial evaluation loop.*/
    825       result_m = (result_m >> (enorm - 1)) +
    826                  ((FIXP_DBL)x_e << (DFRACT_BITS - 1 - enorm));
    827 
    828       *result_e = enorm;
    829     } else {
    830       /* 1 compensates the fMultDiv2() above in the taylor polynomial evaluation
    831        * loop.*/
    832       *result_e = 1;
    833     }
    834   }
    835 
    836   return result_m;
    837 }
    838 
    839 /**
    840  * \brief calculate logarithm of base 2 of x_m * 2^(x_e)
    841  * \param x_m mantissa of the input value.
    842  * \param x_e exponent of the input value.
    843  * \return mantissa of the result with implicit exponent of LD_DATA_SHIFT.
    844  */
    845 FDK_INLINE FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e) {
    846   if (x_m <= FL2FXCONST_DBL(0.0f)) {
    847     x_m = FL2FXCONST_DBL(-1.0f);
    848   } else {
    849     INT result_e;
    850     x_m = fLog2(x_m, x_e, &result_e);
    851     x_m = scaleValue(x_m, result_e - LD_DATA_SHIFT);
    852   }
    853   return x_m;
    854 }
    855 
    856 #endif /* FUNCTION_fLog2 */
    857 
    858 #ifndef FUNCTION_fAddSaturate
    859 /**
    860  * \brief Add with saturation of the result.
    861  * \param a first summand
    862  * \param b second summand
    863  * \return saturated sum of a and b.
    864  */
    865 inline FIXP_SGL fAddSaturate(const FIXP_SGL a, const FIXP_SGL b) {
    866   LONG sum;
    867 
    868   sum = (LONG)(SHORT)a + (LONG)(SHORT)b;
    869   sum = fMax(fMin((INT)sum, (INT)MAXVAL_SGL), (INT)MINVAL_SGL);
    870   return (FIXP_SGL)(SHORT)sum;
    871 }
    872 
    873 /**
    874  * \brief Add with saturation of the result.
    875  * \param a first summand
    876  * \param b second summand
    877  * \return saturated sum of a and b.
    878  */
    879 inline FIXP_DBL fAddSaturate(const FIXP_DBL a, const FIXP_DBL b) {
    880   LONG sum;
    881 
    882   sum = (LONG)(a >> 1) + (LONG)(b >> 1);
    883   sum = fMax(fMin((INT)sum, (INT)(MAXVAL_DBL >> 1)), (INT)(MINVAL_DBL >> 1));
    884   return (FIXP_DBL)(LONG)(sum << 1);
    885 }
    886 #endif /* FUNCTION_fAddSaturate */
    887 
    888 INT fixp_floorToInt(FIXP_DBL f_inp, INT sf);
    889 FIXP_DBL fixp_floor(FIXP_DBL f_inp, INT sf);
    890 
    891 INT fixp_ceilToInt(FIXP_DBL f_inp, INT sf);
    892 FIXP_DBL fixp_ceil(FIXP_DBL f_inp, INT sf);
    893 
    894 INT fixp_truncateToInt(FIXP_DBL f_inp, INT sf);
    895 FIXP_DBL fixp_truncate(FIXP_DBL f_inp, INT sf);
    896 
    897 INT fixp_roundToInt(FIXP_DBL f_inp, INT sf);
    898 FIXP_DBL fixp_round(FIXP_DBL f_inp, INT sf);
    899 
    900 /*****************************************************************************
    901 
    902  array for 1/n, n=1..80
    903 
    904 ****************************************************************************/
    905 
    906 extern const FIXP_DBL invCount[80];
    907 
    908 LNK_SECTION_INITCODE
    909 inline void InitInvInt(void) {}
    910 
    911 /**
    912  * \brief Calculate the value of 1/i where i is a integer value. It supports
    913  *        input values from 1 upto (80-1).
    914  * \param intValue Integer input value.
    915  * \param FIXP_DBL representation of 1/intValue
    916  */
    917 inline FIXP_DBL GetInvInt(int intValue) {
    918   return invCount[fMin(fMax(intValue, 0), 80 - 1)];
    919 }
    920 
    921 #endif /* FIXPOINT_MATH_H */
    922