У меня есть плата MP3, прикрепленная к микроконтроллеру ATmega, который дополнительно подключен к потенциометру. Плата MP3 воспроизводит данные MP3 непосредственно через встроенный динамик, поэтому я также могу установить громкость вывода.математическая функция как двоичные операции
Итак, как вы могли догадаться, я прочитал значение из poti и направил его на микроконтроллер. К сожалению, микроконтроллер не увеличивает объем линейным способом. Таким образом, из значений от 0 до 128 вы почти ничего не слышите, а от 128 до 255 (макс.) Громкость быстро увеличивается.
Я узнал, что следующая функция может решить эту проблему:
vol = 1 - (1 - x)^4
но х должно быть между 0 и 1, и результат также между 0 и 1.
Поскольку я на микроконтроллер, я хотел бы
- преобразовать эту формулу, так что я могу использовать его с беззнаковыми целыми
- оптимизировать (возможно, использовать несколько дешевых двоичных функций), потому что я читаю значение poti несколько раз в секунду. Поэтому эту функцию нужно рассчитывать несколько раз в секунду, и я тоже хочу использовать микроконтроллер для других вещей ;-)
Возможно, у некоторых из вас есть идея? Было бы замечательно!
uint8_t linearize_volume(uint8_t value) {
// ideas?
// please don't use bigger data types than uint16_t
}
Подняв что-то к четвертой власти, просто возводите в квадрат его дважды. Это слишком дорого? Кроме того, сколько памяти у вас есть, чтобы предварительно скопировать таблицы для ускорений? –
Моя проблема в том, что 255^4 больше 2^16, поэтому я не могу сохранить его в 'uint16_t'. –