lowpassf
Version:
lowpass filter for javascript/node
224 lines (183 loc) • 7.53 kB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var LowpassFilter = require('../../src/LowpassFilter');
console.log = function (s) {
document.write(s + "<br>");
}
var filter = new LowpassFilter();
//Set average logic from ( filter.LinearWeightAverage/ filter.SimpleAverage)
filter.setLogic(filter.LinearWeightAverage);
//filter.setLogic(filter.SimpleAverage);
var data = [100, 100, 200, 200, 300, 300]
var i;
var sampleRange = 20;
console.log("Prepare data...");
for (i = 0; i < data.length; i++) {
console.log("data[" + i + "]=" + data[i]);
}
console.log("");
console.log("Start filtering...");
//Specify how many items to buffer
filter.setSamplingRange(sampleRange);
for (i = 0; i < data.length; i++) {
//put current value
filter.putValue(data[i]);
//get current "filtered" value
//Get the latest calculated moving average of the values putted so far
var filteredValue = filter.getFilteredValue();
var logStr = "data[" + i + "]=" + data[i]
+ " added. current filtered val is "
+ filteredValue;
console.log(logStr);
}
},{"../../src/LowpassFilter":2}],2:[function(require,module,exports){
/*
* Copyright (c) 2010-2017 Tom Misawa(riversun.org@gmail.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
var LowpassFilter = (function () {
/**
* Calculate Simple Moving Average
* @param params
* @constructor
*/
function LowpassFilter(params) {
this.mSamplingRange = 0;
this.mSamplingBuffer = [];
this.mCurrentFilterVal = 0;
this.mCurrentDataNumber = 0;
this.setSamplingRange(20);
//set linear weight moving average logic as default
this.calcLogic = this.LinearWeightAverage;
//this.calcLogic = this.SimpleAverage;
}
LowpassFilter.prototype.setLogic = function (func) {
var _this = this;
_this.calcLogic = func;
};
LowpassFilter.prototype.LinearWeightAverage = function (numerator, range, n, samplingBuffer, denominator) {
numerator += (range - n) * samplingBuffer[n];
denominator += (range - n);
return {numerator: numerator, denominator: denominator};
};
LowpassFilter.prototype.SimpleAverage = function (numerator, range, n, samplingBuffer, denominator) {
numerator += samplingBuffer[n];
denominator = range;
return {numerator: numerator, denominator: denominator};
};
/**
* Set sampling range(DEFAULT is 20)
* @param range
*/
LowpassFilter.prototype.setSamplingRange = function (range) {
var _this = this;
_this.mSamplingRange = range;
_this.mSamplingBuffer = new Array(_this.mSamplingRange);
};
/**
* Returns total count
* @param range
* @returns {number}
*/
LowpassFilter.prototype.getTotalCount = function (range) {
var _this = this;
return _this.mCurrentDataNumber;
};
/**
* Get the latest filtered(linear weighted) value
*
* @return
*/
LowpassFilter.prototype.getFilteredValue = function () {
var _this = this;
var filteredVal = _this.mCurrentFilterVal;
return filteredVal;
};
/**
* Put the current value to filter
*
* @param val
*/
LowpassFilter.prototype.putValue = function (val) {
var _this = this;
_this.mCurrentFilterVal = _this.filter(val, _this.mSamplingBuffer);
};
/**
* Get raw buffer
* @returns {Array}
*/
LowpassFilter.prototype.getSampingBuffer = function () {
var _this = this;
return _this.mSamplingBuffer;
};
/**
* Get sampling range you specified
* @returns {number|*}
*/
LowpassFilter.prototype.getSamplingRange = function () {
var _this = this;
return _this.mSamplingRange;
};
/**
* Fill out buffer by specified value
* @param val
*/
LowpassFilter.prototype.fillValue = function (val) {
var _this = this;
for (var i = 0; i < _this.mSamplingBuffer.length; i++) {
_this.mSamplingBuffer[i] = val;
}
};
/**
* Do filter
* @param inputValue the latest(current) value
* @param samplingBuffer
* @returns {number}
*/
LowpassFilter.prototype.filter = function (inputValue, samplingBuffer) {
var _this = this;
_this.mCurrentDataNumber++;
var range = samplingBuffer.length;
if (_this.mCurrentDataNumber < range) {
range = _this.mCurrentDataNumber;
}
for (var i = (range - 1) - 1; i >= 0; i--) {
// copy next element to prev element
samplingBuffer[i + 1] = samplingBuffer[i];
}
// Add current value to last
samplingBuffer[0] = inputValue;
var numerator = 0;
var denominator = 0;
for (var n = 0; n < range; n++) {
var result = _this.calcLogic(numerator, range, n, samplingBuffer, denominator);
numerator = result.numerator;
denominator = result.denominator;
}
var currentOutputVal = numerator / denominator;
return currentOutputVal;
};
return LowpassFilter;
}()
);
if (typeof(module) !== "undefined") {
module.exports = LowpassFilter;
}
},{}]},{},[1]);