linear-filter

jesuso/linear-filter/linear-filter

No description
linear-filter
@/linear-filter
VALnumber
ADDpulse
linear-filter
AVG
VAL
ADD
AVGnumber
To use the node in your project you should have the jesuso/linear-filter library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

const int size = 5;

class LinearFilter {
  Number stack[size];

  public:
    LinearFilter() {
      for (int i = 0; i < size; i++) {
        stack[i] = -1;
      }
    }

    void add(Number val) {
      // Displace elements to the "right"
      for (int i = size - 1; i > 0; i--) {
        stack[i] = stack[i - 1];
      }
      // And insert the new element
      stack[0] = val;
    }

    Number average() {
      Number total = 0;
      int elements = 0;

      for (int i = 0; i < size; i++) {
        const Number val = stack[i];

        // Ignore empty values (-1)
        if (val == -1) {
          continue;
        }

        total += val;
        elements++;
      }

      return total / elements;
    }
};

struct State {
    LinearFilter linearFilter;
};

{{ GENERATED_CODE }}

void evaluate(Context ctx) {
    State* state = getState(ctx);

    if (!isInputDirty<input_ADD>(ctx)) {
        return;
    }

    Number val = getValue<input_VAL>(ctx);
    state->linearFilter.add(val);

    Number average = state->linearFilter.average();
    emitValue<output_AVG>(ctx, average);
}