мимокрокодил (19.12.2015 13:02, просмотров: 1) ответил misyachniy на "Кто виноват?" понятно, а второй извечный вопрос?
Можно сохранять младшие биты в аккумуляторе Т.е. держать в памяти не y, а y*256.
static int32_t acc;
acc += x - ((acc + 128) >> 8); // На каждом новом сэмпле
result = (acc + 128) >> 8; // Когда надо получить результат
Лучше хранить не 8 младших бит, а больше - главное, чтобы не случилось переполнения.
Если динамический диапазон достаточно узок, сделать точнее, чем флоат, вообще не проблема: там всего 24 значащих бита.
Формулы:
y1 = (1 - a)*y0 + a*x
y1 = [(N - a*N)*y0 + a*N*x] / N
N*y1 = N*y0 - a*N*y0 + a*N*x
Подставляем N = 256 и a = 1/256, получаем то, что приведено выше.