Подскажите пожалуйста, какие функции применяются в WB-LED для создания нелинейности управления яркостью и температурой? Мне для моей задачи нужен линейный контроль освещённости в люксах и цветовой температуры в Кельвинах. Как вариант, я нашёл функции аппроксимации для кривых, или можно прямо таблично переводить, но хочется узнать исходные данные для простоты работы.
Снял кривые попроцентно (зависимость сырого значения от значения процентов): Яркость:
Нужна плавность перехода, прямое управление ШИМ не подойдёт, тк регулировка будет быстрыми скачками.
Очень желательны точные функции с параметрами (для яркости и температуры), чтобы не гадать по этому вопросу.
Вообще, было бы неплохо добавить опцию в конфигурацию модуля, которая включает/отключает нелинейность.
Ещё заметил, что нормализация не совсем ожидаемо работает. По идее же сумма каналов c1+c2 = brightness * 2048
но в итоге получается на 20 единиц выше, что соответствует смещению ШИМ при 1% яркости.
Подобрал функции линеаризации и написал классы. Может кому понадобятся:
function WBLED_BrightMapper(a, b, c, d) {
var self = this;
a = a || 3.48204801;
b = b || -0.16440747;
c = c || 1.95761972;
d = d || -3.053028;
self.forward = function (x) {
return a * Math.exp(c * x + d) + b;
}
self.backward = function (y) {
var v = (y - b) / a
return (Math.log(v) - d) / c
}
}
function WBLED_TempcolorMapper(x0, y0, A, k) {
var self = this
x0 = x0 || 0.50001874;
y0 = y0 || 0.50000733;
A = A || 0.82138416;
k = k || 0.32138416;
self.forward = function (x) {
x -= x0
return y0 + A * x / (Math.abs(x) + k)
}
self.backward = function (y) {
var y_ = (y - y0) / A
if (y_ >= 0)
return x0 + (y_ * k) / (1.0 - y_)
else
return x0 + (y_ * k) / (1.0 + y_)
}
}
Вход и выход нормализованы на [0; 1]
forward - переводит желаемую яркость или температуру в реальное значение
backward - переводит реальное значение в желаемое