После «оптимизации» деления сдвигом фильтр смещения ушёл в минус
Усреднение восьми знаковых отсчётов смещения нуля:
int32_t sum = 0;
for (int i = 0; i < 8; i++) sum += offset[i];
int16_t avg = sum >> 3; /* было: sum / 8 */
После замены / 8 на >> 3 калибровка на отрицательных смещениях систематически занижена на единицу: при sum = -3 раньше было 0, теперь -1. Что происходит?
- Сдвиг округляет вниз, а деление — к нулю
- Сдвиг знакового числа всегда даёт мусор
- Сдвиг вправо делит на 16, а не на 8
- Компилятор заменил сдвиг логическим
