• Aucun résultat trouvé

CHAPITRE 1 INTRODUCTION

1.3 Revue des connaissances

2.2.2 Algorithmes

Les deux contextes de développements correspondent à deux algorithmes à implémenter.

2.2.2.1 Génération du signal NMR

La figure 2.2 représente le déroulé de la séquence tel qu’expliqué plus haut. Cette image est issue du simulateur de l’environnement de développement de l’IRM. Il s’agit donc d’une représentation fidèle des événements pilotés par la séquence. On peut y observer la ligne de temps représentant l’écoute du signal NMR (« ADC Signal Data »), les trois lignes corres- pondant aux gradients magnétiques (« X-gradient », « Y-Gradient », « Z-Gradient ») et la ligne de temps des événements de type onde RF (« RF-Signal Data »).

On peut constater sur le diagramme 2.2 qu’un même motif se répète trois fois : une onde RF, un ensemble de gradients, et un événement d’acquisition du signal NMR. Ce motif est la « brique de base » de l’algorithme, il correspond à l’excitation, la sélection et l’acquisition de la projection sur chacun des axes X, Y et Z. C’est pourquoi il est répété trois fois pour constituer une acquisition complète. Nous avions indiqué en 1.2.2 que l’onde excitant les protons d’hydrogène était une onde « à 90° ». Or, le diagramme nous montre quatre pulsations parmi lesquelles une seule indiquée comme étant à 90°. Dans des conditions réelles, une simple onde RF à 90° n’est pas suffisante pour obtenir du signal de suffisamment bonne qualité pour réaliser l’acquisition d’un signal NMR, c’est d’autant plus vrai quand nous souhaitons réaliser trois acquisitions successives comme dans notre cas ! Les ondes supplémentaires ont pour but de rehausser le signal comme on le ferait en donnant des impulsions continuellement à quelqu’un sur une balançoire. La quasi totalité des séquences d’imagerie IRM nécessitent

temps de base 33790000 33792000 33794000 33796000 33798000 33800000 33802000 33804000 33806000 33808000 33810000 33812000 33814000 33816000 33818000 33820000 33822000 33824000 33826000 33828000 33830000 33832000 33834000 33836000 33838000 33840000 33842000 33844000 33846000 33848000 33850000 33852000 33854000 33856000 33858000 33860000 0 0.2 0.4 0.6 0.8 1 -0.1 33790000 33792000 33794000 33796000 33798000 33800000 33802000 33804000 33806000 33808000 33810000 33812000 33814000 33816000 33818000 33820000 33822000 33824000 33826000 33828000 33830000 33832000 33834000 33836000 33838000 33840000 33842000 33844000 33846000 33848000 33850000 33852000 33854000 33856000 33858000 33860000 0 0.6 1.2 1.8 2.4 3 -0.6 -1.2 -1.8 -2.4 -3 33790000 33792000 33794000 33796000 33798000 33800000 33802000 33804000 33806000 33808000 33810000 33812000 33814000 33816000 33818000 33820000 33822000 33824000 33826000 33828000 33830000 33832000 33834000 33836000 33838000 33840000 33842000 33844000 33846000 33848000 33850000 33852000 33854000 33856000 33858000 33860000 0 0.6 1.2 1.8 2.4 3 -0.6 -1.2 -1.8 -2.4 -3 33790000 33792000 33794000 33796000 33798000 33800000 33802000 33804000 33806000 33808000 33810000 33812000 33814000 33816000 33818000 33820000 33822000 33824000 33826000 33828000 33830000 33832000 33834000 33836000 33838000 33840000 33842000 33844000 33846000 33848000 33850000 33852000 33854000 33856000 33858000 33860000 0 0.6 1.2 1.8 2.4 3 -0.6 -1.2 -1.8 -2.4 -3 33790000 33792000 33794000 33796000 33798000 33800000 33802000 33804000 33806000 33808000 33810000 33812000 33814000 33816000 33818000 33820000 33822000 33824000 33826000 33828000 33830000 33832000 33834000 33836000 33838000 33840000 33842000 33844000 33846000 33848000 33850000 33852000 33854000 33856000 33858000 33860000 0 30 60 90 120 150 180 210 240 270

