В этом разделе вы найдете пример использования объекта LPFilter

Назначение

Объект LPFilter предназначен для сглаживания значений, а также для расчета количества событий в секунду


Пример использования

var timer = new Timer();

var lpFilter    = new LPFilter();   // Создать объект
lpFilter.lpf    = 0.333;            // значение сглаживающего фильта

Конструктор

new Timer() Создать объект


var lpF = new LPFilter(); // Создать объект


Свойства (property)

Пример использования:


var filter = new LPFilter(); // Создать объект
filter.lpf = 0.15;


bool filter.lpf Чтение/запись
Значение ФНЧ (в пределах от 0.01 до 1.00) По умолчанию 0.5
Если установить в 1.00 то фильтрация будет отключена



Сигналы

Отсутствуют


Методы


float filter.calc(val) Функция
Добавить значение в расчет и возвратить выровненное значение


var filter = new LPFilter(); // Создать объект

filter.lpf = 0.15;

var vals = [0.1, 1.2, 0.5, 0.55, 0.33];

for(var i = 0; i < vals.length; ++i){
    var ret = filter.calc( vals[i] );
    post.log('e', i + ':\t:' +  ret.toFixed(3) )
}
/* выведет в лог
 0:	:0.100
 1:	:0.265
 2:	:0.300
 3:	:0.338
 4:	:0.337
*/

// Псевдокод поясняющий механизм фильтрации

var vals = [0.1, 1.2, 0.5, 0.55, 0.33];

var lpf = 0.15;

var ret = 0.0;

for(var i = 0; i < vals.length; ++i){

    if(ret == 0) ret = vals[i];
    else         ret = (ret * (1 - lpf) + vals[i] * lpf);

    post.log('e', i + ':\t:' +  ret.toFixed(3) )
}

/* выведет в лог
 0:	:0.100
 1:	:0.265
 2:	:0.300
 3:	:0.338
 4:	:0.337
*/


float filter.perSecond(eventCounter) Функция
Подсчитать количество событий в секунду
eventCounter - счетчик событий (монотноно увеличивающийся счетчик)


var lpFilter    = new LPFilter();   // Создать объект
lpFilter.lpf    = 0.15;             // значение сглаживающего фильта

var timer = new Timer();
timer.interval  = 250;

timer.timeout.connect(function timeout(){
    var t1 = new Date().valueOf();
    post.log(t1 + ':\t:' + lpFilter.perSecond( t1 ).toFixed(2));
});
timer.start();

// источником событий является счетчик ms от системного времени
// в лог, с интервалом timer.interval будет выводиться расчетное значение ms в секунде

// ============================================

// Пример, моделирующий поступление событий в течении 25 timer.timeout
// и отсутствие поступления событий в течении следующих 25 timer.timeout
// с последующим возобновлением поступления событий

var lpFilter    = new LPFilter();   // Создать объект
lpFilter.lpf    = 0.33;             // значение сглаживающего фильта

var timer = new Timer();
timer.interval  = 250;

var t2;
var cnt         =  25;

timer.timeout.connect(function timeout(){

    t2 = (--cnt) < 0 ? t2 : new Date().valueOf();
    if(cnt < -35) {t2 = new Date().valueOf(); cnt++;}

    post.log(t2+ ':\t' + cnt + ':\t' + (t2-t1) + ':\t:' + lpFilter.perSecond(t2).toFixed(2));

    t1 = new Date().valueOf();
});

timer.start();
var t1 = new Date().valueOf();

/* В логе будут следующие записи
Системное время cnt (t2-t1) perSecond
14:21:27.733:	18:	  342:	:999.99
14:21:28.079:	17:	  341:	:999.97
14:21:28.423:	16:	  343:	:999.95
14:21:28.763:	15:	  339:	:999.99
14:21:29.108:	14:	  340:	:999.82
14:21:29.449:	13:	  340:	:999.98
14:21:29.792:	12:	  342:	:999.79
14:21:30.136:	11:	  343:	:1000.05
14:21:30.479:	10:	  342:	:999.99
14:21:30.827:	9:	  346:	:999.99
*/

float filter.reset() Функция
Инициализировать расчет perSecond (сбросить все внутренние счетчики)
Всегда возвращает 0.0


var lpFilter    = new LPFilter();   // Создать объект
lpFilter.lpf    = 0.20;             // значение сглаживающего фильта

var timer = new Timer();
timer.interval  = 250;

var cnt = 0;

timer.timeout.connect(function timeout(){

    var t1 = new Date().valueOf();

    if(++cnt > 20 )
    {
        cnt = 0;
        var ret = lpFilter.reset();
    }
    else
    {
        ret = lpFilter.perSecond( t1 );
    }
    post.log(t1 + ': ' + cnt + ':\t:' + ret.toFixed(2));
});
timer.start();