summaryrefslogtreecommitdiffstats
path: root/lib/gator_oscillator.c
blob: 02bbc59325f9d3d4e4f20c0bc7b691f933e9c395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Gator Oscillator
//
// gator_oscillator
//
// Gator Oscillator from Alligator lines
//
// Histogram of Alligator Teeth-Lips and Jaw-Teeth
//
// Inputs:    1
// Outputs:   2
// Constants: 0


#include <math.h>
#include "ts.h"


ts_parameter_t const ts_gator_oscillator_p = { .n_inputs = 1, .n_outputs = 2, .n_constants = 0, .params_size = 0 };

uint_t ts_gator_oscillator_offset( ts_constant_t const *c )
{
	( void )c;
	return ( 12 );
}

int ts_gator_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_gator_oscillator_p );
	(void)c;
    /* Gator Oscillator uses Alligator lines:
     * Lips = SMA(5), Teeth = SMA(8), Jaw = SMA(13)
     * Upper = |Lips - Teeth|, Lower = |Jaw - Teeth|
     * Offset 12 because Jaw (SMA13) starts at index 12
     */
    for (uint_t j = 0; j < n && j < 12; ++j) { y[0][j] = 0; y[1][j] = 0; }
    for (uint_t i = 12; i < n; ++i)
    {
        /* SMA(5) - Lips */
        fp_t lips = 0;
        for (uint_t j = i - 4; j <= i; ++j) lips += x[0][j];
        lips /= 5;

        /* SMA(8) - Teeth */
        fp_t teeth = 0;
        for (uint_t j = i - 7; j <= i; ++j) teeth += x[0][j];
        teeth /= 8;

        /* SMA(13) - Jaw */
        fp_t jaw = 0;
        for (uint_t j = i - 12; j <= i; ++j) jaw += x[0][j];
        jaw /= 13;

        y[0][i] = fabs(lips - teeth);
        y[1][i] = fabs(jaw - teeth);
    }
	return 0;
}