81 lines
4.2 KiB
C
81 lines
4.2 KiB
C
// Copyright 2015-2021 XMOS LIMITED.
|
|
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
|
|
|
#ifndef DSP_QFORMAT_H_
|
|
#define DSP_QFORMAT_H_
|
|
|
|
|
|
/** These Macros can be used to parameterize the conversion macros.
|
|
* E.g.
|
|
* \code
|
|
* #define BP 20 // location of the binary point
|
|
* \endcode
|
|
* Then use the macro like this:
|
|
* \code
|
|
* Q(BP)(1.234567)
|
|
* \endcode
|
|
*/
|
|
#define F0(N) F ## N
|
|
#define F(N) F0(N)
|
|
|
|
#define Q0(N) Q ## N
|
|
#define Q(N) Q0(N)
|
|
|
|
// Convert from floating point to fixed point Q format.
|
|
// The number indicates the fractional bits or the position of the binary point
|
|
#define Q31(f) (int)((signed long long)((f) * ((unsigned long long)1 << (31+20)) + (1<<19)) >> 20)
|
|
#define Q30(f) (int)((signed long long)((f) * ((unsigned long long)1 << (30+20)) + (1<<19)) >> 20)
|
|
#define Q29(f) (int)((signed long long)((f) * ((unsigned long long)1 << (29+20)) + (1<<19)) >> 20)
|
|
#define Q28(f) (int)((signed long long)((f) * ((unsigned long long)1 << (28+20)) + (1<<19)) >> 20)
|
|
#define Q27(f) (int)((signed long long)((f) * ((unsigned long long)1 << (27+20)) + (1<<19)) >> 20)
|
|
#define Q26(f) (int)((signed long long)((f) * ((unsigned long long)1 << (26+20)) + (1<<19)) >> 20)
|
|
#define Q25(f) (int)((signed long long)((f) * ((unsigned long long)1 << (25+20)) + (1<<19)) >> 20)
|
|
#define Q24(f) (int)((signed long long)((f) * ((unsigned long long)1 << (24+20)) + (1<<19)) >> 20)
|
|
#define Q23(f) (int)((signed long long)((f) * ((unsigned long long)1 << (23+20)) + (1<<19)) >> 20)
|
|
#define Q22(f) (int)((signed long long)((f) * ((unsigned long long)1 << (22+20)) + (1<<19)) >> 20)
|
|
#define Q21(f) (int)((signed long long)((f) * ((unsigned long long)1 << (21+20)) + (1<<19)) >> 20)
|
|
#define Q20(f) (int)((signed long long)((f) * ((unsigned long long)1 << (20+20)) + (1<<19)) >> 20)
|
|
#define Q19(f) (int)((signed long long)((f) * ((unsigned long long)1 << (19+20)) + (1<<19)) >> 20)
|
|
#define Q18(f) (int)((signed long long)((f) * ((unsigned long long)1 << (18+20)) + (1<<19)) >> 20)
|
|
#define Q17(f) (int)((signed long long)((f) * ((unsigned long long)1 << (17+20)) + (1<<19)) >> 20)
|
|
#define Q16(f) (int)((signed long long)((f) * ((unsigned long long)1 << (16+20)) + (1<<19)) >> 20)
|
|
#define Q15(f) (int)((signed long long)((f) * ((unsigned long long)1 << (15+20)) + (1<<19)) >> 20)
|
|
#define Q14(f) (int)((signed long long)((f) * ((unsigned long long)1 << (14+20)) + (1<<19)) >> 20)
|
|
#define Q13(f) (int)((signed long long)((f) * ((unsigned long long)1 << (13+20)) + (1<<19)) >> 20)
|
|
#define Q12(f) (int)((signed long long)((f) * ((unsigned long long)1 << (12+20)) + (1<<19)) >> 20)
|
|
#define Q11(f) (int)((signed long long)((f) * ((unsigned long long)1 << (11+20)) + (1<<19)) >> 20)
|
|
#define Q10(f) (int)((signed long long)((f) * ((unsigned long long)1 << (10+20)) + (1<<19)) >> 20)
|
|
#define Q9(f) (int)((signed long long)((f) * ((unsigned long long)1 << (9+20)) + (1<<19)) >> 20)
|
|
#define Q8(f) (int)((signed long long)((f) * ((unsigned long long)1 << (8+20)) + (1<<19)) >> 20)
|
|
|
|
// Convert from fixed point to double precision floating point
|
|
// The number indicates the fractional bits or the position of the binary point
|
|
#define F31(x) ((double)(x)/(double)(uint32_t)(1<<31)) // needs uint32_t cast because bit 31 is 1
|
|
#define F30(x) ((double)(x)/(double)(1<<30))
|
|
#define F29(x) ((double)(x)/(double)(1<<29))
|
|
#define F28(x) ((double)(x)/(double)(1<<28))
|
|
#define F27(x) ((double)(x)/(double)(1<<27))
|
|
#define F26(x) ((double)(x)/(double)(1<<26))
|
|
#define F25(x) ((double)(x)/(double)(1<<25))
|
|
#define F24(x) ((double)(x)/(double)(1<<24))
|
|
#define F23(x) ((double)(x)/(double)(1<<23))
|
|
#define F22(x) ((double)(x)/(double)(1<<22))
|
|
#define F21(x) ((double)(x)/(double)(1<<21))
|
|
#define F20(x) ((double)(x)/(double)(1<<20))
|
|
#define F19(x) ((double)(x)/(double)(1<<19))
|
|
#define F18(x) ((double)(x)/(double)(1<<18))
|
|
#define F17(x) ((double)(x)/(double)(1<<17))
|
|
#define F16(x) ((double)(x)/(double)(1<<16))
|
|
|
|
// short
|
|
#define F15(x) ((double)(x)/(double)(1<<15))
|
|
#define F14(x) ((double)(x)/(double)(1<<14))
|
|
#define F13(x) ((double)(x)/(double)(1<<13))
|
|
#define F12(x) ((double)(x)/(double)(1<<12))
|
|
#define F11(x) ((double)(x)/(double)(1<<11))
|
|
#define F10(x) ((double)(x)/(double)(1<<10))
|
|
#define F9(x) ((double)(x)/(double)(1<<9))
|
|
#define F8(x) ((double)(x)/(double)(1<<8))
|
|
#endif
|
|
|