Вступить в клуб →
сложнаявопросБиты, целые типы и арифметика на МК

Цифровой фильтр в формате 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

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела