79 lines
2.2 KiB
C++
Executable file
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
|
|
|
|
|
|
|