• Aucun résultat trouvé

Code de l’algorithme de Gerchberg-Saxton

3.3 Code de l’algorithme de Gerchberg-Saxton

Le montage ayant ainsi été calibré pour une mesure optimale de Icout, ne restait plus qu’à développer le code permettant d’utiliser l’algorithme de Gerchberg-Saxton. Celui-ci a été écrit sous MATLAB, langage de programmation et environnement de développement permettant notamment d’effectuer des calculs numériques.

Décrivons à présent les différentes parties de ce code, partie par partie.

3.3.1 Entrée

En premier lieu, la partieINPUTpermet de définir les données ou paramètres de l’algorithme : l’intensité recherchéeIfout(u,v)et le nombre d’itérationsp.

Pour la première, plutôt qu’une définition à l’aide d’une fonction de deux variables, nous avons opté pour une image matricielle représentant l’intensité recherchée, à l’instar de celle requise pour l’usage du logiciel de création d’hologrammes du fabricant du SLM. L’image étant matricielle et non vectorielle, MATLAB associe à chacun de ses pixels un coefficient ; nous repèrerons chacun d’entre eux par son indice de ligneyet son indice de colonnexsur le plan«in», et par les indicesvetusur le plan«out». Notons que cette notation permet une correspondance avec une représentation vectorielle de l’intensité, avec des points repérés en coordonnées cartésiennes par les couples(x,y)et(u,v).

Le pré-requis est ainsi la définition deIfout(u,v)par une image matricielle, créée par exemple à l’aide d’un logiciel d’édition d’images. À l’instar du logiciel du fabricant du SLM, elle peut être au format BMP, mais ce choix reste arbitraire.

LISTE3.1 – PartieINPUTde l’algorithme

1 close all;

2 clear all;

3

4 %% INPUT

5 % Every non-indented line is a user-defined data or parameter.

6

7 %Desired intensity

8 Iout_f = imread('Intensity.bmp','bmp') ; %Converts the ...

image corresponding to the desired intensity on the output plane

9 Iout_f = Iout_f(:,:,1) ; %Redefines the ...

intensity matrix as a n*n*1 (2D) sub-matrix of the original one (if needed)

10 Iout_f = double(Iout_f) ; %Is needed to ...

avoid errors relative to the extension/format of the input file

11 Iout_f = Iout_f ./ max(max(Iout_f)) ; %Scales all values ...

of the matrix between 0 and 1

12 Aout_f = sqrt(Iout_f) ; %Defines the ...

amplitude of the desired field as the square root of its intensity

13 Iout_f_h = size(Iout_f,1) ; %Measures the ...

length of the aformentionned matrix for further use

14 Iout_f_w = size(Iout_f,2) ; %Measures the ...

width of the aformentionned matrix for further use

15 %Input image must have a 1:1 ratio in order for the diffraction figure to

16 %not be distorted. The initial pattern of the hologram will have the same

17 %size as the input image.

18

19 p = 40 ; %Sets the number ...

of iterations of the for-loop

L’algorithme lit cette image en utilisant a fonctionimreadet y associe la matriceIout_f. En fonction de son format, il est possible que l’image d’entrée comporte trois ou quatre canaux (correspondant au rouge, vert, bleu et à la transparence) et entraîne la création d’une matrice tridimensionnelle, alors même que l’intensité mesuréeIcout(u,v)n’en comportera qu’un car la caméra CCD filme en noir et blanc. Il faut ainsi sélectionner arbitrairement un seul de ces canaux. Ensuite, il faut convertir les coefficients deIout_fau bon type (double) et au bon format afin d’éviter les erreurs de traitement de données, et calculer l’amplitude associéeAout_f, correspondant àAoutf (u,v). On associe également àIout_f_hetIout_f_wla hauteur et la largeur de l’image

«f».

Enfin, on définitpcomme le nombre d’itérations voulu de la boucle de l’algorithme.

3.3.2 Caractéristiques expérimentales

La partieEXPERIMENTAL SETUPliste ensuite toutes les caractéristiques du montage qui nous seront utiles.

