Эффективная целочисленная одномерная функция дизеринга?

Недавно я много играл со светодиодами, работающими на 8-битных микроконтроллерах. Иногда необходимо использовать чисто программные реализации широтно-импульсной модуляции для управления яркостью светодиодов -, то есть включать и выключать свет с быстрым изменением соотношения времени включения и выключения. Это прекрасно работает, пока я не уменьшу яркость примерно до 5%, когда стробирование начинает выглядеть неприятно мерцающим для глаз.

Реализуя ШИМ в виде цикла, он проходит через каждое число от 0-255, устанавливая или выключая свет в данный момент. Свет, установленный на значение 20, будет гореть первые 20 петель, а затем выключаться.

Я ищу хорошую функцию, которая будет перетасовывать эти числа, чтобы вместо перебора 0, 1, 2, 3... мой цикл мог выбирать полу-случайно из пула возможностей. Совокупная яркость с течением времени одинакова, но свет со значением яркости 20 может включаться и выключаться около дюжины раз в течение 256 циклов, а не просто загораться один раз, а затем выключаться на протяжении большей части цикла. Это уменьшает эффект мерцания, даже если цикл работает немного медленнее.

Хорошая функция дизеринга должна возвращать каждое число из 8-битного диапазона при вызове с каждым 8-битным числом. Следовательно, также необходимо не создавать повторяющихся чисел -, а не случайных, а просто перетасовывать. Лучше всего, если подобные числа не складываются в последовательность -разница между каждым числом должна быть высокой -в идеале около 64-127 I цифра.

Ограничения также интересны -это приложение критично по времени. Сложение, вычитание и побитовые операции стоят 1 произвольную единицу времени, умножение стоит 2 единицы,а деление стоит 4 единицы. О числах с плавающей запятой не может быть и речи, и затраты примерно удваиваются на каждые кратные 8 битам, используемым в промежуточном числе. Таблицы поиска возможны, но они будут использовать примерно половину общего объема памяти устройства -, поэтому быстрые алгоритмы лучше всего подходят для повторного использования, но медленные алгоритмы хорошего качества также очень полезны, когда есть место для предварительного вычисления.

Спасибо за помощь с любыми идеями или размышлениями.:)

5
задан Blixxy 6 April 2012 в 04:23
поделиться