XCORE SDK
XCORE Software Development Kit
q_format.h
1 // Copyright 2022 XMOS LIMITED.
2 // This Software is subject to the terms of the XMOS Public Licence: Version 1.
3 // This Software is subject to the terms of the XMOS Public Licence: Version 1.
4 #pragma once
5 
6 
17 #define F0(N) F ## N
18 #define F(N) F0(N)
19 
20 #define Q0(N) Q ## N
21 #define Q(N) Q0(N)
22 
23 // Convert from floating point to fixed point Q format.
24 // The number indicates the fractional bits or the position of the binary point
25 #define Q31(f) (int)((signed long long)((f) * ((unsigned long long)1 << (31+20)) + (1<<19)) >> 20)
26 #define Q30(f) (int)((signed long long)((f) * ((unsigned long long)1 << (30+20)) + (1<<19)) >> 20)
27 #define Q29(f) (int)((signed long long)((f) * ((unsigned long long)1 << (29+20)) + (1<<19)) >> 20)
28 #define Q28(f) (int)((signed long long)((f) * ((unsigned long long)1 << (28+20)) + (1<<19)) >> 20)
29 #define Q27(f) (int)((signed long long)((f) * ((unsigned long long)1 << (27+20)) + (1<<19)) >> 20)
30 #define Q26(f) (int)((signed long long)((f) * ((unsigned long long)1 << (26+20)) + (1<<19)) >> 20)
31 #define Q25(f) (int)((signed long long)((f) * ((unsigned long long)1 << (25+20)) + (1<<19)) >> 20)
32 #define Q24(f) (int)((signed long long)((f) * ((unsigned long long)1 << (24+20)) + (1<<19)) >> 20)
33 #define Q23(f) (int)((signed long long)((f) * ((unsigned long long)1 << (23+20)) + (1<<19)) >> 20)
34 #define Q22(f) (int)((signed long long)((f) * ((unsigned long long)1 << (22+20)) + (1<<19)) >> 20)
35 #define Q21(f) (int)((signed long long)((f) * ((unsigned long long)1 << (21+20)) + (1<<19)) >> 20)
36 #define Q20(f) (int)((signed long long)((f) * ((unsigned long long)1 << (20+20)) + (1<<19)) >> 20)
37 #define Q19(f) (int)((signed long long)((f) * ((unsigned long long)1 << (19+20)) + (1<<19)) >> 20)
38 #define Q18(f) (int)((signed long long)((f) * ((unsigned long long)1 << (18+20)) + (1<<19)) >> 20)
39 #define Q17(f) (int)((signed long long)((f) * ((unsigned long long)1 << (17+20)) + (1<<19)) >> 20)
40 #define Q16(f) (int)((signed long long)((f) * ((unsigned long long)1 << (16+20)) + (1<<19)) >> 20)
41 #define Q15(f) (int)((signed long long)((f) * ((unsigned long long)1 << (15+20)) + (1<<19)) >> 20)
42 #define Q14(f) (int)((signed long long)((f) * ((unsigned long long)1 << (14+20)) + (1<<19)) >> 20)
43 #define Q13(f) (int)((signed long long)((f) * ((unsigned long long)1 << (13+20)) + (1<<19)) >> 20)
44 #define Q12(f) (int)((signed long long)((f) * ((unsigned long long)1 << (12+20)) + (1<<19)) >> 20)
45 #define Q11(f) (int)((signed long long)((f) * ((unsigned long long)1 << (11+20)) + (1<<19)) >> 20)
46 #define Q10(f) (int)((signed long long)((f) * ((unsigned long long)1 << (10+20)) + (1<<19)) >> 20)
47 #define Q9(f) (int)((signed long long)((f) * ((unsigned long long)1 << (9+20)) + (1<<19)) >> 20)
48 #define Q8(f) (int)((signed long long)((f) * ((unsigned long long)1 << (8+20)) + (1<<19)) >> 20)
49 
50 // Convert from fixed point to double precision floating point
51 // The number indicates the fractional bits or the position of the binary point
52 #define F31(x) ((double)(x)/(double)(uint32_t)(1<<31)) // needs uint32_t cast because bit 31 is 1
53 #define F30(x) ((double)(x)/(double)(1<<30))
54 #define F29(x) ((double)(x)/(double)(1<<29))
55 #define F28(x) ((double)(x)/(double)(1<<28))
56 #define F27(x) ((double)(x)/(double)(1<<27))
57 #define F26(x) ((double)(x)/(double)(1<<26))
58 #define F25(x) ((double)(x)/(double)(1<<25))
59 #define F24(x) ((double)(x)/(double)(1<<24))
60 #define F23(x) ((double)(x)/(double)(1<<23))
61 #define F22(x) ((double)(x)/(double)(1<<22))
62 #define F21(x) ((double)(x)/(double)(1<<21))
63 #define F20(x) ((double)(x)/(double)(1<<20))
64 #define F19(x) ((double)(x)/(double)(1<<19))
65 #define F18(x) ((double)(x)/(double)(1<<18))
66 #define F17(x) ((double)(x)/(double)(1<<17))
67 #define F16(x) ((double)(x)/(double)(1<<16))
68 
69 // short
70 #define F15(x) ((double)(x)/(double)(1<<15))
71 #define F14(x) ((double)(x)/(double)(1<<14))
72 #define F13(x) ((double)(x)/(double)(1<<13))
73 #define F12(x) ((double)(x)/(double)(1<<12))
74 #define F11(x) ((double)(x)/(double)(1<<11))
75 #define F10(x) ((double)(x)/(double)(1<<10))
76 #define F9(x) ((double)(x)/(double)(1<<9))
77 #define F8(x) ((double)(x)/(double)(1<<8))