• Aucun résultat trouvé

Chapitre 3 : Conception et réalisation du montage expérimental

8. Codage des données

8.1 Rapport signal sur bruit et taux d’erreur

Lorsque nous avions effectué les simulations dans le chapitre 2, nous avions caractérisé la qualité des informations enregistrées en définissant un rapport signal sur bruit avec l’équation (2.22). La comparaison de la valeur de ce rapport entre différentes conditions d’enregistrement nous a permis de définir des conditions d’enregistrement optimales. Ce rapport est donc utile,

mais il ne caractérise pas totalement une mémoire optique. En effet, la grandeur pertinente est la qualité de l’information relue, en termes de taux d’erreurs de la mémoire.

Une première façon brute d’analyser les données serait d’effectuer un seuil entre les niveaux haut et bas des pixels relus. Cela revient à trouver sur l’histogramme des données, tel que celui illustré sur la figure 2.18, la valeur du seuil en intensité qui minimise le taux d’erreurs : tous les pixels ayant une valeur inférieure à ce seuil sont déclarés être dans l’état «OFF», les autres sont déclarés dans l’état «ON». Nous voyons très bien sur cet exemple, que le rapport signal sur bruit (et donc la connaissance unique des valeurs moyennes et des écarts type) des distributions «ON» et «OFF» ne sont pas suffisantes pour qualifier les données, les moments d’ordre supérieur décrivant les queues des distributions rentrent aussi en ligne de compte.

De plus, même une image où toute l’information des données est présente peut avoir un rapport signal sur bruit très faible, voire inférieur à un. Pour s’en rendre compte, il suffit d’imaginer une page de données relue avec une efficacité de diffraction variant fortement d’un côté à l’autre de l’image. Localement, sur une petite portion de l’image, il est possible de différencier les pixels à l’état «ON» de ceux à l’état «OFF», alors qu’un seuil global sur toute l’image serait totalement inefficace.

En fait les images brutes détectées par la caméra ne sont jamais utilisées sans traitement. Elles sont la plupart du temps au minimum corrigées des distorsions de l’optique (grandissement, rotation), ré-échantionnées, renormalisées afin de compenser les non- uniformités spatiales provenant par exemple de la non-uniformité des faisceaux optiques d’écriture et de lecture, de la non-uniformité de l’efficacité de diffraction du matériau… Elles peuvent être également déconvoluées pour compenser, au moins partiellement, les défauts des systèmes optiques. D’autres traitements sont souvent effectués [1].

Dans notre étude de la mémoire de Lippmann, notre but n’a pas été de passer du temps à développer de tels traitements d’images. Nous avons décidé d’employer une solution plus simple qui consiste à employer une technique de mise en page des données qui se nomme «codage par blocs». La réalisation que nous en avons effectuée est très directement inspirée de la technique de codage employée dans les disques holographiques de type HVD utilisant l’architecture colinéaire (Figure 1.11) et qui est décrite dans le document de normalisation [8].

Avant la mise en page des données, les données utilisateur subissent toute une chaîne de traitements. Un exemple de chaîne possible est illustré sur la figure 3.20 extraite du document [8]. Elle comprend l’insertion d’en-têtes et de pieds de pages, l’utilisation de codes de corrections d’erreur (ECC), de numéros de page, le mélange des données (afin que des erreurs adjacentes sur la page n’invalident pas la protection par le code correction d’erreurs de cette page).

Figure 3.20 : Prétraitement des données dans le cas des disques HVD [8].

Les données utilisateur sont ainsi transformées en données «page» à inscrire optiquement. Lors de la lecture, une fois les données de la page extraites, le chemin inverse de celui décrit sur la figure 3.20 devra être effectué pour retrouver les données utilisateur.

Créer une chaîne de traitements telle que décrite sur la figure 3.20 nécessite d’une part beaucoup de travail, et d’autre part ne rentre pas dans le cadre de ma thèse. Néanmoins, il est

d’erreurs sur les données utilisateur relues devra être très inférieur à

!

10"12. Compte tenu des codes de correction d’erreurs, le taux d’erreur sur les données « page » que l’on peut tolérer peut être bien supérieur. Un taux d’erreur de quelques pour mille est suffisant pour une mémoire de 1 TéraOctet. C’est l’ordre de grandeur que nous prenons comme objectif de notre mémoire.

