Bonjour à tous.

Vous pouvez désormais, si l'envie vous en dit, soutenir SoundPixelLab - Vous retrouverez les informations sur ce lien en dessous
Soutenir SoundPixelLab

Merci à vous !

Les sondes de calibration

Répondre
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Voici la fonction Scilab qui donne le rapport de résistance du tungstène $W_R(T)$ en fonction de sa température en prenant pour référence 293 K et en tenant compte du rapport de résistivité $W(T) = \frac{\rho(T)}{\rho(293)}$ et du facteur de dilatation qui dépend de $T$.

Le calcul est coupé en deux selon que T <2000 K ou T> 2000 K. Pour la partie >2000 K, la résistivité du tungstène est linéaire en $T$ selon l'étude de Cezairliyan de 1971 et on peut utiliser la loi suivante :
$$
\rho(T) = -14.08 + 0.03515 \times T \quad (10^{-8}\,\Omega\cdot\text{m}).
$$
En dessous de 2000 K, la fonction interpole la résistivité à partir d'une table qui est raccordée à 2000 K sur la loi linéaire. Nota : si la température baisse fortement, la résistivité du tungstène n'est plus linéaire en $T$.

En pratique, c'est uniquement la plage > 2000 K qui nous intéresse pour les lampes QTH. Le rapport de résistivité vaut :
$$
W_R(T) = W(T) \times \beta(T) = \frac{\rho(T)}{\rho(293)} \times \beta(T)
$$
avec $\beta(T)$ l'influence de la dilatation thermique.

Code : Tout sélectionner

// =======================================================
//  RAPPORT DE RÉSISTANCE W(T) = ρ(T) / ρ(293K) x beta(T)
// =======================================================
function W = rapport_W_tungstene(T_K)
//
//  Pour un fil cylindrique de tungstène avec dilatation isotrope, Le rapport de
// RÉSISTANCE du tungstène se déduit du rapport de résistivité W(T) = ρ(T) / ρ(293K)
// par la formule :
//  W_R(T) = W(T) / (1 + α_L×(T-293)), où α_L=4.5×10⁻⁶ K⁻¹.
//  Cette correction de dilatation est <1.5% à 3200K.
//
//  Sources :
//  T ≥ 2000 K : Cezairliyan & McClure (1971, NBS), ±1 %
//  T < 2000 K : table de résistivité du tungstène (données NBS / CRC,
//               normalisées à ρ(293K) = 5.45×10⁻⁸ Ω.m de Cezairliyan)

    // Table basse température (T < 2000 K)
    // Source : NBS/CRC, normalisé sur ρ(293K)=5.45×10⁻⁸ Ω.m
    T_bas   = [ 293,  400,  500,  600,  700,  800,  900, 1000, ...
               1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000];
    rho_bas = [5.45, 7.73, 10.10, 12.57, 15.10, 17.70, 20.35, 23.02, ...
               25.73, 28.44, 31.15, 33.88, 36.62, 39.35, 42.08, 44.82, 47.58, 56.22];
    // NB : la valeur à 2000K est la valeur de raccordement Cezairliyan.

    n  = length(T_K);
    W  = zeros(n, 1);
    alpha_L = 4.5e-6;    // coeff. de dilatation linéaire du W (K⁻¹)

    for k = 1:n
        T  = max(min(T_K(k), 3600), 293);

        if T >= 2000 then
            // Formule linéaire Cezairliyan (NBS 1971), ±1 %
            // ρ(T) = -14.08 + 0.03515×T  (unités : 10⁻⁸ Ω.m)
            rho_T = -14.08 + 0.03515 * T;
        else
            // Interpolation linéaire dans la table basse température
            i1 = find(T_bas <= T, -1);
            if i1 >= length(T_bas) then i1 = length(T_bas)-1; end
            i2 = i1 + 1;
            f  = (T - T_bas(i1)) / (T_bas(i2) - T_bas(i1));
            rho_T = (1-f)*rho_bas(i1) + f*rho_bas(i2);
        end

        // Rapport de RÉSISTIVITÉ ρ(T)/ρ(293K)
        W_rho = rho_T / 5.45;

        // Correction de dilatation thermique pour le rapport de RÉSISTANCE
        // R(T)/R(T0) = [ρ(T)/ρ(T0)] / (1 + α_L×(T-293))
        W(k) = W_rho / (1 + alpha_L * (T - 293));
    end
endfunction
 

POSTREACT(ions) SUMMARY

Like (1)
Sensunda
Modifié en dernier par Emmanuel Piat le 19 févr. 2026, 14:28, modifié 4 fois.
Avatar du membre
Dagda
Fondateur
Messages : 1837
Enregistré le : 08 mars 2024, 17:16
Localisation : Est parisien (94)
Contact :

