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

51 lines
1.6 KiB
C

#pragma once
#include <stdint.h>
#define FP1616_FRAC 16
union fp1616{
int32_t value;
uint32_t uvalue;
struct {
int16_t decimal;
int16_t predecimal;
};
};
typedef union fp1616 fp1616_t;
#define fp1616(v) ((fp1616_t){value: v})
static inline fp1616_t fp1616_add ( fp1616_t a, fp1616_t b ) { return fp1616( a.value + b.value); };
static inline fp1616_t fp1616_sub ( fp1616_t a, fp1616_t b ) { return fp1616( a.value - b.value); };
static inline fp1616_t fp1616_mul ( fp1616_t a, fp1616_t b ) { return fp1616( ((int64_t)a.value * (int64_t)b.value) >> FP1616_FRAC ); };
static inline fp1616_t fp1616_div ( fp1616_t a, fp1616_t b ) { return fp1616( ((int64_t)a.value << FP1616_FRAC) / b.value ); };
#define fp1616_eq(a,b) ((a.value == b.value))
#define fp1616_lt(a,b) ((a.value < b.value))
#define fp1616_gt(a,b) ((a.value > b.value))
#define fp4816_from_1616(fp1616) ((fp4816_t)fp1616.value)
#define fp1616_from_4816(fp4816) ((fp1616_t){value: (int32_t)fp4816 })
#define fp1616_from_float_c( value ) (fp1616(value * 65536.0f))
#define fp1616_from_float(f) (fp1616(fp4816_from_float(f)))
#define fp1616_from_int( value ) ( fp1616( (long)value << 16 ) )
#define fp1616_to_float( fp ) ( fp4816_to_float( fp4816_from_1616(fp) ) )
struct _fp1616_smoother {
fp1616_t value,
sum,
k;
};
fp1616_t fp1616_smoother(struct _fp1616_smoother *smoother,fp1616_t sample);
static inline void fp1616_smoother_set(struct _fp1616_smoother *smoother,fp1616_t tn) {
if (smoother) {
smoother->value.value = 0;
smoother->sum.value = 0;
smoother->k = fp1616_div(fp1616(65536),tn);
};
};