// Variable Index Dynamic Average // // variable_index_dynamic_average // // Variable Index Dynamic Average // // // // Inputs: 1 // Outputs: 1 // Constants: 1 #include #include "ts.h" typedef struct { uint_t period; } ts_variable_index_dynamic_average_params_t; ts_parameter_t const ts_variable_index_dynamic_average_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_variable_index_dynamic_average_params_t) }; uint_t ts_variable_index_dynamic_average_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_variable_index_dynamic_average_params_t *)c)->period : 0 ); } int ts_variable_index_dynamic_average( 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_variable_index_dynamic_average_p ); if ( !c ) return -1; uint_t period = ((ts_variable_index_dynamic_average_params_t *)c)->period; if (period < 2 || n <= period) return -1; fp_t vidya = x[0][period]; y[0][period] = vidya; fp_t alpha_init = (fp_t)(period - 2) / (2.0 * (fp_t)(period - 1)); fp_t alpha = alpha_init; for( uint_t i = period + 1; i < n; ++i ) { vidya = vidya + alpha * (x[0][i] - vidya); y[0][i] = vidya; fp_t numerator = fabs( x[0][i] - x[0][i - period] ); fp_t denominator = 0; for( uint_t j = i - period + 1; j <= i; ++j ) denominator += fabs( x[0][j] - x[0][j - 1] ); fp_t er = (denominator == 0) ? 0 : numerator / denominator; fp_t alpha_new = er * er * 2.0 / (fp_t)(period + 1); if( alpha_new < 0 ) alpha_new = 0; if( alpha_new > 1 ) alpha_new = 1; alpha = (alpha + alpha_new) / 2.0; } return 0; }