LCOV - code coverage report
Current view: top level - lib_com - float_to_fix_ops.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 37 140 26.4 %
Date: 2025-05-03 01:55:50 Functions: 7 22 31.8 %

          Line data    Source code
       1             : #include <stdio.h>
       2             : #include <math.h>
       3             : #include <stdlib.h>
       4             : #include <stdint.h>
       5             : #include "options.h"
       6             : #include "prot_fx.h"
       7             : #define WMC_TOOL_SKIP
       8             : 
       9    17644216 : Word32 floatToFixed( float f, Word16 Q )
      10             : {
      11             :     Word64 result_32;
      12    17644216 :     if ( f == 1.0f && Q == Q15 )
      13           0 :         return MAX16B;
      14    17644216 :     if ( f == 1.0f && Q == Q31 )
      15      918315 :         return MAXVAL_WORD32;
      16    16725901 :     if ( Q < 0 )
      17           0 :         result_32 = (Word64) ( (float) ( f ) / (double) ( (unsigned Word64) 1 << ( -Q ) ) + ( f >= 0 ? 0.5 : -0.5 ) );
      18             :     else
      19    16725901 :         result_32 = (Word64) ( f * (double) ( (unsigned Word64) 1 << Q ) + ( f >= 0 ? 0.5 : -0.5 ) );
      20    16725901 :     if ( result_32 > MAX_32 )
      21           0 :         return MAX_32;
      22    16725901 :     if ( result_32 < MIN_32 )
      23           0 :         return MIN_32;
      24    16725901 :     return (Word32) result_32;
      25             : }
      26             : 
      27             : 
      28      410030 : float fixedToFloat( Word32 i, Word16 Q )
      29             : {
      30      410030 :     if ( Q < 0 )
      31           0 :         return ( i * (float) ( ( 1LL ) << ( -Q ) ) );
      32             :     else
      33      410030 :         return (float) ( i ) / (float) ( 1LL << Q );
      34             : }
      35      271515 : void floatToFixed_arrL( float *f, Word32 *i, Word16 Q, Word16 l )
      36             : {
      37     7509615 :     for ( int j = 0; j < l; j++ )
      38             :     {
      39     7238100 :         Word64 i64_val = floatToFixed( f[j], Q );
      40     7238100 :         IF( i64_val > MAX_32 )
      41             :         {
      42           0 :             i64_val = MAX_32;
      43             :         }
      44     7238100 :         ELSE IF( i64_val < MIN_32 )
      45             :         {
      46           0 :             i64_val = MIN_32;
      47             :         }
      48     7238100 :         i[j] = (Word32) i64_val;
      49             :     }
      50      271515 : }
      51        1472 : void floatToFixed_arr16( float *f, Word16 *i, Word16 Q, Word16 l )
      52             : {
      53        1472 :     if ( Q <= 0 )
      54             :     {
      55           0 :         floatToFixed_arr( f, i, Q, l );
      56           0 :         return;
      57             :     }
      58       89792 :     for ( int j = 0; j < l; j++ )
      59             :     {
      60       88320 :         i[j] = float_to_fix16( f[j], Q );
      61             :     }
      62             : }
      63          69 : void floatToFixed_arr32( float *f, Word32 *i, Word16 Q, Word16 l )
      64             : {
      65          69 :     if ( Q <= 0 )
      66             :     {
      67           0 :         floatToFixed_arrL( f, i, Q, l );
      68           0 :         return;
      69             :     }
      70       17802 :     for ( int j = 0; j < l; j++ )
      71             :     {
      72       17733 :         i[j] = float_to_fix( f[j], Q );
      73             :     }
      74             : }
      75             : 
      76           0 : float fixedToFloat_16( Word16 i, Word16 Q )
      77             : {
      78           0 :     if ( Q < 0 )
      79           0 :         return ( i * (float) ( ( (unsigned) 1 ) << ( -Q ) ) );
      80             :     else
      81           0 :         return (float) ( i ) / (float) ( (unsigned int) 1 << Q );
      82             : }
      83           0 : float fixedToFloat_32( Word32 number, Word16 Q )
      84             : {
      85           0 :     float val = 0.0f;
      86           0 :     assert( abs_s( Q ) <= 63 );
      87           0 :     if ( abs_s( Q ) > 31 )
      88             :     {
      89           0 :         if ( Q > 0 )
      90             :         {
      91           0 :             val = ( ( (float) number / ( 1 << ( Q - 31 ) ) ) / ( (unsigned int) MAX_32 + 1 ) );
      92             :         }
      93             :         else
      94             :         {
      95           0 :             val = ( (float) number * ( 1 << ( -Q - 31 ) ) * (unsigned int) MIN_32 );
      96             :         }
      97             :     }
      98             :     else
      99             :     {
     100           0 :         val = fixedToFloat( number, Q );
     101             :     }
     102           0 :     return val;
     103             : }
     104             : 
     105     3984484 : Word32 floatToFixed_32( float number, Word16 Q )
     106             : {
     107     3984484 :     float val = 0.0f;
     108     3984484 :     assert( abs_s( Q ) <= 63 );
     109     3984484 :     if ( abs_s( Q ) > 31 )
     110             :     {
     111           0 :         if ( Q > 0 )
     112             :         {
     113           0 :             val = ( number * ( (unsigned int) MAX_32 + 1 ) ) * ( 1 << ( Q - 31 ) );
     114             :         }
     115             :         else
     116             :         {
     117           0 :             val = ( number / ( 1 << ( -Q - 31 ) ) ) / (unsigned int) MIN_32;
     118             :         }
     119             :         if ( val >= 0.0f )
     120             :         {
     121             :             assert( (Word32) val <= MAX_32 );
     122             :         }
     123             :         else
     124             :         {
     125             :             assert( (Word32) val >= MIN_32 );
     126             :         }
     127             :     }
     128             :     else
     129             :     {
     130     3984484 :         return floatToFixed( number, Q );
     131             :     }
     132             : 
     133           0 :     return (Word32) val;
     134             : }
     135             : 
     136           0 : void floatToFixed_arrL32( float *f, Word32 *i, Word16 Q, Word16 l )
     137             : {
     138           0 :     for ( int j = 0; j < l; j++ )
     139             :     {
     140           0 :         i[j] = floatToFixed_32( f[j], Q );
     141             :     }
     142           0 : }
     143             : 
     144           0 : void fixedToFloat_arrL32( Word32 *i, float *f, Word16 Q, Word16 l )
     145             : {
     146           0 :     for ( int j = 0; j < l; j++ )
     147             :     {
     148           0 :         f[j] = fixedToFloat_32( i[j], Q );
     149             :     }
     150           0 : }
     151             : 
     152           0 : void floatToFixed_arr( float *f, Word16 *i, Word16 Q, Word16 l )
     153             : {
     154           0 :     for ( int j = 0; j < l; j++ )
     155             :     {
     156           0 :         Word32 i32_val = floatToFixed( f[j], Q );
     157           0 :         IF( i32_val > MAX_16 )
     158             :         {
     159           0 :             i32_val = MAX_16;
     160             :         }
     161           0 :         ELSE IF( i32_val < MIN_16 )
     162             :         {
     163           0 :             i32_val = MIN_16;
     164             :         }
     165           0 :         i[j] = (Word16) i32_val;
     166             :     }
     167           0 : }
     168           0 : void fixedToFloat_arrL( Word32 *i, float *f, Word16 Q, Word16 l )
     169             : {
     170           0 :     for ( int j = 0; j < l; j++ )
     171             :     {
     172           0 :         f[j] = fixedToFloat( i[j], Q );
     173             :     }
     174           0 : }
     175           0 : void fixedToFloat_arr( Word16 *i, float *f, Word16 Q, Word16 l )
     176             : {
     177           0 :     for ( int j = 0; j < l; j++ )
     178             :     {
     179           0 :         f[j] = fixedToFloat( i[j], Q );
     180             :     }
     181           0 : }
     182           0 : Word16 Q_factor( float x )
     183             : {
     184           0 :     Word16 Q = 15;
     185           0 :     if ( x >= 1 || x <= -1 )
     186           0 :         Q = norm_s( (Word16) L_abs( (Word32) x ) );
     187           0 :     return Q;
     188             : }
     189           0 : Word16 Q_factor_L( float x )
     190             : {
     191           0 :     Word16 Q = 31;
     192           0 :     if ( x >= 1 || x <= -1 )
     193           0 :         Q = norm_l( L_abs( (Word32) x ) );
     194           0 :     return Q;
     195             : }
     196     8632408 : Word16 Q_factor_L_32( Word32 x )
     197             : {
     198     8632408 :     Word16 Q = 31;
     199     8632408 :     if ( x >= 1 || x <= -1 )
     200     2788071 :         Q = norm_l( L_abs( (Word32) x ) );
     201     8632408 :     return Q;
     202             : }
     203           0 : Word16 Q_factor_arr( float *x, Word16 l )
     204             : {
     205           0 :     Word16 Q = 15;
     206           0 :     for ( int i = 0; i < l; i++ )
     207             :     {
     208           0 :         if ( x[i] >= 1 || x[i] <= -1 )
     209           0 :             Q = s_min( Q, norm_s( (Word16) L_abs( (Word32) x[i] ) ) );
     210             :     }
     211           0 :     return Q;
     212             : }
     213           0 : Word16 Q_factor_arrL( float *x, Word16 l )
     214             : {
     215           0 :     Word16 Q = 31;
     216           0 :     for ( int i = 0; i < l; i++ )
     217             :     {
     218           0 :         if ( x[i] >= 1 || x[i] <= -1 )
     219           0 :             Q = s_min( Q, norm_l( (Word32) L_abs( (Word32) x[i] ) ) );
     220             :     }
     221           0 :     return Q;
     222             : }
     223             : 
     224           0 : Word16 L_get_q( float f )
     225             : {
     226           0 :     if ( fabsf( f ) > (float) INT_MAX )
     227             :     {
     228           0 :         return sub( sub( W_norm( (Word64) f ), 32 ), 0 );
     229             :     }
     230             :     else
     231             :     {
     232           0 :         return sub( norm_l( (Word32) f ), 0 );
     233             :     }
     234             : }
     235             : 
     236           0 : Word16 L_get_q_buf( float *ptr_flt, Word16 length )
     237             : {
     238             :     Word16 k;
     239           0 :     float ftemp = 0.0;
     240             : 
     241           0 :     for ( k = 0; k < length; k++ )
     242             :     {
     243           0 :         if ( fabsf( ptr_flt[k] ) > ftemp )
     244           0 :             ftemp = fabsf( ptr_flt[k] );
     245             :     }
     246             : 
     247           0 :     if ( ftemp > (float) INT_MAX )
     248             :     {
     249           0 :         return sub( sub( W_norm( (Word64) ftemp ), 32 ), 0 );
     250             :     }
     251             :     else
     252             :     {
     253           0 :         return sub( norm_l( (Word32) ftemp ), 0 );
     254             :     }
     255             : }
     256             : 
     257           0 : Word16 L_get_q1( float f )
     258             : {
     259           0 :     if ( fabsf( f ) >= 0.f && fabsf( f ) < 1.f )
     260             :     {
     261           0 :         return Q31;
     262             :     }
     263           0 :     else if ( fabsf( f ) > (float) INT_MAX )
     264             :     {
     265           0 :         return sub( sub( W_norm( (Word64) f ), 32 ), 0 );
     266             :     }
     267             :     else
     268             :     {
     269           0 :         return sub( norm_l( (Word32) f ), 0 );
     270             :     }
     271             : }
     272             : 
     273           0 : Word16 L_get_q_buf1( float *ptr_flt, Word16 length )
     274             : {
     275             :     Word16 k;
     276           0 :     float ftemp = 0.0;
     277             : 
     278           0 :     for ( k = 0; k < length; k++ )
     279             :     {
     280           0 :         if ( fabsf( ptr_flt[k] ) > ftemp )
     281           0 :             ftemp = fabsf( ptr_flt[k] );
     282             :     }
     283             : 
     284           0 :     if ( ftemp >= 0.f && ftemp < 1.f )
     285             :     {
     286           0 :         return Q31;
     287             :     }
     288           0 :     else if ( ftemp > (float) INT_MAX )
     289             :     {
     290           0 :         return sub( sub( W_norm( (Word64) ftemp ), 32 ), 0 );
     291             :     }
     292             :     else
     293             :     {
     294           0 :         return sub( norm_l( (Word32) ftemp ), 0 );
     295             :     }
     296             : }
     297             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14