LCOV - code coverage report
Current view: top level - lib_com - basop_util.h (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 12 12 100.0 %
Date: 2025-06-27 02:59:36 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #ifndef __BASOP_UTIL_H__
      38             : #define __BASOP_UTIL_H__
      39             : 
      40             : #include <stdint.h>
      41             : #include "options.h"
      42             : #include "basop_settings.h"
      43             : #include "typedef.h"
      44             : #include "basop32.h"
      45             : #include "math_32.h"
      46             : #include "log2.h"
      47             : 
      48             : #define LD_DATA_SCALE ( 6 )
      49             : 
      50             : #define LD_DATA_SHIFT_I5 ( 7 )
      51             : 
      52             : #define modDiv2( x ) sub( x, shl( shr( x, 1 ), 1 ) )
      53             : #define modDiv8( x ) L_sub( x, L_shl( L_shr( x, 3 ), 3 ) )
      54             : 
      55             : // basop_mpy.h
      56             : #define MUL_F( A, B ) Mpy_32_16_1( ( A ), ( B ) )
      57             : 
      58             : #ifndef CHEAP_NORM_SIZE
      59             : #define CHEAP_NORM_SIZE 161
      60             : #endif
      61             : 
      62        9300 : static __inline Word16 limitScale16( Word16 s )
      63             : {
      64             :     /* It is assumed, that s is calculated just before, therefore we can switch upon sign */
      65        9300 :     if ( s >= 0 )
      66        8817 :         s = s_min( s, WORD16_BITS - 1 );
      67        9300 :     if ( s < 0 )
      68         483 :         s = s_max( s, 1 - WORD16_BITS );
      69        9300 :     return ( s );
      70             : }
      71             : 
      72      674700 : static __inline Word16 limitScale32( Word16 s )
      73             : {
      74             :     /* It is assumed, that s is calculated just before, therefore we can switch upon sign */
      75      674700 :     if ( s >= 0 )
      76      671065 :         s = s_min( s, WORD32_BITS - 1 );
      77      674700 :     if ( s < 0 )
      78        3635 :         s = s_max( s, 1 - WORD32_BITS );
      79      674700 :     return ( s );
      80             : }
      81             : 
      82             : 
      83             : /*!**********************************************************************
      84             :    \brief   Add two values given by mantissa and exponent.
      85             : 
      86             :    Mantissas are in 16-bit-fractional format with values between 0 and 1. <br>
      87             :    The base for exponents is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
      88             : 
      89             : ************************************************************************/
      90             : Word16 BASOP_Util_Add_MantExp /*!< Exponent of result        */
      91             :     ( Word16 a_m,             /*!< Mantissa of 1st operand a */
      92             :       Word16 a_e,             /*!< Exponent of 1st operand a */
      93             :       Word16 b_m,             /*!< Mantissa of 2nd operand b */
      94             :       Word16 b_e,             /*!< Exponent of 2nd operand b */
      95             :       Word16 *ptrSum_m );     /*!< Mantissa of result */
      96             : 
      97             : /************************************************************************/
      98             : /*!
      99             :    \brief   Divide two values given by mantissa and exponent.
     100             : 
     101             :    Mantissas are in 16-bit-fractional format with values between 0 and 1. <br>
     102             :    The base for exponents is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     103             : 
     104             :    For performance reasons, the division is based on a table lookup
     105             :    which limits accuracy.
     106             : */
     107             : void BASOP_Util_Divide_MantExp( Word16 a_m,          /*!< Mantissa of dividend a */
     108             :                                 Word16 a_e,          /*!< Exponent of dividend a */
     109             :                                 Word16 b_m,          /*!< Mantissa of divisor b */
     110             :                                 Word16 b_e,          /*!< Exponent of divisor b */
     111             :                                 Word16 *ptrResult_m, /*!< Mantissa of quotient a/b */
     112             :                                 Word16 *ptrResult_e  /*!< Exponent of quotient a/b */
     113             : );
     114             : 
     115             : /************************************************************************/
     116             : /*!
     117             :   \brief   Calculate the squareroot of a number given by mantissa and exponent
     118             : 
     119             :   Mantissa is in 16/32-bit-fractional format with values between 0 and 1. <br>
     120             :   For *norm versions mantissa has to be between 0.5 and 1. <br>
     121             :   The base for the exponent is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     122             :   The exponent is addressed via pointers and will be overwritten with the result.
     123             : */
     124             : Word16 Sqrt16(                  /*!< output mantissa */
     125             :                Word16 mantissa, /*!< input mantissa */
     126             :                Word16 *exponent /*!< pointer to exponent */
     127             : );
     128             : 
     129             : Word16 Sqrt16norm(                  /*!< output mantissa */
     130             :                    Word16 mantissa, /*!< normalized input mantissa */
     131             :                    Word16 *exponent /*!< pointer to exponent */
     132             : );
     133             : 
     134             : Word32 Sqrt32(                  /*!< output mantissa */
     135             :                Word32 mantissa, /*!< input mantissa */
     136             :                Word16 *exponent /*!< pointer to exponent */
     137             : );
     138             : 
     139             : 
     140             : /* deprecated, use Sqrt16! */
     141             : void BASOP_Util_Sqrt_MantExp( Word16 *mantissa, /*!< Pointer to mantissa */
     142             :                               Word16 *exponent  /*!< Pointer to exponent */
     143             : );
     144             : 
     145             : /* deprecated, use Sqrt16norm! */
     146             : void BASOP_Util_Sqrt_MantExpNorm( Word16 *mantissa, /*!< Pointer to normalized mantissa */
     147             :                                   Word16 *exponent  /*!< Pointer to exponent */
     148             : );
     149             : 
     150             : /****************************************************************************/
     151             : /*!
     152             :   \brief   Calculate the inverse of the squareroot of a number given by mantissa and exponent
     153             : 
     154             :   Mantissa is in 16/32-bit-fractional format with values between 0 and 1. <br>
     155             :   For *norm versions mantissa has to be between 0.5 and 1. <br>
     156             :   The base for the exponent is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     157             :   The exponent is addressed via pointers and will be overwritten with the result.
     158             : */
     159             : Word16 ISqrt16(                  /*!< output mantissa */
     160             :                 Word16 mantissa, /*!< input mantissa */
     161             :                 Word16 *exponent /*!< pointer to exponent */
     162             : );
     163             : 
     164             : Word32 ISqrt32(                  /*!< output mantissa */
     165             :                 Word32 mantissa, /*!< input mantissa */
     166             :                 Word16 *exponent /*!< pointer to exponent */
     167             : );
     168             : 
     169             : Word32 ISqrt32norm(                  /*!< output mantissa */
     170             :                     Word32 mantissa, /*!< normalized input mantissa */
     171             :                     Word16 *exponent /*!< pointer to exponent */
     172             : );
     173             : 
     174             : /* deprecated, use ISqrt16! */
     175             : void BASOP_Util_InvSqrt_MantExp( Word16 *mantissa, /*!< Pointer to mantissa */
     176             :                                  Word16 *exponent  /*!< Pointer to exponent */
     177             : );
     178             : 
     179             : /*****************************************************************************/
     180             : /*!
     181             :   \brief   Calculate the inverse of a number given by mantissa and exponent
     182             : 
     183             :   Mantissa is in 16-bit-fractional format with values between 0 and 1. <br>
     184             :   The base for the exponent is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     185             :   The operand is addressed via pointers and will be overwritten with the result.
     186             : 
     187             :   The function uses a table lookup and a newton iteration.
     188             : */
     189             : Word16 Inv16(                  /*!< output mantissa */
     190             :               Word16 mantissa, /*!< input mantissa */
     191             :               Word16 *exponent /*!< pointer to exponent */
     192             : );
     193             : 
     194             : /******************************************************************************/
     195             : /*!
     196             :   \brief   Calculate the squareroot and inverse of squareroot of a number given by mantissa and exponent
     197             : 
     198             :   Mantissa is in 16-bit-fractional format with values between 0 and 1. <br>
     199             :   The base for the exponent is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     200             : */
     201             : void BASOP_Util_Sqrt_InvSqrt_MantExp( Word16 mantissa,    /*!< mantissa */
     202             :                                       Word16 exponent,    /*!< expoinent */
     203             :                                       Word16 *sqrt_mant,  /*!< Pointer to sqrt mantissa */
     204             :                                       Word16 *sqrt_exp,   /*!< Pointer to sqrt exponent */
     205             :                                       Word16 *isqrt_mant, /*!< Pointer to 1/sqrt mantissa */
     206             :                                       Word16 *isqrt_exp   /*!< Pointer to 1/sqrt exponent */
     207             : );
     208             : 
     209             : /********************************************************************/
     210             : /*!
     211             :   \brief   Calculates the scalefactor needed to normalize input array
     212             : 
     213             :     The scalefactor needed to normalize the Word16 input array is returned <br>
     214             :     If the input array contains only '0', a scalefactor 0 is returned <br>
     215             :     Scaling factor is determined wrt a normalized target x: 16384 <= x <= 32767 for positive x <br>
     216             :     and   -32768 <= x <= -16384 for negative x
     217             : */
     218             : 
     219             : Word16 getScaleFactor16(                       /* o: measured headroom in range [0..15], 0 if all x[i] == 0 */
     220             :                          const Word16 *x,      /* i: array containing 16-bit data */
     221             :                          const Word16 len_x ); /* i: length of the array to scan  */
     222             : 
     223             : /********************************************************************/
     224             : /*!
     225             :   \brief   Calculates the scalefactor needed to normalize input array
     226             : 
     227             :     The scalefactor needed to normalize the Word32 input array is returned <br>
     228             :     If the input array contains only '0', a scalefactor 0 is returned <br>
     229             :     Scaling factor is determined wrt a normalized target x: 1073741824 <= x <= 2147483647 for positive x <br>
     230             :     and   -2147483648 <= x <= -1073741824 for negative x
     231             : */
     232             : 
     233             : /*! r: measured headroom in range [0..31], 0 if all x[i] == 0 */
     234             : Word16 getScaleFactor32(
     235             :     const Word32 *x,      /* i  : array containing 32-bit data */
     236             :     const Word16 len_x ); /* i  : length of the array to scan  */
     237             : 
     238             : Word16 getScaleFactor32_copy(                       /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */
     239             :                               const Word32 *x,      /* i: array containing 32-bit data */
     240             :                               const Word32 len_x ); /* i: length of the array to scan  */
     241             : 
     242             : /**
     243             :  * \brief normalize mantissa and update the exponent accordingly.
     244             :  * \param mantissa the mantissa to be normalized
     245             :  * \param pexponent pointer to the exponent.
     246             :  * \return the normalized mantissa.
     247             :  */
     248             : Word16 normalize16( Word16 mantissa, Word16 *pexponent );
     249             : /****************************************************************************/
     250             : /*!
     251             :   \brief   Does fractional integer division of Word32 arg1 by Word16 arg2
     252             : 
     253             :   both input arguments may be positive or negative <br>
     254             :   the result is truncated to Word16
     255             : 
     256             :   \return fractional integer Word16 result of arg1/arg2
     257             : */
     258             : Word16 divide3216( Word32 x,   /*!< Numerator*/
     259             :                    Word16 y ); /*!< Denominator*/
     260             : 
     261             : 
     262             : /****************************************************************************/
     263             : /*!
     264             :   \brief   Does fractional integer division of Word16 arg1 by Word16 arg2
     265             : 
     266             :   both input arguments may be positive or negative <br>
     267             :   the result is truncated to Word16
     268             : 
     269             :   \return fractional integer Word16 result of arg1/arg2
     270             : */
     271             : Word16 divide1616( Word16 x,   /*!< Numerator*/
     272             :                    Word16 y ); /*!< Denominator*/
     273             : 
     274             : 
     275             : /****************************************************************************/
     276             : /*!
     277             :   \brief   Does fractional integer division of Word32 arg1 by Word32 arg2
     278             : 
     279             :    this function makes both the numerator and the denominator positive integers,
     280             :    and scales up both values to avoid losing the accuracy of the outcome
     281             :    too much
     282             : 
     283             :    WARNING: it should be arg1 < arg2 because of the maximum degree of scaling for the mantissa!
     284             : 
     285             :   \return fractional Word16 integer z = arg1(32bits)/arg2(32bits)
     286             : */
     287             : Word16 divide3232( Word32 x,   /*!< Numerator*/
     288             :                    Word32 y ); /*!< Denominator*/
     289             : 
     290             : 
     291             : /****************************************************************************/
     292             : /*!
     293             :   \brief   Does fractional integer division of UWord32 arg1 by UWord32 arg2
     294             : 
     295             :    This function ensures both the numerator  and the denominator are positive integers,
     296             :    and scales up both values to avoid losing the accuracy of the outcome
     297             :    too much.<br>
     298             : 
     299             :    CAUTION: Arg 3 is a Word16 pointer which will point to the scalefactor difference
     300             :    s_diff = sub(s2,s1), where s1 and s2 are the scalefactors of the arguments, which
     301             :    were shifted in order to e.g. preserve accuracy.
     302             :    I.e. the result has to be scaled due to shifting it
     303             :    s_diff to the right to obtain the real result of the division.
     304             : 
     305             :   \return fractional Word16 integer z = arg1(32bits)/arg2(32bits)
     306             : */
     307             : Word16 BASOP_Util_Divide3232_uu_1616_Scale( Word32 x,    /*!< i  : Numerator*/
     308             :                                             Word32 y,    /*!< i  : Denominator*/
     309             :                                             Word16 *s ); /*!< o  : Additional scalefactor difference*/
     310             : 
     311             : 
     312             : /****************************************************************************/
     313             : /*!
     314             :   \brief   Does fractional integer division of Word32 arg1 by Word32 arg2
     315             : 
     316             :    This function scales up both values to avoid losing the accuracy of the outcome
     317             :    too much.<br>
     318             : 
     319             :    CAUTION: Arg 3 is a Word16 pointer which will point to the scalefactor difference
     320             :    s_diff = sub(s2,s1), where s1 and s2 are the scalefactors of the arguments, which
     321             :    were shifted in order to e.g. preserve accuracy.
     322             :    I.e. the result has to be scaled due to shifting it
     323             :    s_diff to the right to obtain the real result of the division.
     324             : 
     325             :   \return fractional Word16 integer z = arg1(32bits)/arg2(32bits)
     326             : */
     327             : Word16 BASOP_Util_Divide3232_Scale( Word32 x,    /*!< i  : Numerator*/
     328             :                                     Word32 y,    /*!< i  : Denominator*/
     329             :                                     Word16 *s ); /*!< o  : Additional scalefactor difference*/
     330             : 
     331             : Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x,    /*!< i  : Numerator*/
     332             :                                             Word32 y,    /*!< i  : Denominator*/
     333             :                                             Word16 *s ); /*!< o  : Additional scalefactor difference*/
     334             : 
     335             : 
     336             : Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x,    /*!< i  : Numerator*/
     337             :                                            Word32 y,    /*!< i  : Denominator*/
     338             :                                            Word16 *s ); /*!< o  : Additional scalefactor difference*/
     339             : 
     340             : 
     341             : /************************************************************************/
     342             : /*!
     343             :   \brief     Binary logarithm with 7 iterations
     344             : 
     345             :   \param     x
     346             : 
     347             :   \return log2(x)/64
     348             :  */
     349             : /************************************************************************/
     350             : Word32 BASOP_Util_Log2( Word32 x );
     351             : Word32 BASOP_Util_Log10( Word32 x, Word16 e );
     352             : Word32 BASOP_Util_Loge( Word32 x, Word16 e );
     353             : 
     354             : 
     355             : /****************************************************************************/
     356             : /*!
     357             :   \brief   Does fractional division of Word16 arg1 by Word16 arg2
     358             : 
     359             : 
     360             :   \return fractional Q15 Word16 z = arg1(Q15)/arg2(Q15)  with scaling s
     361             : */
     362             : Word16 BASOP_Util_Divide1616_Scale( Word16 x,    /* i  : Numerator*/
     363             :                                     Word16 y,    /* i  : Denominator*/
     364             :                                     Word16 *s ); /* o  : Additional scalefactor difference*/
     365             : 
     366             : /****************************************************************************/
     367             : /*!
     368             :   \brief   Does fractional integer division of Word32 arg1 by Word16 arg2
     369             : 
     370             : 
     371             :   \return fractional Word16 integer z = arg1(32bits)/arg2(16bits), z not normalized
     372             : */
     373             : Word16 BASOP_Util_Divide3216_Scale( Word32 x,    /*!< i  : Numerator  */
     374             :                                     Word16 y,    /*!< i  : Denominator*/
     375             :                                     Word16 *s ); /*!< o  : Additional scalefactor difference*/
     376             : 
     377             : 
     378             : /************************************************************************/
     379             : /*!
     380             :  * \brief    Binary logarithm with 5 iterations
     381             :  *
     382             :  * \param[i] val
     383             :  *
     384             :  * \return basop_log2(val)/128
     385             :  */
     386             : /************************************************************************/
     387             : Word32 BASOP_Util_log2_i5( Word32 val );
     388             : 
     389             : /************************************************************************/
     390             : /*!
     391             :   \brief     Binary power
     392             : 
     393             :   Date: 06-JULY-2012 Arthur Tritthart, IIS Fraunhofer Erlangen
     394             : 
     395             :   Version with 3 table lookup and 1 linear interpolations
     396             : 
     397             :   Algorithm: compute power of 2, argument x is in Q7.25 format
     398             :              result = 2^(x/64)
     399             :              We split exponent (x/64) into 5 components:
     400             :              integer part:      represented by b31..b25  (exp)
     401             :              fractional part 1: represented by b24..b20  (lookup1)
     402             :              fractional part 2: represented by b19..b15  (lookup2)
     403             :              fractional part 3: represented by b14..b10  (lookup3)
     404             :              fractional part 4: represented by b09..b00  (frac)
     405             :              => result = (lookup1*lookup2*(lookup3+C1*frac)<<3)>>exp
     406             : 
     407             :   Due to the fact, that all lookup values contain a factor 0.5
     408             :   the result has to be shifted by 3 to the right also.
     409             :   Table exp2_tab_long contains the log2 for 0 to 1.0 in steps
     410             :   of 1/32, table exp2w_tab_long the log2 for 0 to 1/32 in steps
     411             :   of 1/1024, table exp2x_tab_long the log2 for 0 to 1/1024 in
     412             :   steps of 1/32768. Since the 2-logarithm of very very small
     413             :   negative value is rather linear, we can use interpolation.
     414             : 
     415             :   Limitations:
     416             : 
     417             :   For x <= 0, the result is fractional positive
     418             :   For x > 0, the result is integer in range 1...7FFF.FFFF
     419             :   For x < -31/64, we have to clear the result
     420             :   For x = 0, the result is ~1.0 (0x7FFF.FFFF)
     421             :   For x >= 31/64, the result is 0x7FFF.FFFF
     422             : 
     423             :   \param  x
     424             : 
     425             :   \return pow(2,(x/64))
     426             :  */
     427             : /************************************************************************/
     428             : Word32 BASOP_Util_InvLog2( Word32 x );
     429             : 
     430             : Word16 BASOP_util_norm_s_bands2shift( Word16 x );
     431             : 
     432             : 
     433             : /***********************************************************************/
     434             : /*!
     435             :   \brief        Calculate the headroom of the complex data in a 2 dimensional array
     436             : 
     437             :   \return number of headroom bits
     438             :  */
     439             : Word16 BASOP_util_norm_l_dim2_cplx( const Word32 *const *re, /*!< Real part of 32 Bit input */
     440             :                                     const Word32 *const *im, /*!< Imag part if 32 Bit input */
     441             :                                     Word16 startBand,        /*!< start band of cplx data   */
     442             :                                     Word16 stopBand,         /*!< stop band of cplx data    */
     443             :                                     Word16 startSlot,        /*!< start slot of cplx data   */
     444             :                                     Word16 stopSlot          /*!< stop slot of cplx data    */
     445             : );
     446             : /****************************************************************************/
     447             : /*!
     448             :   \brief   Does a data copy of Word8 *arg1 to Word8 *arg2 with Word16 arg3 number of moves
     449             : */
     450             : void copyWord8( const Word8 *src, /*!< i  : Source address             */
     451             :                 Word8 *dst,       /*!< i  : Destination address        */
     452             :                 const Word32 n ); /*!< i  : Number of elements to copy */
     453             : 
     454             : 
     455             : /****************************************************************************/
     456             : /*!
     457             :   \brief   Sets Word8 array arg1[] to zero for a length of Word16 arg2 elements
     458             : */
     459             : void set_zero_Word8( Word8 X[],  /*!< i  : Address of array                   */
     460             :                      Word32 n ); /*!< i  : Number of elements to set to zero  */
     461             : 
     462             : /****************************************************************************/
     463             : /*!
     464             :   \brief    Does a multiplication of Word32 * Word16 input values
     465             : 
     466             :   \return   z32 = x32 * y16
     467             : */
     468             : Word32 L_mult0_3216( Word32 x,   /*!<   : Multiplier     */
     469             :                      Word16 y ); /*!<   : Multiplicand   */
     470             : 
     471             : /* Calculate sin/cos. Angle in 2Q13 format, result has exponent = 1 */
     472             : Word16 getCosWord16( Word16 theta );
     473             : Word16 getSinWord16( Word16 theta );
     474             : Word32 getCosWord32( Word32 theta );
     475             : /**
     476             :  * \brief calculate cosine of angle. Tuned for ISF domain.
     477             :  * \param theta Angle normalized to radix 2, theta = (angle in radians)*2.0/pi
     478             :  * \return result with exponent 0.
     479             :  */
     480             : Word16 getCosWord16R2( Word16 theta );
     481             : Word16 getSineWord16R2( Word16 theta );
     482             : /****************************************************************************/
     483             : /*!
     484             :   \brief Sets Array Word16 arg1 to value Word16 arg2 for Word16 arg3 elements
     485             : */
     486             : void set_val_Word16( Word16 X[],       /*!< Address of array               */
     487             :                      const Word16 val, /*!< Value to copy into array       */
     488             :                      Word16 n );       /*!< Number of elements to process  */
     489             : 
     490             : 
     491             : /****************************************************************************/
     492             : /*!
     493             :   \brief Sets Array Word32 arg1 to value Word32 arg2 for Word16 arg3 elements
     494             : */
     495             : void set_val_Word32( Word32 X[],       /*!< Address of array               */
     496             :                      const Word32 val, /*!< Value to copy into array       */
     497             :                      Word16 n );       /*!< Number of elements to process  */
     498             : 
     499             : /****************************************************************************/
     500             : /*!
     501             :   \brief    Does a multiplication of Word16 input values
     502             : 
     503             :   \return   z16 = x16 * y16
     504             : */
     505             : Word16 mult0( Word16 x,   /* i  : Multiplier    */
     506             :               Word16 y ); /* i  : Multiplicand  */
     507             : 
     508             : /**
     509             :  * \brief calculate cosine of angle. Tuned for ISF domain.
     510             :  * \param theta Angle normalized to radix 2, theta = (angle in radians)*2.0/pi
     511             :  * \return result with exponent 0.
     512             :  */
     513             : Word16 getCosWord16R2( Word16 theta );
     514             : 
     515             : 
     516             : /****************************************************************************/
     517             : /*!
     518             :   \brief    square root abacus algorithm
     519             : 
     520             :   \return integer sqrt(x)
     521             :  */
     522             : Word16 getSqrtWord32( Word32 x );
     523             : 
     524             : /****************************************************************************/
     525             : /*!
     526             :   \brief    finds index of min Word16 in array
     527             : 
     528             :   \return   index of min Word16
     529             :  */
     530             : Word16 findIndexOfMinWord16( Word16 *x, const Word16 len );
     531             : 
     532             : /****************************************************************************/
     533             : /*!
     534             :   \brief    finds index of min Word32 in array
     535             : 
     536             :   \return   index of min Word32
     537             :  */
     538             : Word16 findIndexOfMinWord32( Word32 *x, const Word16 len );
     539             : Word16 findIndexOfMinWord64( Word64 *x, const Word16 len );
     540             : 
     541             : /****************************************************************************/
     542             : /*!
     543             :   \brief    finds index of max Word16 in array
     544             : 
     545             :   \return   index of max Word16
     546             :  */
     547             : Word16 findIndexOfMaxWord16( Word16 *x, const Word16 len );
     548             : 
     549             : /****************************************************************************/
     550             : /*!
     551             :   \brief    finds index of max Word32 in array
     552             : 
     553             :   \return   index of max Word32
     554             :  */
     555             : Word16 findIndexOfMaxWord32( Word32 *x, const Word16 len );
     556             : 
     557             : /****************************************************************************/
     558             : /*!
     559             :   \brief    16x16->16 integer multiplication without overflow control
     560             : 
     561             :   \return 16x16->16 integer
     562             :  */
     563             : Word16 imult1616( Word16 x, Word16 y );
     564             : 
     565             : /****************************************************************************/
     566             : /*!
     567             :   \brief    32x16->32 integer multiplication with overflow control
     568             : 
     569             :   \return 32x16->32 integer
     570             :  */
     571             : Word32 imult3216( Word32 x, Word16 y );
     572             : 
     573             : /****************************************************************************/
     574             : /*!
     575             :   \brief    16/16->16 unsigned integer division
     576             : 
     577             :   x and y have to be positive, x has to be < 16384
     578             : 
     579             :   \return 16/16->16 integer
     580             :  */
     581             : 
     582             : Word16 idiv1616U_IVAS( Word16 x, Word16 y );
     583             : Word16 idiv1616U( Word16 x, Word16 y );
     584             : 
     585             : /****************************************************************************/
     586             : /*!
     587             :   \brief    16/16->16 signed integer division
     588             : 
     589             :   x and y have to be positive, x has to be < 16384
     590             : 
     591             :   \return 16/16->16 integer
     592             :  */
     593             : 
     594             : Word16 idiv1616( Word16 x, Word16 y );
     595             : 
     596             : Word16 idiv1616_1( Word16 x, Word16 y );
     597             : 
     598             : /*------------------------------------------------------------------*
     599             :  * Dot_product16HQ:
     600             :  *
     601             :  * \brief Compute scalar product of <x[],y[]> using 64-bit accumulator.
     602             :  *
     603             :  * Performs normalization of the result, returns the exponent
     604             :  * Note: In contrast to dotWord32, no headroom is required for data
     605             :  *       in x[] and y[], means, they may have any format Qn
     606             :  *------------------------------------------------------------------*/
     607             : Word32 Dot_product16HQ(                     /*<! o : normalized result              Q31 */
     608             :                         const Word32 L_off, /*<! i : initial sum value               Qn */
     609             :                         const Word16 x[],   /*<! i : x vector                        Qn */
     610             :                         const Word16 y[],   /*<! i : y vector                        Qn */
     611             :                         const Word16 lg,    /*<! i : vector length, range [0..7FFF]  Q0 */
     612             :                         Word16 *exp         /*<! o : exponent of result in [-32,31]  Q0 */
     613             : );
     614             : 
     615             : /*------------------------------------------------------------------*
     616             :  * norm_llQ31:
     617             :  *
     618             :  * \brief Compute normalized Q31 Values out of overflowed Q31 value
     619             :  *
     620             :  * Performs the calculation of a normalized Q31 Value with its
     621             :  * scalingfactor, taking into account the overflowed Q31 input value
     622             :  * and the number of Carrys, collected.
     623             :  *------------------------------------------------------------------*/
     624             : Word32 norm_llQ31(               /* o : normalized result              Q31 */
     625             :                    Word32 L_c,   /* i : upper bits of accu             Q-1 */
     626             :                    Word32 L_sum, /* i : lower bits of accu, unsigned   Q31 */
     627             :                    Word16 *exp   /* o : exponent of result in [-32,31]  Q0 */
     628             : );
     629             : 
     630             : /**
     631             :  * \brief Compute dot product of 1 32 bit vectors with itself
     632             :  * \param x input vector 1
     633             :  * \param headroom amount of headroom bits the input vector
     634             :  * \param length the length of the input vector
     635             :  * \param result_e pointer to where the exponent of the result will be stored into
     636             :  * \return the dot product of x and x.
     637             :  */
     638             : Word32 Norm32Norm( const Word32 *x, const Word16 headroom, const Word16 length, Word16 *result_e );
     639             : 
     640             : 
     641             : /*------------------------------------------------------------------*
     642             :  * Dot_productSq16HQ:
     643             :  *
     644             :  * \brief Compute scalar product of <x[],x[]> using 64-bit accumulator.
     645             :  *
     646             :  * Performs normalization of the result, returns the exponent
     647             :  * Note: In contrast to dotWord32, no headroom is required for data
     648             :  *       in x[], means, they may have any format Qn
     649             :  *------------------------------------------------------------------*/
     650             : Word32 Dot_productSq16HQ(                     /*<! o : normalized result              Q31 */
     651             :                           const Word32 L_off, /*<! i : initial sum value               Qn */
     652             :                           const Word16 x[],   /*<! i : x vector                        Qn */
     653             :                           const Word16 lg,    /*<! i : vector length, range [0..7FFF]  Q0 */
     654             :                           Word16 *exp         /*<! o : exponent of result in [-32,31]  Q0 */
     655             : );
     656             : /*------------------------------------------------------------------*
     657             :  * dotp_s_fx:
     658             :  *
     659             :  * \brief Compute scalar product of <x[],y[]> using 64-bit accumulator.
     660             :  *
     661             :  * Performs no normalization of the result
     662             :  *------------------------------------------------------------------*/
     663             : Word32 dotp_s_fx(                  /*<! o  : dot product of vector x and y 16Q15 */
     664             :                   const Word16 *x, /*<! i  : vector x                       6Q9  */
     665             :                   const Word16 *y, /*<! i  : vector y                       6Q9  */
     666             :                   const Word16 n,  /*<! i  : vector length                   Q0  */
     667             :                   Word16 s         /*<! i  : headroom                        Q0  */
     668             : );
     669             : 
     670             : /**
     671             :  * \brief return 2 ^ (exp * 2^exp_e)
     672             :  * \param exp_m mantissa of the exponent to 2.0f
     673             :  * \param exp_e exponent of the exponent to 2.0f
     674             :  * \param result_e pointer to a INT where the exponent of the result will be stored into
     675             :  * \return mantissa of the result
     676             :  */
     677             : Word32 BASOP_util_Pow2(
     678             :     const Word32 exp_m,
     679             :     const Word16 exp_e,
     680             :     Word16 *result_e );
     681             : 
     682             : 
     683             : Word32 Isqrt_lc1(
     684             :     Word32 frac, /* i  : Q31: normalized value (1.0 < frac <= 0.5) */
     685             :     Word16 *exp  /* i/o: exponent (value = frac x 2^exponent)      */
     686             : );
     687             : 
     688             : /**
     689             :  * \brief return 1/x
     690             :  * \param x index of lookup table
     691             :  * \return Word16 value of 1/x
     692             :  */
     693             : Word16 getNormReciprocalWord16( Word16 x );
     694             : 
     695             : /**
     696             :  * \brief return (1/x) << s
     697             :  * \param x index of lookup table
     698             :  * \param s shift factor
     699             :  * \return Word16 value of (1/x) << s
     700             :  */
     701             : Word16 getNormReciprocalWord16Scale( Word16 x, Word16 s );
     702             : 
     703             : 
     704             : /*************************************************************************
     705             :  *
     706             :  *   FUNCTION:   BASOP_Util_fPow()
     707             :  */
     708             : /**
     709             :  * \brief BASOP_Util_fPow
     710             :  *
     711             :  *   PURPOSE:   Computes pow(base_m, base_e, exp_m, exp_e), where base_m and base_e
     712             :  *              specify the base, and exp_m and exp_e specify the exponent.
     713             :  *              The result is returned in a mantissa and exponent representation.
     714             :  *
     715             :  *   DESCRIPTION:
     716             :  *        The function BASOP_Util_fPow(L_x) calculates the power function by
     717             :  *        calculating 2 ^ (log2(base)*exp)
     718             :  *
     719             :  * \param base_m mantissa of base
     720             :  * \param base_e exponent of base
     721             :  * \param exp_m mantissa of exponent
     722             :  * \param exp_e exponent of exponent
     723             :  * \param result_e pointer to exponent of result
     724             :  * \return Word32 mantissa of result
     725             :  *
     726             :  *************************************************************************/
     727             : 
     728             : Word32 BASOP_Util_fPow( /* o  : mantissa of result                                              */
     729             :                         Word32 base_m,
     730             :                         Word16 base_e, /* i  : input value for base (mantissa and exponent)                    */
     731             :                         Word32 exp_m,
     732             :                         Word16 exp_e,    /* i  : input value for exponent (mantissa and exponent)                */
     733             :                         Word16 *result_e /* o  : output pointer to exponent of result                            */
     734             : );
     735             : 
     736             : /*___________________________________________________________________________
     737             :  |                                                                           |
     738             :  |   Function Name : Dot_product12_offs()                                    |
     739             :  |                                                                           |
     740             :  |       Compute scalar product of <x[],y[]> using accumulator.              |
     741             :  |       The parameter 'L_off' is added to the accumulation result.          |
     742             :  |       The result is normalized (in Q31) with exponent (0..30).            |
     743             :  |   Notes:                                                                  |
     744             :  |       o  data in x[],y[] must provide enough headroom for accumulation    |
     745             :  |       o  L_off must correspond in format with product of x,y              |
     746             :  |          Example: 0.01f for Q9 x Q9: 0x0000147B in Q19                    |
     747             :  |                   means: L_off = FL2WORD32_SCALE(0.01f,31-19)             |
     748             :  |---------------------------------------------------------------------------|
     749             :  |  Algorithm:                                                               |
     750             :  |                                                                           |
     751             :  |       dot_product = L_off + sum(x[i]*y[i])     i=0..N-1                   |
     752             :  |___________________________________________________________________________|
     753             : */
     754             : 
     755             : Word32 Dot_product12_offs(                   /* (o) Q31: normalized result (1 < val <= -1) */
     756             :                            const Word16 x[], /* (i) 12bits: x vector                       */
     757             :                            const Word16 y[], /* (i) 12bits: y vector                       */
     758             :                            const Word16 lg,  /* (i)    : vector length in range [1..256]   */
     759             :                            Word16 *exp,      /* (o)    : exponent of result (0..+30)       */
     760             :                            Word32 L_off      /* (i) initial summation offset /2              */
     761             : );
     762             : 
     763             : Word32 Dot_product15_offs(                   /* (o) Q31: normalized result (1 < val <= -1) */
     764             :                            const Word16 x[], /* (i) 15bits: x vector                       */
     765             :                            const Word16 y[], /* (i) 15bits: y vector                       */
     766             :                            const Word16 lg,  /* (i)    : vector length in range [1..256]   */
     767             :                            Word16 *exp,      /* (o)    : exponent of result (0..+30)       */
     768             :                            Word32 L_off      /* (i) initial summation offset               */
     769             : );
     770             : 
     771             : /*!**********************************************************************
     772             :    \brief   Add two values given by mantissa and exponent.
     773             : 
     774             :    Mantissas are in 32-bit-fractional format with values between 0 and 1. <br>
     775             :    The base for exponents is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     776             : 
     777             : ************************************************************************/
     778             : Word32 BASOP_Util_Add_Mant32Exp /* o  : normalized result mantissa */
     779             :     ( Word32 a_m,               /* i  : Mantissa of 1st operand a  */
     780             :       Word16 a_e,               /* i  : Exponent of 1st operand a  */
     781             :       Word32 b_m,               /* i  : Mantissa of 2nd operand b  */
     782             :       Word16 b_e,               /* i  : Exponent of 2nd operand b  */
     783             :       Word16 *ptr_e );          /* o  : exponent of result         */
     784             : 
     785             : /*!**********************************************************************
     786             :    \brief   Returns the comparison result of two normalized values given by mantissa and exponent.
     787             :             return value: -1: a < b, 0: a == b, 1; a > b
     788             : 
     789             :    Mantissas are in 32-bit-fractional format with values between 0 and 1. <br>
     790             :    The base for exponents is 2.  Example:  \f$  a = a\_m * 2^{a\_e}  \f$<br>
     791             : 
     792             : ************************************************************************/
     793             : Word16 BASOP_Util_Cmp_Mant32Exp /*!< o: flag: result of comparison */
     794             :     ( Word32 a_m,               /*!< i: Mantissa of 1st operand a  */
     795             :       Word16 a_e,               /*!< i: Exponent of 1st operand a  */
     796             :       Word32 b_m,               /*!< i: Mantissa of 2nd operand b  */
     797             :       Word16 b_e );             /*!< i: Exponent of 2nd operand b  */
     798             : 
     799             : /********************************************************************
     800             :  * bufferCopyFx
     801             :  *
     802             :  * \brief copies buffer while preserving Format of destination buffer
     803             :  *********************************************************************
     804             :  */
     805             : void bufferCopyFx(
     806             :     Word16 *src,    /*<! Qx  pointer to input buffer                */
     807             :     Word16 *dest,   /*<! Qx  pointer to output buffer               */
     808             :     Word16 length,  /*<! Q0  length of buffer to copy               */
     809             :     Word16 Qf_src,  /*<! Q0  Q format (frac-bits) of source buffer  */
     810             :     Word16 Qf_dest, /*<! Q0  Q format (frac-bits )of dest buffer    */
     811             :     Word16 Q_src,   /*<! Q0  exponent of source buffer              */
     812             :     Word16 Q_dest   /*<! Q0  exponent of destination buffer         */
     813             : );
     814             : 
     815             : /****************************************************************************/
     816             : /*!
     817             :   \brief   Accumulates multiplications
     818             : 
     819             :   Accumulates the elementwise multiplications of Word32 Array bufX32 with Word16 Array bufY16
     820             :   pointed to by arg1 to arg4 including the corresponding exponents. Length of to be multiplied arrays is arg5,
     821             : 
     822             :   \return Word32 result of accumulated multiplications over Word32 array arg1 and Word16 array arg3 and Word16 pointer
     823             :           to exponent of the result
     824             : */
     825             : Word32 dotWord32_16_Mant32Exp( const Word32 *bufX32, /* i: 32-bit buffer with unknown headroom */
     826             :                                Word16 bufX32_exp,    /* i: exponent of buffer bufX32           */
     827             :                                const Word16 *bufY16, /* i: 16-bit buffer quite right-aligned   */
     828             :                                Word16 bufY16_exp,    /* i: exponent of buffer bufY16           */
     829             :                                Word16 len,           /* i: buffer len to process               */
     830             :                                Word16 *exp );        /* o: result exponent                     */
     831             : 
     832             : /*!**********************************************************************
     833             :    \brief   Converts linear factor or energy to Decibel
     834             :             return value: fEnergy=0: 20 * log10(x * 2^{x\_e}),
     835             :                           fEnergy=1: 10 * log10(x * 2^{x\_e})
     836             : 
     837             :    Mantissa x is in 32-bit-fractional format with values between 0 and 1. <br>
     838             :    The base for exponent x_e is 2. <br>
     839             : 
     840             : ************************************************************************/
     841             : Word16 BASOP_Util_lin2dB(                   /*!< o: dB value (7Q8) */
     842             :                           Word32 x,         /*!< i: mantissa */
     843             :                           Word16 x_e,       /*!< i: exponent */
     844             :                           Word16 fEnergy ); /*!< i: flag indicating if x is energy */
     845             : 
     846             : /*!**********************************************************************
     847             :    \brief   Calculates atan(x).
     848             : ************************************************************************/
     849             : Word16 BASOP_util_atan(          /*!< o:  atan(x)           [-pi/2;pi/2]   1Q14  */
     850             :                         Word32 x /*!< i:  input data        (-64;64)       6Q25  */
     851             : );
     852             : 
     853             : /*!**********************************************************************
     854             :    \brief   Calculates atan2(y,x).
     855             : ************************************************************************/
     856             : Word16 BASOP_util_atan2(           /*!< o: atan2(y,x)    [-pi,pi]        Q13   */
     857             :                          Word32 y, /*!< i:                                     */
     858             :                          Word32 x, /*!< i:                                     */
     859             :                          Word16 e  /*!< i: exponent difference (exp_y - exp_x) */
     860             : );
     861             : 
     862             : /****************************************************************************/
     863             : /*!
     864             :   \brief   Accumulates multiplications
     865             : 
     866             :     Accumulates the elementwise multiplications of Word32 Array X with Word16 Array Y
     867             :     pointed to by arg1 and arg2 with specified headroom. Length of to be multiplied arrays is arg3,
     868             :     headroom with has to be taken into account is specified in arg4
     869             : 
     870             :   \return Word32 result of accumulated multiplications over Word32 array arg1 and Word16 array arg2 and Word16 pointer
     871             :           to exponent correction factor which needs to be added to the exponent of the result vector
     872             : */
     873             : Word32 dotWord32_16_guards( const Word32 *X, const Word16 *Y, Word16 n, Word16 hr, Word16 *shift );
     874             : 
     875             : // function defined in basop_util commented from basop_tcx_utils.c
     876             : Word16 compMantExp16Unorm( Word16 m1, Word16 e1, Word16 m2, Word16 e2 );
     877             : 
     878             : cmplx CL_scale_t( cmplx x, Word16 y );
     879             : cmplx CL_dscale_t( cmplx x, Word16 y1, Word16 y2 );
     880             : cmplx CL_mult_32x16( cmplx input, cmplx_s coeff );
     881             : 
     882             : #endif /* __BASOP_UTIL_H__ */

Generated by: LCOV version 1.14