// Volume Oscillator // // volume_oscillator // // Volume Oscillator // // // // Inputs: 1 // Outputs: 1 // Constants: 2 #include "ts.h" typedef struct { fp_t fast_k; fp_t slow_k; } ts_volume_oscillator_params_t; ts_parameter_t const ts_volume_oscillator_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 2, .params_size = sizeof(ts_volume_oscillator_params_t) }; uint_t ts_volume_oscillator_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_volume_oscillator_params_t *)c)->slow_k > 0 ? (uint_t)(((ts_volume_oscillator_params_t *)c)->slow_k - 1) : 0 : 0 ); } int ts_volume_oscillator( 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_volume_oscillator_p ); if ( !c ) return -1; fp_t fast_k = ((ts_volume_oscillator_params_t *)c)->fast_k; fp_t slow_k = ((ts_volume_oscillator_params_t *)c)->slow_k; if (fast_k == 0 || slow_k == 0) return -1; if (n == 0) return -1; fp_t fast_a = 2.0 / (fast_k + 1); fp_t slow_a = 2.0 / (slow_k + 1); fp_t fast_ema = x[0][0]; fp_t slow_ema = x[0][0]; y[0][0] = 0; for (uint_t i = 1; i < n; ++i) { fast_ema = fast_ema + fast_a * (x[0][i] - fast_ema); slow_ema = slow_ema + slow_a * (x[0][i] - slow_ema); y[0][i] = slow_ema != 0 ? (fast_ema - slow_ema) / slow_ema * 100 : 0; } return 0; }