Re: Les sondes de calibration

Message par Dagda »

Quand je vois vos interventions Emmanuel, je me dis que j'ai bien fait de mettre le module math sur le forum :smile

D.
 

POSTREACT(ions) SUMMARY

https://www.youtube.com/@SoundPixelLab
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toutes réflexions pour ne pas offenser les imbéciles.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Ouais c'est bien utile et facile pour moi car j'ai écris mon 1er rapport en LaTeX en 1992 (même codage pour les math) ... Tout ça pour dire que les codes de ce module de math ne datent pas d'hier ...

Je viens de faire pas mal de corrections sur mon avant dernier post pour coller au dernier (il y avait un flou artistique entre rapport de résistivité et rapport de résistance (la résistance dépend de la géométrie du matériaux et donc est affectée par sa dilatation thermique). Maintenant, c'est ok et conforme à la fonction Scilab).
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Cherchons maintenant à déterminer la correction $C(\lambda)$ qu'il faut appliquer au spectre brut mesuré pour corriger toute la chaine de mesure (lentille de collimation + fibre + spectro). Pour cela, il faut utiliser le banc de mesure avec sa lampe QTH (voir mise en oeuvre détaillée du banc plus tard ...).

1. Avec une lampe chaude stabilisée en température, il faut déterminer la température $T_{fil}$ du filament, mesurer sa température de couleur corrélée $T_{CCT}$ avec un colorimètre et mesurer son spectre brut $S_L$. Les valeurs de $T_{fil}$, $T_{CCT}$ et $S_L$ doivent être obtenues dans un temps aussi court que possible pour que la température du filament soit considérée comme constante. Le temps d'intégration du spectro aura été réglé pour que le signal maximal de $S_L$ atteigne environ 80 % de la plage maximale du spectro (c'est la zone de linéarité des CCD du spectro. Au-delà de 80% la réponse se tasse).

2. Avec le même temps d'intégration, il faut mesurer le spectre du noir $S_{noir}(\lambda)$ en couvrant entièrement la lentille de collimation. Aucune lumière ne doit pénétrer dans la fibre. Ce spectre est un bruit qui correspond au dark current émis par les cellules CCD.

3. On calcule ensuite le spectre non corrigé $\bar S_L(\lambda)$ normalisé à 560 nm :
$$\bar S_{L,n}(\lambda)=\frac{S_L(\lambda)-S_{noir}(\lambda)}{S_L(560)-S_{noir}(560)}.
$$
4. On détermine enfin le modèle $L_n(\lambda,T_{fil})$ de la lampe qui est également normalisé à 560 nm et qui a le même $T_{fil}$ et $T_{CCT}$ que la lampe. Il faut que le spectre non corrigé $\bar S_{L,n}(\lambda)$ multiplié par la correction $C(\lambda)$ soit égal au modèle $L_n(\lambda,T_{fil})$ :
$$
\bar S_{L,n}(\lambda) \times C(\lambda) = L_n(\lambda,T_{fil}).
$$
Le facteur de correction $C(\lambda)$ est donc :
$$
C(\lambda) = \frac{L_n(\lambda, T_{fil})}{\bar S_{L,n}(\lambda)}. \qquad (3)
$$
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 20 févr. 2026, 18:47, modifié 4 fois.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

La correction $C(\lambda)$ peut être utilisée pour corriger le spectre brut $S_{brut}(\lambda)$ de n'importe quelle nouvelle source d'irradiance normalisée à 560 nm. Le spectre normalisé et corrigé grâce le vecteur de correction $C(\lambda)$ est :
$$
S_n(\lambda)=\frac{S_{brut}(\lambda)-S'_{noir}(\lambda)}{S_{brut}(560)-S'_{noir}(560)} × C(\lambda). \qquad (4)
$$
La correction $C(\lambda)$ est donc un gain variable pour chaque $\lambda$. Si ce gain vaut 1, l'intensité spectrale n'est pas modifiée.

Pour diminuer le bruit induit par le spectro (ce bruit sera amplifié par $C(\lambda)$ à la longueur d'onde $\lambda$ si $C(\lambda) > 1$), on peut en plus lisser le spectre $S_n(\lambda)$ avec un filtre de Savitzky-Golay qui utilise une fenêtre mobile. Si on veut éviter d'avoir recours à un lissage spectral fenêtré qui va élargir les pics spectraux, on a aussi la possibilité de moyenner temporellement plusieurs spectres, ce qui diminue l'amplitude du bruit d'un ratio $\sqrt{n}$ si on moyenne $n$ spectres.

En dessous de 400 nm (proche UV), la précision de $S_n(\lambda)$ sera probablement médiocre du fait que la lampe QTH émet très peu d'énergie dans cette zone pendant la calibration et que la sensibilité des cellules CDD s'effondre dans le proche UV.
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 20 févr. 2026, 18:10, modifié 1 fois.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

On est amené à changer le temps d'intégration lors de la mesure d'un spectre pour :
  • rester en deça de 80% de la plage de mesure si l'intensité spectrale est trop forte (diminution du temps d'intégration),
  • augmenter la sensibilité du spectro si l'intensité spectrale est faible (augmentation du temps d'intégration).
