Actualmente estoy trabajando en una fuente de luz de amplio espectro usando emisores LED rojos, verdes y azules. A partir de una representación interna xyY (o CIE XYZ), puedo alcanzar cualquier color o temperatura de color a través de una matriz de transformación de 3x3. La matriz se calcula a partir de las coordenadas de cromaticidad y la luminancia relativa de los emisores RGB reales. Esto funciona bien tanto en la teoría como en la práctica.
Sin embargo, los LEDs RGB emiten un espectro discontinuo con muy poca energía entre el rojo y el verde. Quiero añadir un LED naranja o ámbar para mejorar el espectro y el índice de reproducción de color. Empezando por el CIE xyY, ¿cómo calculo el RGB más el ámbar? Todo el modelo CIE está basado en triestímulos y no veo cómo puedo usarlo para calcular un cuarto color.
Lo ideal sería probablemente un modelo que pudiera aceptar cualquier número de colores.
Añadido en base a la discusión:
Arriba hay una ilustración de cómo imagino que funcionan las matemáticas RGB.
Mido las coordenadas de cromaticidad (x,y) de cada uno de los emisores Rojo, Verde y Azul, y su brillo relativo (Y).
A partir de xyY calculo la CIE XYZ. Esto es necesario porque xy más Y es una proyección, XYZ es el espacio de color tridimensional real. Pongo los valores XYZ de los tres emisores en una matriz y calculo el inverso de esa matriz. Esta matriz inversa representa la diferencia entre lo "real" (la visión humana) y las propiedades de estos emisores en particular. Si quiero mostrar un color en particular, digamos el blanco que se muestra arriba a la derecha, puedo tomar las coordenadas deseadas, enviarlas a través de la matriz y obtener la fuerza requerida para cada emisor (mostrada como flechas).
Ahora RGBA:
Originalmente pensé que las matemáticas para un emisor más (RGBA) eran similares a las matemáticas para RGB. Que podría usar una matriz de 3*4 para calcular RGBA, de la misma manera que uso una matriz de 3*3 para calcular RGB. Sin embargo, parece que hay problemas para calcular el inverso de una matriz no cuadrada. Algunas fuentes dicen que no se puede hacer, otras dicen que si se puede hacer, pero que la matriz resultante carece de algún aspecto. ¡Esto está más allá de mi comprensión! :-)
@percusse sugiere que se puede utilizar una matriz de 3*4. Si es así, ¿cómo puedo calcular la matriz inversa? (Tengo un presupuesto muy reducido, un software como MATLAB está fuera de alcance).
Segunda edición:
Basándome en la información de @joriki y @percusse he intentado resolver esto en papel. He pasado mucho de papel, pero parece que no puedo encontrar una forma de hacerlo que pueda ser implementada como código de computadora, - o incluso produce la respuesta correcta! Probablemente estoy cometiendo errores en la solución práctica, pero eso no es realmente crítico. La computación tendrá que ser hecha por una implementación C de un algoritmo de resolución (¿eliminación gaussiana?) que se sabe que es bueno.
Estos serían valores tipo XYZ para los cuatro emisores calculados a partir de las coordenadas xyY medidas (los valores reales tendrán una mayor precisión):
$$ \left [ \begin {array}{ccc} 0.47 & 0.11 & 0.19 & 0.34 \\\ 0.20 & 0.43 & 0.11 & 0.26 \\\ 0.00 & 0.06 & 1.12 & 0.01 \end {array} \right ] \left [ \begin {array}{ccc} R \\\ G \\\ B \\\ A \end {array} \right ] = \left [ \begin {array}{ccc} X \\\ Y \\\ Z \end {array} \right ] $$
He estado pensando en la optimización y hay una serie de parámetros que afectan a la mezcla óptima, principalmente el espectro, la eficacia y el calor. Para un sistema pequeño, probablemente basta con preocuparse por los extremos del emisor de ámbar (evitar el máximo de ámbar cuando se emite luz naranja, evitar el mínimo de ámbar cuando se emite cualquier otro color). Una solución ya está sugerida por @joriki ["Esto selecciona la solución que cubre el espectro más uniformemente"] pero no entiendo las matemáticas :-)
Así que tengo que conseguir este sistema de ecuaciones en una forma que genere una respuesta única dentro de 500us de tiempo de computación en un pequeño procesador incorporado :-) ¡Cualquier orientación sobre cómo acercarse un paso más a una implementación práctica sería muy apreciada!
Tercera edición: He preparado una prueba que puede manejar 4 emisores, y un espectrómetro para medir la salida. Las intensidades relativas de los emisores están ajustadas para dar una temperatura de color correlacionada de aproximadamente 6000 Kelvin (luz del mediodía).
RGB en ca. 6000K:
RGB + Amber en ca. 6000K:
RGB + Blanco en ca. 6000K:
La primera imagen muestra el espectro de 3 emisores, Rojo, Verde y Azul. Hay muy poca luz entre 560 y 610 nm. La siguiente imagen muestra el espectro cuando se añade el ámbar al RGB. El ámbar mejora la situación significativamente. (El amarillo podría ser mejor, pero no se pueden encontrar LEDs amarillos de alto brillo adecuados). La última imagen muestra el espectro cuando se añade el Blanco a RGB. Los LEDs blancos son en realidad azules convertidos en fósforo. El fósforo puede ser hecho para retransmitirse en un espectro bastante amplio. Esto parece dar el mejor resultado en términos de espectro uniforme.
I Piensa en Tengo el código de trabajo para la Eliminación Gaussiana. La pregunta ahora es ¿cómo añado la minimización del cuadrado medio a las ecuaciones de tal manera que termine con una sola respuesta? Probablemente necesito algunas pistas sobre cómo resolver esto en la práctica. ¡Lo siento!)
Cuarta y quinta edición:
Así que he medido los espectros de 380 a 780 nm con una resolución de 1 nm. La salida se mide a igual valor de entrada.
Calculé el área bajo la curva por trigonometría. Calculé el tamaño promedio de los 400 trapecios entre 380 y 780 nm para R, G, B y A (los valores están escalados para mí más manejables):
$ \langle R \rangle = 19.8719507$
$ \langle G \rangle = 13.39000051$
$ \langle B \rangle = 29.30636046$
$ \langle A \rangle = 8.165754589$
Y también el promedio del producto de las seis (más cuatro) combinaciones de pares de emisores. Luego me esforcé en ensamblar esto en una matriz de covarianza:
$$ \left [ \begin {array}{cccc} 43.74282392 & -2.642812728 & -5.823745503 & -0.26554119 \\\ -2.642812728 & 8.563382072 & -0.969894212 & -0.946563019 \\\ -5.823745503 & -0.969894212 & 62.81754221 & -2.393057209 \\\ -0.26554119 & -0.946563019 & -2.393057209 & 8.136438369 \end {array} \right ] $$
La matriz está ensamblada así: $$ \left [ \begin {array}{ccc} \langle RR \rangle - \langle R \rangle\langle R \rangle & \langle RG \rangle - \langle R \rangle\langle G \rangle & \langle RB \rangle - \langle R \rangle\langle B \rangle & \langle RA \rangle - \langle R \rangle\langle A \rangle\\\ \langle RG \rangle - \langle R \rangle\langle G \rangle & ... & ... & ... \\\ ... & ... & ... & ... \\\ ... & ... & ... & ... \end {array} \right ] $$
Aquí están las coordenadas de color medidas de los emisores RGBA, y los valores de muestra para XYZ:
$$ \left [ \begin {array}{cccc|c} 0.490449254 & 0.100440581 & 0.221653947 & 0.343906601 & 0.75 \\\ 0.204678363 & 0.421052632 & 0.16374269 & 0.210526316 & 1.00 \\\ -0.011955512 & 0.07388664 & 1.464803251 & -0.012677086 & 0.75 \end {array} \right ] $$
He tratado de poner la matriz anterior en forma de escalón (?) por eliminación gaussiana, y luego obtener los valores RGB en la forma $u + Av$ por sustitución.
$R: 0.97921341 + A * -0.701207308$
$G: 1.730718699 + A * -0.1767291$
$B: 0.43 + A * 0.012215723$
El siguiente paso parece ser calcular $Q$ . Esto ha sido contestado por @joriki, pero no estoy acostumbrado a la notación y no estoy nada seguro de cómo traducir la taquigrafía griega a una forma en la que pueda calcular los valores. Si esto se vuelve demasiado básico para este foro, hágamelo saber y lo desconectaré.
Tengo problemas para entender este cálculo:
$$ \begin {eqnarray} \mu &=& - \frac { \sum_ { \alpha , \beta }M_{ \alpha\beta }x_ \alpha y_ \beta }{ \sum_ { \alpha , \beta }M_{ \alpha\beta }y_ \alpha y_ \beta } \;. \end {eqnarray} $$
No estoy completamente seguro de lo que el $x$ y $y$ los valores son Un puntero a un ejemplo de lo que este $M_{ \alpha\beta }x_ \alpha y_ \beta $ que en forma no algebraica sería de gran ayuda.
Sexta edición:
Así que déjame intentar explicarte cómo entiendo lo que hay que hacer: Con un conjunto de coordenadas de color de los emisores RGBA medidos y un valor ZYX (el color que queremos que generen los emisores) como entrada calculamos dos valores para cada emisor. Los valores son
$R = u_{RED} + Av_{RED}$
$G = u_{GREEN} + Av_{GREEN}$
$B = u_{BLUE} + Av_{BLUE}$
$A = A$
El cálculo implica la eliminación y sustitución gaussiana, y he escrito un código que realiza esos cálculos.
El valor de A debería ser preferentemente el que, junto con el RGB, produzca el espectro más uniforme. Este parece ser el cálculo de A:
$$ \begin {eqnarray} A &=& - \frac { \sum_ { \alpha , \beta }M_{ \alpha\beta }x_ \alpha y_ \beta }{ \sum_ { \alpha , \beta }M_{ \alpha\beta }y_ \alpha y_ \beta } \;. \end {eqnarray} $$
Un elemento de esta ecuación es $M_{ \alpha\beta }$ que es una matriz de covarianza de 4 * 4 que hemos precalculado a partir de los espectros de los emisores.
Esto es lo más lejos que estoy ahora mismo. No entiendo de la anotación anterior cómo funcionan las matemáticas. ¿Paso todas las combinaciones posibles de colores de los emisores por la matriz y las sumo todas? Tengo que admitir que estoy completamente perdido! :-)