OpenWareLaboratory
qint.h
Go to the documentation of this file.
1 #ifndef __QINT_H__
2 #define __QINT_H__
3 
4 #include <stdint.h>
5 
6 #ifdef ARM_CORTEX
7 #include "arm_math.h"
8 #define Q15_MUL_Q15(a,b) (__SSAT(((q31_t)(a)*(b))>>15, 16))
9 #define Q31_MUL_Q31(a,b) (__SSAT(((q63_t)(a)*(b))>>31, 32))
10 #define FLOAT_TO_Q7(a) (__SSAT((q15_t)((a)*128.0f), 8))
11 #define FLOAT_TO_Q15(a) (__SSAT((q31_t)((a)*32768.0f), 16))
12 #define FLOAT_TO_Q31(a) clip_q63_to_q31((q63_t)((a)*2147483648.0f))
13 #else
14 #define Q7_CLIP(a) ((a) > Q7_MAX ? Q7_MAX : (a) < Q7_MIN ? Q7_MIN : (a))
15 #define Q15_CLIP(a) ((a) > Q15_MAX ? Q15_MAX : (a) < Q15_MIN ? Q15_MIN : (a))
16 #define Q31_CLIP(a) ((a) > Q31_MAX ? Q31_MAX : (a) < Q31_MIN ? Q31_MIN : (a))
17 #define Q15_MUL_Q15(a,b) Q15_CLIP(((q63_t)(a)*(b))>>15)
18 #define Q31_MUL_Q31(a,b) Q31_CLIP(((q63_t)(a)*(b))>>31)
19 #define FLOAT_TO_Q7(a) Q7_CLIP((q15_t)((a)*128.0f))
20 #define FLOAT_TO_Q15(a) Q15_CLIP((q63_t)((a)*32768.0f))
21 #define FLOAT_TO_Q31(a) Q31_CLIP((q63_t)((a)*2147483648.0f))
22 #endif
23 
24 typedef int8_t q7_t;
25 typedef int16_t q15_t;
26 typedef int32_t q31_t;
27 typedef int64_t q63_t;
28 
29 #ifndef Q7_MIN
30 #define Q7_MIN INT8_MIN
31 #endif
32 #ifndef Q7_MAX
33 #define Q7_MAX INT8_MAX
34 #endif
35 #ifndef Q15_MIN
36 #define Q15_MIN INT16_MIN
37 #endif
38 #ifndef Q15_MAX
39 #define Q15_MAX INT16_MAX
40 #endif
41 #ifndef Q31_MIN
42 #define Q31_MIN INT32_MIN
43 #endif
44 #ifndef Q31_MAX
45 #define Q31_MAX INT32_MAX
46 #endif
47 
48 #define Q15_DIV_Q15(a,b) (((q31_t)(a)<<15)/(b)) /* non-rounding */
49 #define Q15_RECIPROCAL(a) (((q31_t)Q15_MAX<<15)/(a))
50 
51 #define Q7_TO_FLOAT(a) ((float)(a)/128.0f)
52 #define Q15_TO_FLOAT(a) ((float)(a)/32768.0f)
53 #define Q31_TO_FLOAT(a) ((float)(a)/2147483648.0f)
54 #define Q63_TO_FLOAT(a) ((float)(a)/9223372036854775808.0f)
55 
56 #endif /* defined(__QINT_H__) */
int64_t q63_t
Definition: qint.h:27
int16_t q15_t
Definition: qint.h:25
int32_t q31_t
Definition: qint.h:26
int8_t q7_t
Definition: qint.h:24