3.3. CODE DE L’ALGORITHME DE GERCHBERG-SAXTON

LISTE3.2 – PartieEXPERIMENTAL SETUPde l’algorithme

1 %% EXPERIMENTAL SETUP

2 % This part lists all useful caracteristics of the experimental setup.

3

4 %Caracteristics of the CCD

5 CCD_h = 494 ; %Height (in px)

6 CCD_w = 656 ; %Width (in px)

7 res_CCD = 135.513 ; %Resolution (in px/mm)

8

9 %Caracteristics of the SLM

10 SLM_h = 600 ; %Height (in px)

11 SLM_w = 792 ; %Width (in px)

12 res_SLM_h = 50 ; %Vertical ...

resolution (in px/mm)

13 res_SLM_w = 49.5 ; %Horizontal ...

resolution (in px/mm)

14

15 %Caracteristics of the 2nd monitor

16 Monitor2_h = 600 ; %Height (in px)

17 Monitor2_w = 800 ; %Width (in px)

18 MP = get(0,'MonitorPosition') ; %Gets the position ...

of the edges of each monitor (see "Root properties" in MATLAB Documentation Center)

Ces caractéristiques sont les tailles (en pixels) et résolutions (en px/µm) du SLM et de la caméra CCD de notre montage. Précisons que lehdeCCD_hindique une hauteur (height) et que, de façon analogue,windique une largeur (width). Il en va de même pour le SLM, ainsi que pour l’écran 2 (Monitor2). Notons que la définition de deux variables est nécessaire pour l’inclusion de la résolution verticale et horizontale du SLM.

Une attention toute particulière est en outre nécessaire quant à l’usage de la fonctionget: celle-ci, à l’aide du paramètre associé'MonitorPosition'permet de définir la matriceMPdont les coefficients permettent de déterminer les positions et tailles des différents écrans connectés à l’ordinateur — on se réfèrera à l’aide de MATLAB pour plus de détails.

3.3.3 Intensité du laser

La partieLASER INTENSITYpermet de modéliser l’intensité du laserI0in(x,y)au niveau du plan du SLM.

LISTE3.3 – PartieLASER INTENSITYde l’algorithme

1 %% LASER INTENSITY

2 % Defines the intensity Ilaser of the incident laser on the SLM plane.

3

4 %Data from curve fit

5 w_0 = 1.79 ; %Beam waist, ...

calculated from a curve fit (in mm)

6 G = 200/30 ; %Optical ...

magnification of the inverted telescope

7 P_tot = 3.311 ; %Max power of the ...

beam, calculated from a curve fit (in V)

8

9 %Coordinates of the centre of the matrix

10 x_0 = floor(Iout_f_w / 2) ;

11 y_0 = floor(Iout_f_h / 2) ;

12

13 %Creating the intensity matrix knowing beam waist

14 Ilaser = zeros(Iout_f_h,Iout_f_w) ; %Initializes the ...

size of the laser intensity matrix to that of the desired intensity matrix

15 waist_h = w_0 * G * res_SLM_h ;

24 Ilaser = Ilaser ./ max(max(Ilaser)) ; %Scales all values ...

of the laser intensity matrix between 0 and 1.

25 Alaser = sqrt(Ilaser) ; %Defines a ...

real-valued amplitude associated to the laser intensity

26 Elaser = Alaser .* exp(1i * 2 * pi * rand(1)) ; %Associates to the ...

laser intensity a uniformized random phase

3.3. CODE DE L’ALGORITHME DE GERCHBERG-SAXTON

Cette modélisation s’effectue à partir de sa largeurw_0sans télescope inversé (en millimètres), de sa puissance maximaleP_tot, et du grandissementGdudit télescope (cf. section3.4.2). On définit ensuite les cordonnées (x_0,y_0) du centre de la matrice de l’intensité du laser comme la partie entière de la moitié de chaque dimension deIout_fà l’aide de la fonctionfloor. On convertit enfin la largeur du faisceau en pixels tout en la multipliant par le grandissement du télescope, pour chacune des résolutions du SLM ; les valeurs seront assignées àwaist_h etwaist_w.

