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

61 lines
1.4 KiB
C
Executable File

#pragma once
#include <stdint.h>
#define FP_FRAC 16
#define FP_MASK (0xFFFFFFFF >> (32-FP_FRAC))
typedef int32_t fixpoint_t;
#define fp_float(a) (((double)a) / (1L<<FP_FRAC))
#define fp_uint16(a) ((uint16_t)a>>FP_FRAC)
#define fp_make(a) ((fixpoint_t)(a * (1L<<FP_FRAC)))
#define fp_add(a,b) (a + b)
#define fp_sub(a,b) (a - b)
#define fp_mul(a,b) ((fixpoint_t)(((int64_t)a * (int64_t)b) >> FP_FRAC))
#define fp_div(a,b) ((fixpoint_t)(((int64_t)a << FP_FRAC) / b))
#define fp_get_fraction(a) (((fixpoint_t)a) & FP_MASK)
#define fp_trunc_to_int32(a) (a / (1L<<FP_FRAC))
#include <math.h>
#define FP_PI fp_make(M_PI)
#define FP_2PI (2*FP_PI)
#define FP_SQRT_2 fp_make(1.414213562373095)
#define FP_INV_SQRT_2 fp_make(0.707106781)
#define FP_SQRT_3 fp_make(1.73205080756887729352)
#define FP_INV_SQRT_3 fp_make(0.577350269)
/* Trigonometrische Funktionen
[arc] = °
Intervalle:
asin [-90 .. +90]
acos [ 0 .. +180]
*/
fixpoint_t fp_sin(fixpoint_t arc);
fixpoint_t fp_cos(fixpoint_t arc);
fixpoint_t fp_tan(fixpoint_t arc);
fixpoint_t fp_asin(fixpoint_t sin);
fixpoint_t fp_acos(fixpoint_t cos);
fixpoint_t fp_atan(fixpoint_t tan);
fixpoint_t fp_normalize_arc(fixpoint_t arc);
uint8_t* fp_toa(fixpoint_t value,int pre,int dec);
uint8_t* fp_toa_r(uint8_t* buffer,fixpoint_t value,int pre,int dec);
fixpoint_t fp_sin_lookup_reverse(fixpoint_t sin);
fixpoint_t fp_sin_lookup(fixpoint_t arc090);