ADC Signal Data

X-Gradient Y-Gradient Z-Gradient RF-Signal Data (63.6 MHz) (1) (2) (3) (4) (5) (6)

Figure 2.2. Chronologie de la séquence MS-SET : (1) Onde RF à 90° (2) Onde RF à 180° (3) Gradient de déphasage (4) Gradient de lecture (5) Gradient de rephasage (6) Acquisition du signal NMR. Temps de base : temps caractéris- tique segmentant la séquence.

une technique de refocalisation du signal, elles sont classées en deux grandes familles : les « écho de spin » comme dans notre cas, et les « écho de gradient ».

L’algorithme correspondant au diagramme 2.2 est présenté par le listage 2.1. Trois des prin- cipaux paramètres que l’utilisateur peut régler et qui influent sur le résultat de la localisation sont :

– le décalage fréquentiel (offsetRF ) pour la sélection d’une équipotentielle ; – le nombre d’acquisition que l’on souhaite effectuer (nbLoops) ;

– le temps de repos entre chaque acquisition (repetitionTime, TR). Nous commençons par préparer les objets à insérer dans la chronologie :

– une onde RF à 90° qui sera émise une fois ; – une onde RF à 180° qui sera émise trois fois ;

– et pour chaque axe : un ensemble de gradients qui vont permettre de réaliser l’acqui- sition sous la forme d’une projection sur l’axe voulu, et un évènement de lecture du signal NMR.

La seconde partie de l’algorithme est une boucle lançant les évènements aux instants déclarés. Le calcul des timings répond à plusieurs règles. La principale d’entre elles concerne la durée notée baseTime dans l’algorithme 2.1 : ce temps doit se retrouver à l’identique tel qu’illustré par le diagramme 2.2.

Paramètres (GUI) : offsetRf, relaxTime, nbLoops Data : timer

Data : baseTime

// préparation des objets

RfEvent90 ← new RfEvent ; // onde à 90°

setAngle(RfEvent90, 90)

setFrequency(RfEvent90, getFrequency(RfEvent) + offsetRf)

RfEvent180 ← new RfEvent ; // onde à 180°

setAngle(RfEvent180, 180)

setFrequency(RfEvent180, getFrequency(RfEvent180) + offsetRf) AdcEvent ← new AdcEvent[3]

DephaseEvent ← new GradientEvent[3] ReadGradient ← new GradientEvent[3] RephaseEvent ← new GradientEvent[3]

for axe ∈ {X, Y, Z} do

setFrequency(AdcEvent[axe], getFrequency(AdcEvent[axe]) + offsetRf)

end

baseTime ← 4280 ; // µs

// boucle principale

timer ← 0 ; // timer en µs

for l ← 1 to nbLoops do

// excitation par l’onde RF à 90°

RunSeqEvent(timer, RfEvent90) ; // RunSeqEvent(quand, quoi) 1

timer ← timer +Duration(RfEvent)/2 + baseTime

for axe ∈ {X, Y, Z} do

RunSeqEvent(timer - Duration(DephaseGradient[axe])/2, DephaseGradient[axe]) timer ← timer + baseTime

RunSeqEvent(timer - Duration(RfEvent180)/2, RfEvent180) timer ← timer + baseTime

// gradient de lecture et écoute du signal RMN

RunSeqEvent(timer − Duration(ReadGradient[axe])/2, ReadGradient[axe]) RunSeqEvent(timer − Duration(ReadEvent[axe])/2, AcqEvent[axe]) timer ← timer + baseTime

RunSeqEvent(timer - Duration(RephaseGradient[axe])/2, RephaseGradient[axe]) timer ← timer + baseTime