Après avoir initialisé sa taille comme étant celle de Iout_f, on crée la matrice Ilaser correspondant àIlaser(x,y), coefficient par coefficient, à l’aide d’une double bouclefor. À cette création ne correspond rien d’autre que l’expression théorique de l’intensité d’un faisceau gaussien de l’équation (3.2). Enfin, on ramène toutes les valeurs de la nouvelle matrice entre 0 et 1 par un double usage de la fonctionmax: appliquée à une matrice, cette fonction donne un vecteur ligne avec le maximum de chaque colonne. Le résultat est représenté sur la figure3.8c.

Finalement, on assigne aux variablesAlaseretElaser l’amplitudeAlaser(x,y)et le champ Elaser(x,y), à l’aide d’une phase aléatoire ayant la même valeur en tout point.

3.3.4 Initialisation

Deux versions de l’initialisation ont été écrites ; la liste3.4correspond à l’initialisation A tandis que la liste3.5 correspond à l’initialisation B. Ces deux parties initialisent respectivementEin0(x,y)etEout0 (u,v), puisn.

LISTE3.4 – PartieINITIALIZATION Ade l’algorithme

1 %% INITIALIZATION A

2 % Using fixed data, this section initializes the first values of the input

3 % electric field and of the iteration counter.

4

5 %Initiation of the intensity and phase at the SLM plane

6 Ein_0 = ones(Iout_f_h,Iout_f_w) ;

7 for x = 1:Iout_f_w

8 for y = 1:Iout_f_h

9 Ein_0(y,x) = Elaser(y,x) * exp(1i * 2*pi * rand(1)) ; %Defines an ...

arbitrary output field using the desired amplitude output and a random phase

10 end

11 end

12 Ein = Ein_0 ; %Initializes the ...

value of the input electric field

13

14 n = 0 ; %Initializes the ...

iteration counter of the loop

Pour des raisons de programmation, on initialise tout d’abord la taille deEin_0comme une matrice de mêmes dimensions queIout_f.

Comme expliqué précédemment (cf. section 2.2.2), il nous faut connaitre le champ du laser, muni de la modélisation de son intensité mais sans connaissance, à ce stade du moins, de sa phase. Pour remédier à ce problème, il suffit de multiplierElaserpar une phase aléatoire non uniforme à l’aide d’une double boucle, afin d’obtenir ainsi une expression de départ pour Ein0(x,y)qui satisfasse l’équation (2.3). Afin de pouvoir conserver les informations relatives à notre laser incident, on initialise ensuite la valeur de la variableEincomme valantEin_0, puis la valeur dencomme valant 0.

Le code de l’initialisation B n’est pas fondamentalement différent, à ceci près qu’il initialiseEout0 (u,v)en lieu et place deE0in(x,y).

LISTE3.5 – PartieINITIALIZATION Bde l’algorithme

1 %% INITIALIZATION B

2 % Using fixed data, this section initializes the first values of the output

3 % electric field and of the iteration counter.

4

5 %Initiation of the intensity and phase at the CCD plane

6 Eout_0 = ones(Iout_f_h,Iout_f_w) ;

7 for u = 1:Iout_f_w

8 for v = 1:Iout_f_h

9 Eout_0(v,u) = Aout_f(v,u) * exp(1i * 2*pi * rand(1)) ; %Defines an ...

arbitrary output field using the desired amplitude output and a random phase

10 end

11 end

12 Eout = Eout_0 ;

13

14 n = 0 ;

3.3. CODE DE L’ALGORITHME DE GERCHBERG-SAXTON

Nous verrons néanmoins au section3.5qu’il est possible de faire usage de données sur le front d’onde du laser entrant afin d’en déduire sa phase.

3.3.5 Boucle

Vient ensuite la partie centrale : la boucle, ouLOOP. L’ordre des lignes au sein de la bouclefordiffère selon que la section précédente soit l’initialisation A ou B. Les listes3.6et3.7présentent les boucles correspondant respectivement aux listes3.4et3.5. Les explications théoriques ayant déjà été fournies à leur sujet, seule une description des fonctions utilisées est nécessaire.

