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
|