Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h"
7 : //#include "prot_fx.h"
8 : #include "prot_fx.h" /* Function prototypes */
9 : #include "prot_fx_enc.h" /* Function prototypes */
10 : #include "vad_basop.h"
11 : #include "basop_util.h"
12 :
13 3100 : Word32 vad_Sqrt_l( /* o : output value, Q31 */
14 : Word32 i_s32Val,
15 : Word16 *io_s16Q )
16 : {
17 : Word16 exp;
18 : Word32 result;
19 :
20 3100 : exp = sub( 31, *io_s16Q );
21 3100 : result = Sqrt32( i_s32Val, &exp );
22 3100 : *io_s16Q = sub( 31, exp );
23 3100 : move16();
24 :
25 3100 : return ( result );
26 : }
27 :
28 248000 : Word32 fft_vad_Sqrt_l( /* o : output value, Q31 */
29 : Word32 i_s32Val,
30 : Word16 i_s16Q,
31 : Word16 *o_s16Q )
32 : {
33 : Word16 exp;
34 : Word32 result;
35 :
36 248000 : exp = sub( 31, i_s16Q );
37 248000 : result = Sqrt32( i_s32Val, &exp );
38 248000 : *o_s16Q = sub( 31, exp );
39 248000 : move16();
40 :
41 248000 : return ( result );
42 : }
43 :
44 52739 : Word32 VAD_L_div( Word32 L_var1, Word32 L_var2, Word16 Q_L_var1, Word16 Q_L_var2, Word16 *Q_OUT )
45 : {
46 : Word32 result;
47 :
48 52739 : result = L_deposit_h( BASOP_Util_Divide3232_Scale( L_var1, L_var2, Q_OUT ) );
49 52739 : move16();
50 52739 : *Q_OUT = add( sub( sub( 31, *Q_OUT ), Q_L_var2 ), Q_L_var1 );
51 52739 : return result;
52 : }
53 :
54 43400 : Word32 VAD_Log2( Word32 i_s32Val, Word16 i_s16Q )
55 : {
56 : Word32 result;
57 :
58 : /* log10(x) = log2(x) * 1.0/log2(10), exponent LD_DATA_SCALE - 1 */
59 43400 : result = BASOP_Util_Log2( i_s32Val );
60 :
61 43400 : result = L_add( result, L_shl( L_deposit_l( sub( 31, i_s16Q ) ), 31 - LD_DATA_SCALE ) );
62 :
63 43400 : return result;
64 : }
65 :
66 3139 : T_VAD_EXP VAD_AddExp( T_VAD_EXP i_tExp1, T_VAD_EXP i_tExp2 )
67 : {
68 : Word16 s16Shift;
69 : T_VAD_EXP tRtnVal;
70 :
71 3139 : if ( i_tExp1.s32Mantissa == 0 )
72 : {
73 0 : return i_tExp2;
74 : }
75 :
76 3139 : if ( i_tExp2.s32Mantissa == 0 )
77 : {
78 0 : return i_tExp1;
79 : }
80 3139 : s16Shift = sub( s_min( i_tExp1.s16Exp, i_tExp2.s16Exp ), 1 );
81 3139 : tRtnVal.s32Mantissa = L_add( L_shr( i_tExp2.s32Mantissa, sub( i_tExp2.s16Exp, s16Shift ) ), L_shr( i_tExp1.s32Mantissa, sub( i_tExp1.s16Exp, s16Shift ) ) );
82 3139 : tRtnVal.s16Exp = s16Shift;
83 3139 : move16();
84 :
85 3139 : s16Shift = norm_l( tRtnVal.s32Mantissa );
86 3139 : tRtnVal.s32Mantissa = L_shl( tRtnVal.s32Mantissa, s16Shift );
87 3139 : tRtnVal.s16Exp = add( tRtnVal.s16Exp, s16Shift );
88 :
89 3139 : return tRtnVal;
90 : }
91 99602 : Word32 VAD_L_ADD( Word32 s32Mantissa1, Word16 i_tExp1, Word32 s32Mantissa2, Word16 i_tExp2, Word16 *s16Exp )
92 : {
93 : Word32 result;
94 :
95 99602 : result = BASOP_Util_Add_Mant32Exp( s32Mantissa1, sub( 31, i_tExp1 ), s32Mantissa2, sub( 31, i_tExp2 ), s16Exp );
96 :
97 99602 : move16();
98 99602 : *s16Exp = sub( 31, *s16Exp );
99 :
100 99602 : return result;
101 : }
102 :
103 37011 : Word16 VAD_L_CMP( Word32 s32Mantissa1, Word16 i_tExp1, Word32 s32Mantissa2, Word16 i_tExp2 )
104 : {
105 : Word16 ret;
106 :
107 37011 : ret = BASOP_Util_Cmp_Mant32Exp( s32Mantissa1, sub( 31, i_tExp1 ), s32Mantissa2, sub( 31, i_tExp2 ) );
108 :
109 37011 : return ret;
110 : }
111 :
112 3100 : Word16 FixSqrt( Word32 i_s32Val, Word16 *io_s16Q )
113 : {
114 : Word16 result, exp;
115 :
116 3100 : exp = sub( 31, *io_s16Q );
117 3100 : result = round_fx_sat( Sqrt32( i_s32Val, &exp ) );
118 3100 : move16();
119 3100 : *io_s16Q = sub( 15, exp );
120 :
121 3100 : return result;
122 : }
123 :
124 9300 : Word32 VAD_Pow( Word32 i_s32Base, Word32 i_s32Exp, Word16 i_s16BaseQ, Word16 i_s16ExpQ, Word16 *o_pOuQ )
125 : {
126 : Word32 result;
127 9300 : result = BASOP_Util_fPow( i_s32Base, sub( 31, i_s16BaseQ ), i_s32Exp, sub( 31, i_s16ExpQ ), o_pOuQ );
128 9300 : move16();
129 9300 : *o_pOuQ = sub( 31, *o_pOuQ );
130 9300 : return result;
131 : }
132 :
133 9300 : Word32 VAD_Pow2( Word32 i_s32X, Word16 i_s16Q, Word16 *o_pOuQ )
134 : {
135 : Word32 result;
136 9300 : result = BASOP_util_Pow2( i_s32X, sub( 31, i_s16Q ), o_pOuQ );
137 9300 : move16();
138 9300 : *o_pOuQ = sub( 31, *o_pOuQ );
139 :
140 9300 : return result;
141 : }
|