// pause

RunSeqEvent(relaxTime, NULL) timer ← timer + relaxTime

end end

2.2.2.2 Traitement du signal

Une fois le signal NMR acquis par l’une des antennes RX de l’IRM, nous effectuons la corrélation croisée entre une position dont nous avons conservé le signal (appelé « masque de corrélation », dans la pratique il s’agit de la toute première acquisition, dont nous devons savoir précisément les coordonnées) et l’acquisition courante. La figure 2.3 en détaille le principe. Artéfact Signal NMR Corrélation 512 = position initiale décalage à l'origine : 428-512 = -84 px -84 px -49.22 mm Pos it ion cou ran te Pos it ion d e ré fére nce

Figure 2.3. Principe de la corrélation. La valeur maximale de la corrélation entre les deux signaux se trouve écartée de l’origine (milieu de l’image) d’une distance (en px) proportionnelle à la distance (en mm) parcourue par le dispo- sitif.

Le listage 2.2 présente l’algorithme implémenté dans l’unité de traitement du signal de l’IRM. L’environnement de développement fournit un certain nombre d’outils mathématiques pour traiter le signal. D’après [9], la corrélation croisée de deux signaux x et y (le premier étant la projection de la position initiale et le second la projection de la position courante) est équivalente à :

corr(x, y) = X · conj(Y ) (2.1)

où X et Y sont respectivement les spectres fréquentiels des signaux (x et y). Nous extrayons la valeur maximale de cette corrélation et son indice pour obtenir, en pixel, la variation détectée. En connaissant la taille du field of view (FOV) et la résolution de l’acquisition, nous pouvons calculer la taille en millimètres d’un pixel et in-fine le déplacement du dispositif.

Le déplacement détecté est confronté à une valeur seuil fixée par l’utilisateur pour filtrer les valeurs aberrantes.

Entrée : rawData Entrée : infoHeader

Result : déplacement en px et en mm initialisation objets

axe ← (line mod 3)

if isFirstAcquisition(line) then

correlationMask[axe] ← newIceObject(rawData) currentMask[axe] ← correlationMask[axe]

else

currentMask[axe] ← newIceObject(rawData)

end correlation

corr ←ComplexConjugateMultiplication(currentMask, correlationMask) corr ←FourierTransform(corr)

pospx ←max(ExtractComplex(corr))

conversion et thresholding

posmm ← pospx ×resolution2F oV − F oV

if abs(posmm - previous[axe]) > threshold[axe] then

posmm ← previous[axe]

else

previous[axe] ← posmm

end

ExportValues(axe, pospx, posmm)

2.2.2.3 Exemple complet de données de corrélations

La figure 2.4 représente un exemple des données de corrélation pour les trois axes. Tous les signaux sont issus de notre implémentation de MS-SET au sein de l’IRM du laboratoire de Nanorobotique. Les images sont issues d’un programme réalisé avec Matlab dans lequel nous avons implémenté l’algorithme 2.2. Ce programme a été utilisé dans la majorité des expériences de ce mémoire, y compris les in-vivo, pour s’assurer de la qualité du signal NMR traité. Lorsque nous cherchons à optimiser un paramètre de la séquence ou comprendre l’origine d’une erreur, c’est le plus souvent en observant les données de ce programme que nous y parvenons.

(a) Masque X (b) Masque Y (c) Masque Z

(d) Projection courante X (e) Projection courante Y (f) Projection courante Z

(g) Corrélation X (h) Corrélation Y (i) Corrélation Z Figure 2.4. Exemple de corrélation reproduite sous Matlab du tracking d’une bille de 0.9 mm de diamètre en condition in-vitro. (a) à (c) position de réfé- rence (masque de corrélation), (d) à (e) position courante (g) à (i) corrélation croisée des deux signaux avec indication de la position de valeur maximale. Les colonnes de gauche à droite représentent les données des axes X, Y et Z.