В этом разделе вы найдете пример использования объекта LPFilter
Объект LPFilter предназначен для сглаживания значений, а также для расчета количества событий в секунду
var timer = new Timer(); var lpFilter = new LPFilter(); // Создать объект lpFilter.lpf = 0.333; // значение сглаживающего фильта
new Timer() Создать объект
var lpF = new LPFilter(); // Создать объект
Пример использования:
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();