Цифровой фильтр в формате Q15 выдаёт мусор на AVR и работает на STM32
Коэффициенты фильтра хранятся в Q15 (0x4000 = 0,5). Умножение:
int16_t q15_mul(int16_t a, int16_t b) {
return (int16_t)((a * b) >> 15);
}
На STM32 q15_mul(0x4000, 0x4000) даёт 0x2000 (0,25). На ATmega тот же код даёт бессмысленные значения. Как исправить?
- Привести a к int32_t до умножения
- Привести результат сдвига к int32_t
- Сдвинуть a и b на 15 бит до умножения
- Заменить сдвиг на деление на 32768