Dans le paragraphe suivant, nous décrivons donc la technique que nous avons employée pour transformer les données «page» en page de données.

8.2 Codage par blocs

La technique de codage par bloc a été proposée pour les mémoires holographiques du fait de sa robustesse à toutes les variations spatiales lentes que l’on peut trouver dans les images [9]. Typiquement, au lieu de définir un unique seuil valable pour l’ensemble de l’image relue, le seuil va être défini pour chaque ensemble de pixels que nous appelons bloc. Chaque pixel est donc comparé à son voisinage dans son bloc, ce qui permet automatiquement de s’affranchir des variations spatiales lentes présentes dans l’image. De nombreuses variantes de codage par bloc sont possibles. Celle que nous utilisons est très inspirée par la technique décrite dans le document [8]. Nous l’avons adaptée ainsi que décrit ci-après.

Chaque octet (8 bits) de la chaîne des données page est représenté par un symbole sur un bloc carré de

!

m = 16 = 4 " 4 pixels.

Nous avons choisi un code dit balancé : tous les blocs comprennent le même nombre

!

p

de pixels «ON». On parle de bloc de type

!

Bloc[m, p]. Nous avons choisi le codage

!

Bloc[16,3] pour certaines pages ainsi que, pour d’autres pages, le codage complémentaire

!

Bloc[16,16 " 3] obtenu en intervertissant les pixels «ON» et «OFF». Ces deux codes ont la même capacité. Seul change la rareté des images qui passe de

!

3 16 à !

13 16 . En principe, avec de tels blocs nous pourrions coder

!

C3 16

= 560 caractères (équation (2.23)). Étant donné que nous n’allons coder que des octets (donc 256 valeurs possibles), ce code est sous-utilisé. Nous avons donc défini un ensemble de 256 symboles que nous attribuerons à chacun des blocs en fonction de la valeur du caractère à coder. Autrement dit, nous utilisons une table de correspondance pour faire correspondre chaque octet de 0 à 255 à un des 256 symboles possibles. À titre d’illustration, sur la figure 3.21 nous avons donné quelques exemples de correspondance entre les octets correspondant à la chaîne de caractères «Gabriel LIPPMANN» et les symboles qui seront attribués à chacun des blocs.

Figure 3.21 : Exemples de correspondance entre les octets et les symboles.

L’emploi d’un code balancé distribue automatiquement les pixels à l’état «ON» sur l’ensemble de la page ce qui garantie une meilleure utilisation du matériau d’enregistrement. De plus un tel code facilite la détection et en améliore la robustesse. La détection sera en effet effectuée en recherchant dans chaque bloc de

!

m pixels quels sont les

!

p pixels qui présentent la plus forte intensité. Une fois ceux-ci identifiés, une corrélation avec chaque symbole du jeu de 256 symboles possibles permettra de remonter à la valeur originale de l’octet.

Les blocs ainsi constitués à partir des données de la page, sont ensuite assemblés en sous-pages. Une sous-page est une matrice de

!

Nbx " Nby blocs. Au centre de chaque sous- page nous avons une réserve de 4 " 4 blocs dans laquelle nous insérons une marque fiduciaire. Cette marque nous servira, par corrélation, à déterminer exactement la position de la sous- page dans la page et, avec l’utilisation des marques des autres sous-pages, nous pourrons ainsi mesurer les rotations, distorsions, grandissements qu’a subis notre image entre l’inscription et

la détection. Grâce à ces marques, nous pourrons ainsi retrouver sur l’image captée par la caméra où se trouve chacun des pixels de l’image originale.

Les sous-pages sont ensuite assemblées en une matrice de dimensions

!

Nbsspx " Nbsspy sous-pages pour constituer la page à enregistrer. Sur la figure 3.22, nous illustrons la construction d’une page. Pour cette figure, nous avons choisi une page de faible capacité afin de mieux visualiser la construction d’une telle page.

Figure 3.22 : Exemple d’une page de données constituée de 5x4 sous-pages contenant chacune 8x8 blocs avec un codage de type Bloc(16,3).

Les pages de plus forte résolution que nous avons employées possèdent !

8 " 6 sous- pages de

!

16 "16 blocs. La capacité d’une telle page est de

!

11515 octets .