LISTE3.6 – Boucle (ouLOOP) de l’algorithme correspondant à l’initialisation A.

1 %% LOOP

2 % The core of the Gerchberg-Saxton algorithm.

3

Les fonctionsfft2etifft2correspondent respectivement aux transformations rapides de Fourier («Fast Fourier Transform») directe et inverse en 2 dimensions, dont l’entrée et la sortie sont des matrices de même taille, et aux temps de calculs sensiblement plus courts que des transformées orthodoxes. Les fonctionsfftshift etifftshiftpermettent de réarranger les emplacements des quatre quarts des matrices utilisées de façon à ce que les coefficients correspondant l’ordre zéro de la diffraction soient au centre des matrices. Enfin,abset anglepermettent d’obtenir respectivement la norme et l’argument d’un nombre complexe. Dans notre cas, ces deux parties d’un coefficient deEcorrespondent à son amplitude et à sa phase. Toute opération sur les matrices des champsEinetEoutou sur leurs composantes, autre que des transformées de Fourier, se fait coefficient par coefficient, en vertu des équations de la section2.2.2exprimant des relations fonctions de la position sur le plan normal à l’axe optique.

LISTE3.7 – Boucle (ouLOOP) de l’algorithme correspondant à l’initialisation B.

1 %% LOOP

2 % The core of the Gerchberg-Saxton algorithm.

3

3.3. CODE DE L’ALGORITHME DE GERCHBERG-SAXTON

3.3.6 Sortie

La partieOUTPUTpermet de produire l’hologramme qui va être affiché sur l’écran 2 et le SLM.

LISTE3.8 – PartieOUTPUTde l’algorithme

1 %% OUTPUT

2 % Automatically displays the phase hologram produced by the loop.

3

4 phiin_holo = phiin ; %Initialize the ...

effective hologram before further transformations

5

6 %Tiling the obtained phase pattern

7 while size(phiin_holo,1) < SLM_h

8 phiin_holo = [phiin_holo ; phiin_holo ; phiin_holo] ;

9 end

10 while size(phiin_holo,2) < SLM_w

11 phiin_holo = [phiin_holo , phiin_holo, phiin_holo] ;

12 end

13 phiin_holo_h = size(phiin_holo,1) ;

14 phiin_holo_w = size(phiin_holo,2) ;

15 v_0 = floor((phiin_h - SLM_h)/2) + 1 ;

16 u_0 = floor((phiin_w - SLM_w)/2) + 1;

17 phiin_holo = phiin_holo(v_0:v_0+SLM_h-1 , u_0:u_0+SLM_w-1) ; %Crops phiin to ...

obtain a hologram matching the SLM's size with an hologram pattern at its center

18

19 phiin_holo = phiin_holo(end:-1:1,:) ; %Rotates the ...

hologram to compensate lense magnification (= -1 in mm)

20

21 %The extremes values of phiin are now between -pi and pi. We need to scale

22 %them between 0 and 255 in order for the SLM to not "misbehave" when

23 %displaying the hologram.

24

25 phiin_holo = mod(phiin_holo,255) ;

26 phiin_holo = uint8(phiin_holo) ;

27

28 %The hologram is now completely black and white without any shade of gray

29

34 set(gcf,'Position',[MP(2,1) , abs(MP(1,4) - MP(2,4)) + 1 , Monitor2_w , ...

Monitor2_h],'MenuBar','none','ToolBar','none','resize','off') ; %Moves it to the 2nd ...

monitor

Premièrement, on associe àphiin_holola dernière valeur dephiinobtenue par la boucle. Quephiinait ou non la taille du SLM, les deux boucleswhilequi suivent concatènentphiin_holode part et d’autre d’elle-même, jusqu’à ce la dimension (hauteur puis largeur) de la matrice ainsi obtenue soit supérieure à celle du SLM. On définit ensuite les coordonnées (u_0,v_0) du centre de cette matrice de façon analogue à (x_0,y_0), avant de rognerphiin_holoà la taille du SLM de façon à obtenir son motif d’origine au centre.