Il faut donc que la correction $C(\lambda)$ ne soit pas influencée par le temps d'intégration. Si on double le temps d'exposition des cellules CCD, on collecte deux fois plus de photons, et le signal brut mesuré par le spectro double. Cependant, comme on travaille systématiquement sur des spectres normalisés à 1 à la longueur d'onde 560 nm, le temps d'intégration ne change absolument rien aux formules (3) et (4).

Attention : le spectre brut de noir $S_{noir}(\lambda)$ dépend linéairement du temps d'intégration. Si on fait la calibration avec un noir à 100 ms et qu'on mesure un échantillon à 1000 ms, on ne peut pas utiliser le noir de 100 ms dans (4) : il faut refaire un "dark" dès que le temps d'intégration change afin que la soustraction du dark se fasse bien. C'est la raison pour laquelle j'ai mis un $S'_{noir}(\lambda)$ dans la formule (4).

Nota : cette indépendance au temps d'intégration sera évidemment mise en défaut si on ne normalise pas $\bar S_{L,n}(\lambda)$ et $S_n(\lambda)$. En cas d'absence de normalisation, on aura :
$$
\bar S_{cal}(\lambda)=S_L(\lambda)-S_{noir}(\lambda),
$$
$$
C(\lambda) = \frac{L(\lambda, T_{fil})}{\bar S_{cal}(\lambda)},
$$
où $L(\lambda, T_{fil})$ n'est plus normalisé. Si on note $t_{cal}$ et $t_{mes}$ les temps d'intégration utilisés lors de la mesure de $S_L(\lambda)$ et $S_{brut}(\lambda)$, on peut définir un spectre corrigé par :
$$
S(\lambda)=(S_{brut}(\lambda)-S'_{noir}(\lambda)) \times \frac{t_{cal}}{t_{mes}} × C(\lambda).
$$
Si $t_{mes} = 2 \times t_{cal}$, le ratio $\frac{t_{cal}}{t_{mes}}$ vaut $\frac{1}{2}$, ce qui amène un facteur de normalisation temporel de l'amplitude spectrale (par rapport au temps d'intégration utilisé pour la mesure du banc qui a conduit à $C(\lambda)$). Si on divise maintenant les spectres bruts mesurés (exprimés en counts) par le temps d'intégration, on obtient cette fois-ci des spectres normalisés par rapport au temps d'intégration qui sont exprimés en "counts par seconde". On peut alors définir une nouvelle correction $C_{int}(\lambda)$ indépendante du temps d'intégration $t_{mes}$ en décomposant la relation précédente de la manière suivante :
$$
S(\lambda)=\underset{\text{spectre brut en counts/sec}}{\underbrace{\frac{(S_{brut}(\lambda)-S'_{noir}(\lambda))}{t_{mes}}}} \times C_{int}(\lambda)
$$
$$
C_{int}(\lambda) = t_{cal} × C(\lambda)=\frac{L(\lambda, T_{fil})}{
\underset{\text{spectre lampe en counts/sec}}{\underbrace{(S_L(\lambda)-S_{noir}(\lambda)) / t_{cal}}}}.
$$
A suivre.
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Dans mon post précédent, j'ai évoqué pour la première fois la notion de "count". En général, dans les softs qui gèrent les spectros, on peut toujours afficher l'intensité spectrale en valeur informatique entière (par exemple 0 à 65535 si le spectro est équipé d'un ADC 16 bits) mais aussi en counts. Idem si on fait l'exportation du spectre brut dans un fichier texte. Ces unités sont propres au spectro et ne nécessitent aucun raccordement au SI.

Un count est relatif à la valeur numérique délivrée par l'ADC pour un pixel donné de la barrette CCD. Il représente une charge électrique accumulée dans le puits de la cellule CCD, convertie en tension puis numérisée. La relation entre photons et counts comporte trois étapes successives, chacune avec un facteur d'échelle et une source de bruit aléatoire ou de perturbation déterministe.

Étape 1 : c'est la conversion photon → photoélectron. Un photon incident sur le pixel a une probabilité $\eta(\lambda)$ d'arracher un photoélectron par effet photoélectrique. C'est l'efficacité quantique du détecteur. Pour un capteur en techno Silicium, $\eta(\lambda)$ vaut environ 0.20 à 400 nm, 0.70–0.85 vers 600–700 nm, et rechute vers 0.10–0.20 à 900 nm. La plupart des photons incidents ne produisent donc pas de photoélectron — ils sont simplement absorbés sans effet utile ou bien réfléchis. Ces valeurs expliquent pourquoi le spectro sera beaucoup moins sensible aux 2 extrémités du visible (proche UV et proche IR). La réponse d'un spectro avec un détecteur CCD chute toujours au 2 bouts de sa bande passante en longueurs d'onde.

Étape 2 : c'est l'accumulation de charges. Les photoélectrons s'accumulent dans le puits capacitif de la cellule CCD pendant le temps d'intégration $t$. Le puits d'une cellule CCD a une capacité maximale (full well capacity) typiquement de 15 000 à 150 000 électrons selon le capteur CCD. Au-delà, il sature et déborde, c'est l'"ébouissement" de la cellule CCD (blooming).

Étape 3 : c'est la conversion électron → count. La lecture de la charge électrique capturée par le puit capacitif est faite par un circuit électronique qui amplifie et numérise la charge. Le gain $g$ de l'ADC est exprimé en électrons/counts. Un ADC 16 bits avec un puits de 65 536 électrons donnerait g = 1 électron/count. En pratique $g$ est souvent de l'ordre de 2 à 10 électrons/count. La valeur de $g$ (ou son inverse) est donnée dans les caractéristiques du spectro.

Si on appelle $N(\lambda,t)$ le nombre de counts associé à un pixel pour un temps d'intégration $t$, on a au final :
$$
N(\lambda, t) = \frac{\eta(\lambda) \cdot \Phi_\text{ph}(\lambda) \cdot t}{g} + \frac{d(\lambda,T) \cdot t}{g} + \frac{r(\lambda)}{g} + \frac{\epsilon(\lambda,t)}{g}
$$
où :
  • $\Phi_\text{ph}$ est le flux de photons incidents sur le pixel (photons/s).
  • $d(\lambda,T)$ est le débit exprimé en électrons/s qui est engendré par le dark current. Ce débit dépend de la température et de la longueur d'onde. Pour stabiliser sa valeur, il est important que $T$ n'évolue pas. L'influence du dark current dans $N$ croit linéairement avec le temps d'intégration mais reste constante si le temps d'intégration $t$ ne change pas (à condition que la température n'évolue pas).
  • $r(\lambda)$ s'appelle le bruit de lecture. Il possède une composante aléatoire gaussienne (read noise) d'écart-type $\sigma_r$ qui est la même pour tous les pixels. Il n'est pas possible de la supprimer mais on peut l'atténuer en moyennant plusieurs spectres ou en appliquant un filtre sur le spectre. Le bruit de lecture possède également une composante constante (fixed pattern offset) qui correspond à une charge parasite qui perturbe la lecture du puits et qui va générer un offset permanent dans $N$. Cet offset peut être différent pour chaque pixel et est indépendant de $t$, c'est donc une constante qui ne dépend que de $\lambda$. Cet offset est fixe en électrons, donc d'autant plus négligeable que $t$ est long. Si cet offset vaut $r$ électrons (typiquement 3 à 50 e⁻ selon le capteur), il contribue pour $r(\lambda)/g$ counts par pixel indépendamment de $t$. Pour un signal de 50 000 counts avec $g = 5$ e⁻/counts, le signal représente 250 000 e⁻, et un offset de 10 e⁻ est totalement négligeable. Mais à faible signal, cet offset peut devenir significatif.
  • $\epsilon(\lambda,t)$ est aléatoire et correspond au bruit de photons (shot noise). Il tire son origine dans la nature particulaire des photons et peut être modélisé par un processus de poisson qui tend vers une loi gaussienne lorsqu'il implique un grand nombre de photons. Il s'exprime en nombre d'électrons après l'étape de conversion en photoélectrons. Sa nature aléatoire rend sa valeur variable et imprédictible, donc non compensable. Si on l'exprime en counts en le divisant par $g$, son écart-type vaut $\sqrt{\eta(\lambda) \cdot \Phi_{ph}(\lambda) \cdot t} / g$. Ce bruit augmente donc de manière non-linéaire avec le flux de photons incidents et le temps d'intégration $t$.
L'influence de $d(\lambda,T)$ et de la partie déterministe de $r(\lambda)$ dans $N(\lambda)$ est mesurable pour un temps d'intégration $t$ donné lorsque $\Phi_\text{ph}(\lambda) = 0$. L'absence de photons permet également du supprimer le terme $\epsilon(\lambda,t)$. C'est cette propriété qui est exploitée lorsqu'on fait une mesure du "dark" et c'est uniquement l'influence de ces deux termes qu'on compense lorsqu'on soustrait $S_{noir}(\lambda)$ pour chaque pixel. On peut noter que la composante aléatoire présente dans $r(\lambda)$ sera également présente dans $S_{noir}(\lambda)$. Sa nature aléatoire rend sa soustraction impossible. C'est même le contraire qui se passe : lors de la soustraction du dark, cette composante vient renforcer le bruit présent dans le spectre mesuré. C'est pourquoi il est important que cette composante aléatoire ait un écart-type qui soit le plus petit possible pour atténuer ce renforcement. Une manière de diminuer cet écart-type consiste à moyenner plusieurs mesure de $S_{noir}(\lambda)$ (une dizaine en général).
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 21 févr. 2026, 13:59, modifié 7 fois.
Pio2001
130 dB
Messages : 586
Enregistré le : 18 mars 2024, 00:29

Re: Les sondes de calibration

Message par Pio2001 »

Emmanuel Piat a écrit : 20 févr. 2026, 15:19$$
S(\lambda)=\underset{\text{spectre brut en counts/sec}}{\underbrace{\frac{(S_{brut}(\lambda)-S'_{noir}(\lambda))}{t_{mes}}}} \times C_{int}(\lambda)
$$
Est-ce que \( S(\lambda) \) peut être négatif ? Il ne faudrait pas perdre des données dans les calculs intermédiaires en se limitant aux valeurs positives.
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Oui car il reste tjrs un peu de bruit dans $S'_{noir}(\lambda)$. Je n'ai pas évoqué toutes les sources de bruits ds ma description précédente. Donc lorsqu'on fait $\Phi_\text{ph}(\lambda) = 0$ pour la mesure du noir, il reste un peu de bruit sur le spectre mesuré. En pratique, on l'atténue en moyennant 5 à 10 spectres $S'_{noir}(\lambda)$ pour avoir la mesure du dark. On pourrait aussi essayer avec un filtre de Savitzky Golay. Comme il restera toujours un peu de bruit dans $S'_{noir}(\lambda)$, la soustraction $S_{brut}(\lambda)-S'_{noir}(\lambda)$ peut engendrer un (petit) terme négatif. Comme ça n'a pas de sens physique (un spectre est tjrs dérivé d'une puissance ou d'une énergie qui sont des grandeurs positives), on remplace ensuite tous les termes négatifs par zéro.

Nota : si on veut faire des stats sur les bruits, on garde les termes négatifs sinon on crée des biais de calcul. L'important, c'est de savoir ce qu'on veut faire avec le spectre. Si par exemple, on veut calculer des coordonnées X,Y,Z, ont peut virer les termes négatifs ... AMHA, tant que le bruit reste raisonnable, l'impact de tout ça est négligeable. C'est pourquoi il est important de visualiser le spectre et le bruit spectral. Si on voit que le bruit commence à dominer à certaines fréquences parce que le signal est faible, il faut commencer à se poser des questions sur ce qu'on calcule ensuite ...
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 20 févr. 2026, 23:36, modifié 1 fois.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

En fait dans le bruit de lecture $r(\lambda)$ il y a une composante fixe constante (différente pour chaque pixel) et une composante aléatoire de nature gaussienne (identique pour tous les pixels). Je vais éditer mon post précédent pour le préciser.
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Si par exemple, on veut calculer des coordonnées X,Y,Z, ont peut virer les termes négatifs ...
Après réflexion, ça ne me semble pas une super idée. La physique dit que les termes <0 n'existent pas. Les math. disent le contraire ds les zones où il n'y a que du bruit et pas d'intensité spectrale ou ds les zones ou l'intensité spectrale très faible se superpose sur un bruit important. Si on met à zéros les termes négatifs, ça crée un offset statistique artificiel. Si ensuite on intègre le spectre pour faire de la colorimétrie, ça va induire une surévaluation d'autant plus grande que la luminosité spectrale sera en moyenne nulle ou faible sur de grandes plages.

En pratique, il faudra gérer les choses de manière plus fine. Il faudra débruiter intelligemment le spectre final corrigé (avec ses termes <0) en combinant (1) une moyenne temporelle de plusieurs spectres suivie (2) d'un filtre de Savitzky Golay avec une taille de fenêtre spectrale correctement réglée. On peut toujours faire (2) car la résolution numérique d'un spectro est meilleure que sa réso optique. Donc, même en présence de pic serrés, on a tjrs un peu de marge pour ajuster la fenêtre et faire travailler un filtre qui lisse sur le domaine spectral numérique. Un contrôle visuel avant/après filtrage permet de vérifier qu'on n'a pas altérée l'information présente dans le spectre.

Ensuite, il faudra calculer l'intégrale de manière propre. Une intégrale discrète qui revient à faire la méthode des rectangles (interpolation d'ordre 0) induit des résidus élevés. Une interpolation linéaire d'ordre 1 (méthode des trapèzes) réduit déjà significativement les résidus. Le mieux étant d'aller vers l'ordre 2 (interpolation polynomiale locale sur 3 points). On peut aussi interpoler le spectre avant pour augmenter significativement la réso numérique et se contenter ensuite d'une intégration par trapèze. C'est simple à implémenter en Scilab (3 lignes).
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 21 févr. 2026, 10:39, modifié 4 fois.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Par ailleurs, avec un projo tri-laser, on sait que la lumière est concentrée sur 3 plages spectrales très limitée. Donc ça n'a aucun intérêt d'intégrer le spectre en dehors de ces 3 plages où on n'aura que du bruit qui va générer une erreur sur l'intégration. Les spectro très compacts peuvent aussi "inventer" de la lumière là ou il n'y en a pas à cause d'une lumière parasite résiduelle appelée "stray light" qui correspond à une redistribution complexe et erronée de la lumière entrante sur tout le spectre. Donc il ne faut pas intégrer là ou on sait qu'il n'y a zéro énergie même si le spectro dit par erreur qu'il y a qqchose ...
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Puisqu'on est dans les effets de bords induit par le bruit sur les calculs numériques, on peut aussi regarder ce qu'il se passe au niveau de la normalisation. La division du spectre par $S_{brut}(560)-S'_{noir}(560)$ peut conduire à une erreur significative qui va se propager sur la totalité du spectre, si les signaux $S_{brut}$ et $S'_{noir}$ sont bruités à la longueur d'onde 560 et que le bruit sur $S_{brut}(560)$ et $S'_{noir}(560)$ se renforce par soustraction (idem si on a un artefact de mesure aberrant à 560 nm). Pour éviter ce problème, il faut prendre comme facteur de normalisation la moyenne de $S_{brut}(\lambda)-S'_{noir}(\lambda)$ sur une fenêtre centrée sur 560 avec une largeur totale qui vaut environ 3 à 4x la résolution optique du spectro. Une autre manière de faire consiste à lisser avant le signal $S_{brut}(\lambda)-S'_{noir}(\lambda)$ avec un filtre de Savitzky Golay et à prendre la valeur lissée à 560 nm comme facteur de normalisation.
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Avec un projo tri-laser, le choix de la longueur d'onde de normalisation sera aussi déterminant : il faut choisir une longueur d'onde ds le vert ou il y a de l'information spectrale. ll ne faut surtout pas choisir une longueur d'onde là ou il n'y a que du bruit avec une intensité spectrale quasi nulle.
 

POSTREACT(ions) SUMMARY

Pio2001
130 dB
Messages : 586
Enregistré le : 18 mars 2024, 00:29

Re: Les sondes de calibration

Message par Pio2001 »

Emmanuel Piat a écrit : 21 févr. 2026, 08:16Si on met à zéros les termes négatifs, ça crée un offset statistique artificiel. Si ensuite on intègre le spectre pour faire de la colorimétrie, ça va induire une surévaluation d'autant plus grande que la luminosité spectrale sera en moyenne nulle ou faible sur de grandes plages.
Oui, c'est ce à quoi je pensais, mais je n'aurais pas su l'exprimer comme ça.
Emmanuel Piat a écrit : 21 févr. 2026, 08:16On peut aussi interpoler le spectre avant pour augmenter significativement la réso numérique et se contenter ensuite d'une intégration par trapèze. C'est simple à implémenter en Scilab (3 lignes).
Pour l'interpolation, on connaît ça en audio. Dans un DAC, le signal audio 44100 Hz 16 bits est interpolé avant d'être converti en analogique. On dit qu'il est suréchantillonné.

Pour cela on utilise ce qu'on appelle un filtre FIR, ou convolueur. C'est une méthode de calcul qui réalise une convolution avec un autre signal prédéfini : la réponse impulsionnelle de notre filtre, ici le rectangle, le triangle etc. qu'on veut avoir autour d'un pic isolé après l'interpolation.
Mathématiquement ce sera un filtre fréquentiel passe-bas. C'est plus simple que de faire de l'interpolation polynomiale, et le résultat est encore plus propre.

Les deux points auxquels il faut être attentifs :

Le signal interpolé peut avoir une amplitude plus grande que le signal original. Par exemple sur une échelle d'amplitude normalisée de 0 à 1, le signal 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, une fois interpolé, atteint des valeurs comprises entre -0.2 et +1.2 si on l'interpole de façon plus fine qu'en rectangle ou en trapèze.
Interpolation.png
Interpolation.png (69.93 Kio) Vu 36 fois
Il faut donc prévoir une marge au-dessus de 1 et en-dessous de 0. Dans le cas d'un spectre avec raies d'émission, l'amplitude max sera souvent nettement plus grande après interpolation. L'amplitude min, par contre, n'atteindra des valeurs très basses que si on a des raies d'absorption. Sinon cela n'ira pas loin en dessous de zéro.

Autre exemple avec un seul pic :
cool.gif
cool.gif (4.54 Kio) Vu 36 fois
Avec un plateau :
Interpolation1.png
Interpolation1.png (103.16 Kio) Vu 36 fois
Second point : si on utilise un convolueur, le signal interpolé sera plus long que le signal original. Il faut donc veiller à ce que notre spectre ne soit pas décalé sur l'axe des $\lambda$
Par exemple avec une point spread function (le signal à convoluer) symétrique (souhaitable pour laisser les pics centrés), de 100 échantillons de long (100 "taps"), le spectre final aura 50 échantillons en trop au début, et 50 en trop à la fin.
Si donc le spectre commençait à 400 nm, en imaginant qu'on a une résolution de 1 pixel par nm, et en interpolant à 4 pixels par nm, le spectre en sortie d'interpolation FIR commencera à 400 - 50/4 = 387.5 nm.

Sources des images :
https://benchmarkmedia.com/blogs/applic ... EFkTjE9J39
https://www.keysight.com/blogs/en/tech/ ... -overshoot
 

POSTREACT(ions) SUMMARY

Pio2001
130 dB
Messages : 586
Enregistré le : 18 mars 2024, 00:29

Re: Les sondes de calibration

Message par Pio2001 »

Remarque : pour nous, les oscillations à gauche et à droite après interpolation sont indésirables. Il faudra choisir un filtre réduisant ces oscillations à un niveau négligeable.
Je peux regarder ce point si on utilise cette solution.
 

POSTREACT(ions) SUMMARY

Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

C'est une possibilité et ça pourrait être intéressant de mettre en place cette approche ds scilab qui a nativement une fonction de convo. Si tu regardes le code Scilab que j'ai mis en ligne 1 ou 2 pages avant, la convo est utilisée dans la fonction qui code le filtre de Savitzky Golay.

De ce que j'ai vu les interpolations de spectres sont souvent très basiques : bêtement linéaire ou par spline ...

Pour info, on est obligé d'interpoler, car les colors matching functions de l'observateur CIE 1931 sont données avec un pas de 1nm qui ne colle jamais avec le pas associé à la réso numérique du spectro (laquelle est inférieure à 0.5 nm). Donc soit on suréchantillonne le spectre ET les colors matching functions pour les faire coller et avoir par exemple un pas très fin de 0.1 nm entre 360 et 830 nm, soit on rééchantillonne uniquement les colors matching functions pour les ramener aux fréquences du spectro. En général, c'est la 1ère approche qui est choisie (4 lignes de code en Scilab) car elle permet d'augmenter la précision de l'intégration numérique.
 

POSTREACT(ions) SUMMARY

Modifié en dernier par Emmanuel Piat le 21 févr. 2026, 18:08, modifié 1 fois.
Emmanuel Piat
49 dB
Messages : 102
Enregistré le : 11 janv. 2026, 11:26

Re: Les sondes de calibration

Message par Emmanuel Piat »

Pour terminer sur l'importance de la soustraction du spectre d'obscurité (dark) et la maitrise de ce calcul, voici une analyse un peu plus détaillée de cette soustraction qui va repartir de l'expression de $N$ donnée au dessus.

Si le spectro a une résolution numérique $\Delta \lambda = 2 \cdot \delta \lambda$, un pixel CCD du spectromètre correspond à l'intervalle de longueur d'onde $[\lambda - \delta \lambda, \lambda + \delta \lambda]$), Après une durée d'intégration $t$, ce pixel accumule une énergie exprimée en counts représentée par $N_{brut}(\lambda, t)$. Je change les notations pour "absorber" la division par $g$ qui est la même partout et pour faire apparaitre l'éclairement spectral $E(\lambda)$ de la source de lumière dans le premier terme car c'est ce qu'on cherche à mesurer :
$$
N_{brut}(\lambda, t) = T(\lambda) \cdot E(\lambda) \cdot t + D(\lambda,T) \cdot t + R(\lambda) + \epsilon_{SN}(\lambda, t)
$$
où :
  • $E(\lambda)$ est l'éclairement spectral de la source ($W/m^2/nm$).
  • $T(\lambda)$ est la réponse spectrale de la chaîne (lentille + fibre + fente d'entrée du spectro + réseau de diffraction + détecteur CCD). C'est la partie que la correction $C(\lambda)$ va chercher à compenser pour annuler son effet. Son unité est en $counts/[s \cdot (W/m^2/nm)]=counts\cdot m^2 \cdot nm / J$.
  • $D(\lambda,T)$ est le taux exprimé en $counts/s$ qui est engendré par le dark current. Il dépend de la température du détecteur et de la longueur d'onde.
  • $R(\lambda,T) = R_1(\lambda,T) + R_2(\lambda)$ est la somme du bruit aléatoire de lecture (bruit thermique etc. qui se manifeste de la même manière pour tous les pixels) et d'un offset induit par l'ADC pour le pixel considéré. Cet offset est différent pour chaque pixel et il est indépendant de $t$ .
  • $\epsilon_{SN}(\lambda, t)$ est le nombre de counts induit sur une durée $t$ par le shot noise photonique sur la fenêtre spectrale $[\lambda - \delta \lambda, \lambda + \delta \lambda]$.
Le spectre d'obscurité exprimé en counts est $N_\text{dark}(\lambda, t)$. Il s'acquiert en bloquant toute lumière (capuchon sur la lentille de collimation) avec le même temps d'intégration $t$ que la mesure de la source. Ce spectre varie lentement avec la température du capteur et il n'a pas de shot noise photonique (absence de photon) :
$$
N_\text{dark}(\lambda, t) = D(\lambda,T) \cdot t + R_{1,dark}(\lambda,T) + R_2(\lambda).
$$
Pour réduire le bruit induit par $R_{1,dark}$, il est utile de moyenner $k$ acquisitions du dark, avec $k$ entre 5 et 10 :
$$
\bar{N}_\text{dark}(\lambda, t) = \frac{1}{k} \sum_{i=1}^{k} N_{\text{dark},i}(\lambda, t).
$$
La soustraction du dark donne le spectre suivant :
$$
N(\lambda, t) = N_{brut}(\lambda, t) - \bar{N}_\text{dark}(\lambda, t)
$$
$$
N(\lambda, t) = T(\lambda) \cdot E(\lambda) \cdot t + \underbrace{[R_1 - \bar R_{1,dark}]}_{\text{bruit résiduel}} + \epsilon_{SN}(\lambda, t).
$$
Si la température $T$ ne varie pas, le terme $D(\lambda,T) \cdot t + R_2(\lambda)$ disparaît exactement si et seulement si $t$ est identique entre la mesure de la source et la mesure du dark. Il ne faut jamais violer cette condition en pratique. En terme de bruit, il reste le shot noise photonique de la source et le bruit résiduel engendré par $R_1$. Ce dernier ne se soustrait car il donne des amplitudes différentes lors des deux mesures. La variance de ce bruit après soustraction est la somme de la variance associée à $R_1$ et de la variance associée à $\bar R_{1,dark}$. Donc le bruit augmente. Cependant, grâce au moyennage des dark, la variance de $\bar R_{1,dark}$ est inférieure à celle de $R_{1,dark}$. Le moyennage permet donc de limiter l'augmentation du bruit.

Si maintenant, on normalise à 560 nm (sans utiliser de moyennage pour faire simple) on va extraire $N_\text{ref} = N(560, t)$ et le spectre normalisé est alors :
$$
S_n(\lambda) = \frac{N(\lambda, t)}{N_\text{ref}} = \frac{T(\lambda) \cdot E(\lambda) \cdot t + [R_1 - \bar R_{1,dark}] + \epsilon_{SN}(\lambda, t)}{T(560) \cdot E(560) \cdot t + [R_1(560) - \bar R_{1,dark}(560)] + \epsilon_{SN}(\lambda, t)}.
$$
Si on néglige l'influence des bruits qui est minime, le facteur $t$ disparaît dans cette division et on retrouve le fait que le spectre normalisé ne dépend pas du choix du temps d'intégration :
$$
S_n(\lambda) = \frac{T(\lambda) \cdot E(\lambda)}{T(560) \cdot E(560)}.
$$
Le spectre corrigé est $S_c(\lambda) = S_n(\lambda) \times C(\lambda)$. Donc si $C(\lambda)$ vaut exactement l'inverse de la chaine de transmission normalisée $T(\lambda) / T(560)$ on obtient :
$$
S_c(\lambda) = \frac{E(\lambda)}{E(560)}
$$
qui est le spectre normalisé de la source de lumière. En pratique, on ne peut que s'approcher de ce résultat idéal.
 

POSTREACT(ions) SUMMARY

Répondre