// T3 // // t3 // // T3 Moving Average // // // // Inputs: 1 // Outputs: 1 // Constants: 0 #include "ts.h" ts_parameter_t const ts_t3_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; uint_t ts_t3_offset( ts_constant_t const *c ) { ( void )c; return ( 0 ); } int ts_t3( fp_t * const *y, uint_t y_n, fp_t const * const *x, uint_t x_n, uint_t n, ts_constant_t const *c ) { TS_PROLOGUE( ts_t3_p ); (void)c; if (n == 0) return -1; uint_t k = 5; fp_t b = 0.7; fp_t alpha = 2.0 / ( (fp_t)k + 1.0 ); fp_t c3 = b; fp_t c3m1 = c3 - 1.0; fp_t c3m2 = c3 - 2.0; fp_t c3m3 = c3 - 3.0; fp_t w3 = c3; fp_t w2 = -3.0 * c3m1; fp_t w1 = 3.0 * c3m1 * c3m2; fp_t w0 = -c3m1 * c3m2 * c3m3; fp_t ema1 = x[0][0]; fp_t ema2 = x[0][0]; fp_t ema3 = x[0][0]; y[0][0] = x[0][0]; for( uint_t i = 1; i < n; ++i ) { ema1 = ema1 + alpha * ( x[0][i] - ema1 ); ema2 = ema2 + alpha * ( ema1 - ema2 ); ema3 = ema3 + alpha * ( ema2 - ema3 ); y[0][i] = w3 * ema3 + w2 * ema2 + w1 * ema1 + w0 * x[0][i]; } return 0; }