Par la suite, du fait d’un grandissement approximativement égal à−1 entre la figure recherchée et la figure obtenue, cette partie effectue une symétrie axiale de l’hologramme afin d’obtenir une figure correctement orientée, avant de le binairiser (cf. section3.4.1) en tirant partie de la conversion du formatdoubleau formatuint8, avant de l’enregistrer au format BMP.

Les dernières lignes du code procèdent, enfin, à l’affichage de l’hologramme sur l’écran 2. Pour ce faire, on utilise la fonctionimshowdont les paramètres'InitialMagnification'et'Border'permettent d’afficher l’ho-logramme dans la fenêtre ouverte parfigure, en évitant un redimensionnement automatique de l’hologramme tout comme l’apparition d’une bordure à des fins esthétiques. La fonctionsetpermet, par l’usage des paramètres 'MenuBar'et'ToolBar', de faire disparaître tous les éléments de la fenêtre ; les paramètres restants permettent de placer correctement la fenêtre à l’aide de la matriceMPafin d’afficher l’hologramme dans sa totalité.

Spécificité notable du code : la matrice qui suit'Position'et définissant la taille et la position de la fenêtre correspond à la définition se base sur la définition de la matrice obtenue parget(0,'MonitorPosition')pour un système d’exploitation Windows. Autrement dit, à configuration d’écrans identique, les coefficients ne le seront pas sous Linux ou Mac. À nouveau, on se réfèrera à l’aide de MATLAB pour plus de détails sur la détection des écrans par le logiciel.

3.3. CODE DE L’ALGORITHME DE GERCHBERG-SAXTON

3.3.7 Contrôle de la caméra CCD

Si le logiciel de contrôle de la caméra CCD fourni ne sied à l’usage voulu, il est possible de contrôler celle-ci directement depuis MATLAB, comme le présente liste3.9. Cette partie est une ébauche de code permettant sommairement de lire, visualiser et/ou d’enregistrer les images reçues par la caméra, et notamment d’enregistrer l’intensité obtenueIoutc (u,v)en tant que matrice éponyme pour traitement ultérieur.

LISTE3.9 – Partie optionnelleCCD CONTROLde l’algorithme

1 %% CCD CONTROL

2

3 ccd = videoinput('gige' , 1 , 'Mono8') ; %Starts ...

controlling the CCD camera

4 triggerconfig(ccd, 'manual'); %Configures the ...

object for manual trigger mode

5 %Add any needed script if further configuration is needed (exposition time,

6 %contrast, etc.)

7

8 start(ccd) ; %The CCD will not ...

start acquiring and sending images until told to do so

9

10 Iout_c = getsnapshot(ccd); %Acquires an image ...

from the CCD camera (i.e. logs a frame corresponding to the intensity to memory)

11

12 %Stopping the camera

13 stop(ccd) ; %Causes the CCD to ...

no longer sent data back to MATLAB

14 delete(ccd) ;

Primo, on crée un objetccdà partir des caractéristiques de la caméra connectée à l’ordinateur par la fonction videoinput. Les variables de cette fonction dépendent du type de caméra, qui doit impérativement être com-patible avec MATLAB. Secondo, à l’aide de la fonctiontriggerconfig, la ligne suivante configure l’objet pour une activation manuelle. Le cas échéant, il est possible d’ajouter des lignes permettant de modifier plusieurs paramètres tels que le temps d’exposition ou le contraste de l’image.

Tertio, la fonctionstartdémarre l’acquisition de données, qui doivent être manuellement enregistrées sous la forme de la matriceIout_cà l’aide de la fonctiongetsnapshot. Une fois les données acquises, les fonctions stopetdeletestoppent l’acquisition avant de réinitialiser l’objetccd.

Les fonctions de cette partie, qui peuvent aussi être implémentées ailleurs dans le code plutôt qu’à sa fin, permettent ainsi l’acquisition automatisée d’images«c». Ceci aura d’ailleurs été fort utile lors d’une tentative d’optimisation en temps réel des figures de diffractions obtenues.