Forum: Mikrocontroller und Digitale Elektronik CIE 1931 Formel von 0 bis 100 auf 0 bis 255 erweitern


von Kevin H. (xerxes777)


Lesenswert?

Hallo liebes mikrocontroller team,

ich möchte gerne ein array erstellen damit ich linear led faden kann.
Im Internet habe ich diese Formel gefunden.
https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm
1
Y = (L* / 902.3) ∙ Yn          L* ≤ 8
2
Y = ((L* + 16) / 116)3 * Yn    L* > 8

Habe die Formel in Excel eingefügt und bekomme auch bei 50 die 18% raus.

Jetzt möchte ich die Formel erweitern, das ich den Wertebereich von 0 
bis 100 auf 0 bis 255 erweitere.

Damit möchte ich ein Array erstellen mit 256 BINS und in jedem Bin soll 
denn das fertige Ergebnis stehen. Damit möchte ich WS2812B LED linear 
faden können. Als Beispiel ich möchte von 255 auf 50% Helligkeit faden.
Dann nimm ich mir das Array und die BINS von 255 bis 127 mit den 
entsprechenden Helligkeitswerte aus der CIE1931 Formel.

Wenn ich die Formel erweitere muss denn auch der entsprechende 
Wertebereich erweitert werden?
1
Y = (L* / 902.3) ∙ Yn          L* ≤ 8 / 100 * 255 = 20
2
Y = ((L* + 16) / 116)3 * Yn    L* > 8 / 100 * 255 = 20

Bedeutet das ich statt die 18% für 50 rausbekomme, denn für 18% die 127 
rausbekommen müsste?
Oder müsste ich für die 50 denn die 18/100*255 also 45% rausbekommen?

Entschuldigung mein Mathe ist nicht so gut.
Und brauche eure Hilfe.

von Adam P. (adamap)


Lesenswert?

Vllt. hilft dir das weiter:

https://www.mikrocontroller.net/articles/LED-Fading

Berechnung ist im Kommentar vermerkt.

: Bearbeitet durch User
von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

Kevin H. schrieb:
> Bedeutet das ich statt die 18% für 50 rausbekomme, denn für 18% die 127
> rausbekommen müsste?

Nicht ganz ;-) Exakt 127.5
Anbei die Gleichung für die Spreizung.

von Kevin H. (xerxes777)


Lesenswert?

Joe G. schrieb:
> Kevin H. schrieb:
>> Bedeutet das ich statt die 18% für 50 rausbekomme, denn für 18% die 127
>> rausbekommen müsste?
>
> Nicht ganz ;-) Exakt 127.5
> Anbei die Gleichung für die Spreizung.

Vielen Dank für deine Gleichung.

alte Formel:
1
Y = L* / 902.3             L* ≤ 8
2
Y = ((L* + 16) / 116)^3    L* > 8

neue Formel:
1
Y = L* / (902.3*2.55)               L* ≤ 20
2
Y = (((L* / 2,55) + 16) / 116)^3    L* > 20

neue Formel gekürzt:
1
Y = L* / 2300.865                   L* ≤ 20
2
Y = (((L* / 2.55) + 16) / 116)^3    L* > 20

Kann man die noch weiter kürzen?
Und ich verstehe nicht, wo die 902.3 herkommen?
Denn nach der oben genannten Internet seite:
1
The exact crossover point and slope are:
2
(Y / Yn) = (6 / 29)3 = 0.00885645167903563
3
Slope = 8 / (6 / 29)3 = 903.296296296296
Das wären denn ja 903.3 ???

Edit:
Hab noch eine Seite gefunden:
https://www.sciencedirect.com/topics/engineering/colour-sample
Da wird mit 903.3 gerechnet.

: Bearbeitet durch User
von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Für den Bereich zwischen 0-100 oder gespreizt zwischen 0-255 gibt es 
zwei unterschiedliche Funktionen. Damit es an der Stelle, an der das 
Gültigkeitsintervall umgeschaltet wird, keine Unstetigkeit gibt 
(Funktionswert und Ableitung müssen also gleich sein) müssen beide 
Gleichungen bzw. die Gleichung der Ableitungen an der Stelle 8 gleich 
sein. Damit ergibt sich als freier Parameter für die erste Gleichung 
exakt 24389/27 oder etwa 903.2963. Warum in einer Quelle 902.3 steht, 
kann ich nicht sagen. Vielleicht ein Schreibfehler.

