Страница 1 из 1
Как посчитать нелинейность зрения.
Добавлено: 07.08.2020{, 20:36}
RootShell
Есть у меня светодиодная лента и большое желание управлять ее яркостью, причем управлять правильно. В общем то ничего сложного. Берем обычный PWM, мосфет и управляем. Но зрение нелинейно и на малой яркости изменение шим на 1 значение заметно, а на большой этого не видно. Из 1024 значения шим делаем 10 предустановок и раскидываем PWM по нелинейной зависимости. Вопрос как посчитать нелинейность зрения? Что бы каждое изменение яркости 1-10 было одинаковым и на на малой яркости и на большой. С ходу ничего нагуглить не удалось. Даже не знаю заморачивался ли кто-то этим.
Как посчитать нелинейность зрения.
Добавлено: 07.08.2020{, 21:07}
Rovki
тут не только нелинейность зрения ,но и самих источников света . Нужна логарифмическая шкала
Как посчитать нелинейность зрения.
Добавлено: 07.08.2020{, 21:10}
Dryundel
RootShell, нелинейность зрения, а точней восприятия глазом свечения понятие весьма неоднозначное. это типа как погода на яндексе. +20 ощущается как +18.
Вариант первый.
Есть такой критерий как освещенность вот оно несколько ближе к восприятию. Воспользовавшись соответствующим измерителем заносим в таблицу нелинейного масштабирования значения PWM с равным шагом по шкале освещенности. Ну и дальше понятно, я думаю.
Вариант второй.
Органолептическим способом составляем такую же таблицу и так же используем нелинейное масштабирование.
О существовании соответствующего штатного блока, думаю говорить лишнее.
Как посчитать нелинейность зрения.
Добавлено: 07.08.2020{, 21:15}
Rovki
Как посчитать нелинейность зрения.
Добавлено: 07.08.2020{, 21:26}
RootShell
Мне не нужен штатный блок я пишу на С/С++ и мне нужна только формула расчета. Органолептический способ такое себе, он неточен как погода на марсе. Измерять освещенность в люксах так же не подходит у меня не освещенность, а светимость. И к тому же у них линейная зависимость. Логарифмическая шкала идеальна, но она должна быть как то расчитана. Вот и спрашиваю как расчитать?
UPD: Огромное спасибо
Rovki. Это то, что нужно.
Отправлено спустя 13 минут 26 секунд:
Степенную зависимость более просто расчитать в микроконтроллере. Логарифм не лезет в прошивку, места не хватает. Хотя можно посчитать по лагорифму и сделать массив тогда и math.h не нужно подключать.
Идеальны оба решения. Расскажите, как это гуглилось? пытался решить безуспешно через синус.
Отправлено спустя 4 часа 39 минут 46 секунд:
Что то странное в формуле с логарифмом
S(R)=k*ln(R)
R=1024 подбираю
k = 14.427 что бы
S=100 и поехал строить график.
PWM | % | 2^ |
1024 | 100 | 10 |
512 | 90 | 9 |
256 | 80 | 8 |
128 | 70 | 7 |
64 | 60 | 6 |
32 | 50 | 5 |
16 | 40 | 4 |
8 | 30 | 3 |
4 | 20 | 2 |
2 | 10 | 1 |
Что то мне это напоминает? Да это же двойка в степени.
Что я делаю не так? При этом график не линейный и при пересчете на 255 шим все четко совпадает с автором статьи.
Отправлено спустя 34 минуты 3 секунды:
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 10:55}
Dryundel
RootShell писал(а): ↑08.08.2020{, 02:53}
Что я делаю не так? При этом график не линейный и при пересчете на 255 шим все четко совпадает с автором статьи.
Похоже все так. Даже интересно стало. Проверил построение графиков по логарифму с коэффициентом и по двойке в степени. Действительно одинаковые графики Microsoft Mathematics нарисовал. Такой момент можно было заметить только на ШИМ 1024 и задатчике с процентной шкалой (0-100). Циферки совпали.
Если же к примеру брать как по умолчанию на AVR - задатчик аналоговый вход (0-1024) а шим (0-255), то думаю через логарифм с подбором коэффициента считать проще.
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 12:38}
Rovki
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 15:58}
Dryundel
RootShell, ну прям зацепила ваша тема. Мозги размял.
В результате полторы строчки кода и блок ШИМ для правильного управления свечением LED.
Если у кого есть возможность проверить в железе - отпишитесь как работает
В настройках блока два параметра
- Максимальное значение по входу
- Максимальное значение по выходу
Коэффициент для логарифма рассчитывается автоматом, исходя из этих параметров.
.
- PWM_LED_1.jpg (7.52 КБ) 1162 просмотра
.
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 17:51}
Rovki
Так и адресные ленты можно будет регулировать ....
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 19:36}
Dryundel
Rovki писал(а): ↑08.08.2020{, 17:51}
Так и адресные ленты можно будет регулировать ....
Как то сомневаюсь в этом. У адресных лент свой шим на каждый канал каждого модуля которые обеспечиваются адресными чипами. Такой способ возможен только с простой светодиодной лентой, в том числе и RGB но безадресной. Той которая светится только целиком.
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 21:45}
RootShell
в Я.Железо предлагали пересчитать таблицу серого для настройки монитора под мою разрядность.
Вот эту:
Оставлю эту запись, может когда пересчитаю.
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 21:48}
SSSergeich
Dryundel писал(а): ↑08.08.2020{, 19:36}
Как то сомневаюсь в этом. У адресных лент свой шим на каждый канал каждого модуля которые обеспечиваются адресными чипами
И зря!
Видимо
Rovki, имел ввиду НЕадресные ленты на основе WS28__.
По сути тот же RGB светодиод. 4 года назад я прилично времени потратил, пытаясь на глаз подобрать эффекты плавности для таких лент. А точнее хотел получить эффект вспышки.
И ведь даже были рекламные экраны на базе таких лент. Если помнишь, был здоровенный экран над бакалейкой, который резко бил по глазам всем автомобилистам, кто ехал от московского в сторону центра, который однажды благополучно сгорел. Так вот этот экран был на базе WS2801. Все бы ничего, но он страдал диким пересветом и недосветом.
А ведь наверно можно довольно таки хорошо "причесать" световой код используя совместно такой блок и алгоритм брезенхема...
Как посчитать нелинейность зрения.
Добавлено: 08.08.2020{, 22:30}
Dryundel
RootShell писал(а): ↑08.08.2020{, 21:45}
в Я.Железо предлагали пересчитать таблицу серого для настройки монитора под мою разрядность.
Может и не стоит таблицу считать. Посмотри в блоке код. Там под любую разрядность по входу и по выходу через логарифм все считается.
Еще короче код, написать сложно.
Есть конечно опасения, что эти вычисления возьмут чуть больше времени, но за то меньше памяти съедят.
Как посчитать нелинейность зрения.
Добавлено: 10.08.2020{, 13:38}
Dryundel
RootShell, К стати, если все же выбор пал на таблицы для масштабирования, блок можно использовать как калькулятор.
Ну или вот формулы для расчета:
k=Smax/ln(Rmax)
R(S)=E^(S/k)
Или если объединить:
R(S)=E^(S/(Smax/ln(Rmax)))
Отправлено спустя 1 час 22 минуты 13 секунд:
Единственный не хороший момент, который так же описан в статье:
Это то, что по данной формуле, R(S) не сможет принять значение меньше единицы.
Но и его можно обойти.
К примеру так:
R(S)=E^(S/(Smax/ln(Rmax+1)))-1
И тогда вообще все по феншую получается.
Отправлено спустя 46 минут 20 секунд:
И код еще короче
Код: Выделить всё
void setup()
{
k = Amax / log(Pmax+1);
}
void loop()
{
P = lrint(pow(M_E, (A / k))) - 1;
}
Где Amax и Pmax константы. Входной и выходной максимумы (Входная и выходная битность) соответственно.
.
- PWM_LED_2.jpg (3.11 КБ) 1005 просмотров
.
Работает на ура.
Данный блок рабочий, но довольно медленный. Правильные и быстрые блоки
ЗДЕСЬ.
Как посчитать нелинейность зрения.
Добавлено: 10.08.2020{, 17:42}
RootShell
Dryundel, =) Благодарю. К сожалению я не использую flprog. В моем устройстве так и остался pwm 0-1024. Предустановки нужного значения задаются через node-red и передаются в устройство через mqtt. В общем то, эти предустановки и требовалось рассчитать. Переход между установками проходит через метод Fade - постепенное увеличение или уменьшение яркости. Сам fade принимает 2 аргумента setBrightness и speed. Так как в устройстве 2 белых ленты warm/cold и хочется ими тонко рулить - вынес управление pwm пока наружу.
R(S)=E^(S/(Smax/ln(Rmax+1)))-1 (E в степени.) Давненько не развлекался с логарифмами, не смог решить простую задачу. Считал через подбор константы. Математик еще тот из меня. Но зато голову размял, а это всегда хорошо.
FLProg не плохой проект, а очень даже замечательный. Задумка просто отличная и реализация на уровне. Просто у меня не очень сложилось с arduino ide. Основное беспокойство доставляет отсутствие темной темы, и управление линкером. Пару раз пробовал кодить визуально, но все равно потом правил код перед заливкой в микропроцессор. Впервые про этот проект услышал года 3-4 назад. От деда - радиолюбителя, все никак руки не доходили посмотреть.
Как посчитать нелинейность зрения.
Добавлено: 10.08.2020{, 22:12}
Dryundel
RootShell писал(а): ↑10.08.2020{, 17:42}
К сожалению я не использую flprog. В моем устройстве так и остался pwm 0-1024
Не понимаю в чем проблема. Я же выложил код под любую дискретность. И голые формулы тоже. Используйте. С++ везде одинаковый.
Одна коротенькая строчка заменяет таблицу из 2048 значений в вашем случае.
А то что блок выложил, так это для всех. Не гоже на этом форуме без блоков, одним кодом оперировать. Может кому то сгодится. Тема то правильная.
Как посчитать нелинейность зрения.
Добавлено: 10.08.2020{, 23:57}
RootShell
За формулы низкий поклон, я их в javaScript буду использовать. Какая разница где им работать? Математика везде одинакова. В микроконтроллере каждый байт на счету.
Как посчитать нелинейность зрения.
Добавлено: 19.01.2021{, 11:46}
Dryundel
ВНИМАНИЕ!
Блок коррекции из поста
#14 хоть и рабочий, но довольно медленный из-за сложности формулы.
Правильные и быстрые блоки
ЗДЕСЬ.