2015-12-04 2 views
0

Есть ли элегантный способ сделать линейную интерполяцию с использованием целых чисел? (Для средних измерений АЦП в микроконтроллере измерения АЦП составляют 12 бит, микроконтроллер отлично работает с 32-битными целыми числами). Коэффициент f находится в диапазоне [0, 1].lerp для целых чисел или в математике с фиксированной точкой

float lerp(float a, float b, float f) 
{ 
    return a + f * (b - a); 
} 
+1

http://stackoverflow.com/a/21379337/99691 – gordy

ответ

2

Ну, так как у вас так много дополнительных целочисленных битов в обрез, решение с использованием Интс будет:

Используйте целое число для параметра F с F от 0 до 1024 вместо поплавка от 0 до 1. Затем вы можете просто:

(A*(1024-F) + B * F) >> 10 

без риска переполнения.

На самом деле, если вам нужно больше разрешения в вашем параметре, вы можете выбрать максимальное значение F как любую мощность от 2 до 2**19 (если вы используете неподписанные ints; 2**18 в противном случае).

Это не делает хорошую работу округления (вместо этого она обрезается), но она использует только целые операции и позволяет избежать деления с помощью оператора сдвига. Он по-прежнему требует целочисленного умножения, в котором у нескольких MCU нет аппаратного обеспечения, но, надеюсь, это будет не так уж плохо.

+0

Есть ли A и B в этом ответе целые числа или поплавки? – jjxtra

Смежные вопросы