Алгоритм сглаживания c использованием целочисленной арифметики
следующий код был взят из Arduino учебник по сглаживанию:
int smooth(int data, float filterVal, float smoothedVal) {
if (filterVal > 1) {
filterVal = .99;
}
else if (filterVal <= 0) {
filterVal = 0;
}
smoothedVal = (data * (1 - filterVal)) + (smoothedVal * filterVal);
return (int)smoothedVal;
}
следующее утверждение, взятое из того же учебника, заставило меня задуматься:
эта функция может быть легко переписана с помощью all-integer math, если вам нужна большая скорость или вы хотите избежать поплавков.
факт в том, что я хочу избежать поплавков и увеличить скорость, но мне интересно: как преобразовать это в целочисленную арифметику? Немного стучать решения бонус ;о)
1 ответов
простой метод масштабирования путем умножения входного значения, например 10000
и положить этот результат в int
выполните вычисления в int
, а затем масштабируйте вывод обратно в float
путем делить с таким же фактором.
в вашей функции вам также нужно масштабировать все с тем же фактором.
выбор фактора зависит от возможных диапазонов значений; вы хотите избежать переполнения на верхнем конце и неточности на нижний конец. Если вы подумаете об этом, фактор определяет, где вы ставите десятичную точку: фиксированная точка, а не плавающая точка.
фактор может быть чем угодно, он не должен быть 100
, 1000
и так далее, но 627
тоже нормально.
если вы идете по этому маршруту, вы хотите преобразовать столько кода в int
, потому что преобразования, описанные выше, конечно, также требуют времени.
чтобы проиллюстрировать мою точку зрения, следующее Может быть это:
#define FACTOR 10000 // Example value.
int smooth(int data, int filterVal, int smoothedVal)
{
if (filterVal > FACTOR)
{
filterVal = FACTOR - 100;
}
else if (filterVal <= 0)
{
filterVal = 0;
}
smoothedVal = (data * (FACTOR - filterVal)) + (smoothedVal * filterVal);
return smoothedVal;
}
вам может понадобиться / хотите проверить переполнение,...