//// ПРОГРАММНЫЙ АНАЛОГ RC ФИЛЬТРА
// Два варианта:
// с действительными значениями
// с целыми значениями (быстрее)
#define FLOAT_KOEFF 20.0
float calc_filtr_RC_float (float tmp)
{
static float float_RC;
float_RC += (tmp - float_RC) / FLOAT_KOEFF;
return float_RC;
}
#define INT_KOEFF 16
int calc_filtr_RC_int (int tmp)
{
static int int_RC;
//int_RC += (tmp - int_RC + INT_KOEFF/2) / INT_KOEFF;
int_RC += (tmp - int_RC + INT_KOEFF/2) >> 4;
// Деление на 16 сдвигом, правильное округление при делении
return int_RC;
}
// Функция возвращает значение в INT_KOEFF
// больше (и точнее) чем входное значения
int calc_filtr_RC_int (int tmp)
{
static int int_RC;
//int_RC += tmp - ((int_RC + INT_KOEFF/2) / INT_KOEFF);
int_RC += tmp - ((int_RC + INT_KOEFF/2) >> 4);
// Деление на 16 сдвигом, правильное округление при делении
return int_RC;
}
//////////////////////////////////////////////////////////////////////////////
//// ОПРЕДЕЛЕНИЕ СКОЛЬЗЯЩЕГО СРЕДНЕГО
#define ARRAY_SIZE 20
int calc_skolz_sred (int tmp)
{
// В кольцевом массиве содержаться отдельные значения
static int Array[ARRAY_SIZE];
// Индекс элемента массива, в который будет записано очередное значение
static signed char index;
// Значение суммы отдельных значений
// (правильное значение бывает только один раз за цикл,
// после суммирования ARRAY_SIZE значений)
// (необходимо для периодической юстировки skolz_summ)
static int summ;
// Скользящее значение суммы ARRAY_SIZE отдельных значений
// (каждый раз правильное значение)
static int skolz_summ;
summ += tmp; // вычисляем временную сумму
// находим очередное значение индекса
if (--index < 0) {
index = ARRAY_SIZE - 1; // Закольцовываем индекс
skolz_summ = summ; // Юстируем скольз сумму
summ = 0;
} else {
// К правильному значению суммы последних ARRAY_SIZE отдельных значений
// прибавляем самое свежее и вычитаем самое старое
skolz_summ += tmp - Array[index];
}
// заменяем самое старое значение самым свежим
Array[index] = tmp;
//return (skolz_summ + ARRAY_SIZE/2) / ARRAY_SIZE;
return skolz_summ;
// Лучше пусть функция возвращает значение в ARRAY_SIZE
// больше (и точнее) чем входное значения
}