#pragma once #include #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); }; };