avr-fw-modules/core/include/fixpoint/fp4816.h

79 lines
2.2 KiB
C++
Executable File

#pragma once
#include <stdint.h>
#include <fixpoint/ieee.h>
typedef int64_t fp4816_t;
#define FP4816_FRAC 16
#define FP4816_MASK (0xFFFFFFFFFFFFFFFF >> (64-FP4816_FRAC))
float fp4816_to_float (fp4816_t value);
fp4816_t fp4816_from_float (float value);
#define fp4816_from_float_c( value ) ((fp4816_t)(value * 65536.0f))
static inline fp4816_t fp4816_from_int32 (int32_t value) { return (fp4816_t)(((fp4816_t)value) << FP4816_FRAC); };
static inline int32_t fp4816_to_int32 (fp4816_t value) { return (int32_t)(value >> 16); };
static inline fp4816_t fp4816_fraction (fp4816_t value) { return value & FP4816_MASK; };
static inline fp4816_t fp4816_add ( fp4816_t a, fp4816_t b ) { return a + b; };
static inline fp4816_t fp4816_sub ( fp4816_t a, fp4816_t b ) { return a - b; };
static inline fp4816_t fp4816_mul ( fp4816_t a, fp4816_t b ) { return (fp4816_t)( ((int64_t)a * (int64_t)b) >> FP4816_FRAC ); };
static inline fp4816_t fp4816_div ( fp4816_t a, fp4816_t b ) { return (fp4816_t)( ((int64_t)a << FP4816_FRAC) / b ); };
static inline fp4816_t fp4816_abs ( fp4816_t a ) { return (a<0) ? -a : a; };
fp4816_t fp4816_taylor (fp4816_t v,int lev);
fp4816_t fp4816_sin_slow (fp4816_t rad);
fp4816_t fp4816_taylor_element(fp4816_t v,int lev);
fp4816_t fp4816_pow (fp4816_t v,int pow);
struct _fp4816_smoother {
fp4816_t value,
sum,
k;
};
fp4816_t fp4816_smoother(struct _fp4816_smoother *smoother,fp4816_t sample);
static inline void fp4816_smoother_set(struct _fp4816_smoother *smoother,fp4816_t tn) {
if (smoother) {
smoother->value = 0;
smoother->sum = 0;
smoother->k = fp4816_div(65536,tn);
};
};
#include <math.h>
#define FP4816_PI fp4816_from_float_c(M_PI)
#define FP4816_2PI (2 * FP4816_PI)
#define FP4816_05PI (FP4816_PI / 2)
#define FP4816_15PI (FP4816_PI + FP4816_05PI)
#define FP_SQRT_2 fp4816_from_float_c(1.414213562373095)
#define FP_INV_SQRT_2 fp4816_from_float_c(0.707106781)
#define FP_SQRT_3 fp4816_from_float_c(1.73205080756887729352)
#define FP_INV_SQRT_3 fp4816_from_float_c(0.577350269)
#ifdef __cplusplus
class FP4816
{
public:
FP4816(int64_t value);
FP4816(float value);
private:
int64_t value;
};
#endif