von Wolfgang (Gast)


Lesenswert?

Kevin H. schrieb:
> Y = ((L* + 16) / 116)3  Yn    L > 8

> Entschuldigung mein Mathe ist nicht so gut.

Dem würde ich mich wohl anschließen. Bevor du über eine Umskalierung auf 
einen anderen Wertebereich nachdenkst, solltest du die Formel vielleicht 
erstmal verstehen.

So, wie du sie hingeschrieben hast, bedarf es einiger Phantasie, um 
damit irgendetwas sinnvolles zu rechnen.

von Kevin H. (xerxes777)


Angehängte Dateien:

Lesenswert?

Vielen Dank für eure Hilfe:
Ich habe die Formel jetzt so weit umgeschrieben:
1
Y = (L* / 903.3 * 2,55) * 255                 L* <= 20
2
Y = (((L* / 2,55) + 16) / 116)^3 * 255        L* > 20

Die Werte auf der X-Achse und auf der Y-Achse haben einen Wertebereich 
von 0 bis 255.
L* werden die Werte von 0 bis 255 eingesetzt.
Als Ergebnis Y erhält man ebenfalls Werte von 0 bis 255,
diese steigen aber über eine Potenzfunktion an und nicht linear.
Damit kann man eine LED von 0 bis 255 Faden linear für das menschliche 
Auge von dunkel nach hell geschmeidig verlaufen lassen.
50% soll ca einen Grauwert von 18% geben.
Bei meinem Fall wären dies dann 127.5 soll 18% Grauwert rauskommen.
Das wäre dann ein Wert von ca. 46 als PWM Wert für die LED und nicht 
127.


Joe G. schrieb:
> Für den Bereich zwischen 0-100 oder gespreizt zwischen 0-255 gibt es
> zwei unterschiedliche Funktionen. Damit es an der Stelle, an der das
> Gültigkeitsintervall umgeschaltet wird, keine Unstetigkeit gibt
> (Funktionswert und Ableitung müssen also gleich sein) müssen beide
> Gleichungen bzw. die Gleichung der Ableitungen an der Stelle 8 gleich
> sein. Damit ergibt sich als freier Parameter für die erste Gleichung
> exakt 24389/27 oder etwa 903.2963. Warum in einer Quelle 902.3 steht,
> kann ich nicht sagen. Vielleicht ein Schreibfehler.

Das ist bei mir aber nicht der Fall.
Was habe ich falsch gemacht?
Ich dachte ich muss den Bereich ebenfalls hochziehen also von 8 auf 20?
Habe mal eine excel hoch geladen, wie ich es berechne.

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Kevin H. schrieb:
> Jetzt möchte ich die Formel erweitern, das ich den Wertebereich von 0
> bis 100 auf 0 bis 255 erweitere.

Gefühlsmäßig würde ich sagen, du musst 0...100 auf 0...256 
transformieren und nicht auf 255 - und jeweils unter Weglassen des 
letzten Wertes ansteuern.

von Wolfgang (Gast)


Lesenswert?

Kevin H. schrieb:
> Ich dachte ich muss den Bereich ebenfalls hochziehen also von 8 auf 20?

Genau, wenn du mit L~ aus [0..255] arbeiten willst, ersetze überall L* 
entsprechend der Gleichung
1
L* = L~ / 2.55
Aus L* ≤ 8 wird dann L~/2.55 ≤ 8 oder (gerundet) L~ ≤ 20

von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jürgen S. schrieb:
> Gefühlsmäßig würde ich sagen, du musst 0...100

Gefühlsmäßig hilft hier leider nicht, denn die Transformation von 0-100 
kann natürlich auf jede beliebige andere Skala erfolgen.

Kevin H. schrieb:
> Was habe ich falsch gemacht?

Leider verstehe ich deine Fragestellung nicht. Ich hatte gezeigt, wie du 
die x-Achse von einem Wertebereich von 0-100 auf einen Wertebereich von 
0-255 linear erweiterst. Der Wertebereich von y bleibt dabei unberührt. 
Wenn du gleichzeitig y auf 0-255 spreizen möchtest, so wie im Anhang. 
Also ehemals 18% oder 0.184 werden dann zu 46.968.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.