File util_core.h¶
File List > inc > util > util_core.h
Go to the documentation of this file
#ifndef UTIL_CORE_H
#define UTIL_CORE_H
#include "clib_common.h"
#include "jm_perf.h"
#include <math.h>
#ifdef __cplusplus
extern "C"
{
#endif
JM_FORCEINLINE float _Complex
square_clip (float _Complex y, float lin)
{
float r = fminf (fmaxf (crealf (y), -lin), lin);
float i = fminf (fmaxf (cimagf (y), -lin), lin);
return r + i * I;
}
JM_FORCEINLINE double
saturate (double v, double lo, double hi, double nan_to)
{
if (v >= lo && v <= hi)
return v; /* the common case; false for NaN, which falls through */
if (v < lo)
return lo;
if (v > hi)
return hi;
return nan_to; /* nothing else can reach here */
}
JM_FORCEINLINE double
ema_step (double state, double x, double alpha)
{
/* Loop-invariant, and folded away entirely when alpha is a
compile-time constant, so the common path pays nothing. */
if (alpha >= 1.0)
return x;
return state + alpha * (x - state);
}
JM_FORCEINLINE double
ema_alpha_decim (double alpha, size_t d)
{
if (d <= 1)
return alpha; /* exact by construction, not by luck */
if (alpha <= 0.0)
return 0.0;
if (alpha >= 1.0)
return 1.0; /* log1p(-1) is -inf; answer it directly */
return -expm1 ((double)d * log1p (-alpha));
}
#ifdef __cplusplus
}
#endif
#endif /* UTIL_CORE_H */