Contrôle n°1 ISN (2 h) I.
3/11/16
Conversions (5 points) 1. Convertir l’octet (01010101) en décimal. 2. En déduire la conversion de 88 en binaire. Expliquez. 3. Convertir −85 en binaire signé sur 16 bits. On rappelle qu’une méthode pour obtenir rapidement l’opposé consiste à transformer les bits 1 en 0 et les bits 0 en 1 et à ajouter le bit 1 au premier bit. 4. Convertir le code hexadécimal A08 en décimal. 5. Convertir la valeur décimale 88 en code hexadécimal.
II.
Numérisation d’un signal sonore (5 points)
Afin de numériser un signal sonore, on utilise un microphone relié à une carte d’acquisition de résolution 8 bits utilisée sur le calibre [-1,0 V ; + 1,0V]. On enregistre avec cette carte, pendant une durée Δt = 100 ms et de la manière la plus fidèle possible, un son pur de fréquence f = 500 Hz . On donne la fréquence d’échantillonnage de la carte : f e = 1,0 MHz . 1. Expliquer le principe de la numérisation du signal. Faire un schéma illustrant la numérisation réalisée ici. 2. On considère que, pour ce calibre, la quantification de la numérisation est satisfaisante si le pas est inférieur à 0,01 V. Déterminer le pas p de la carte avec le calibre choisi et conclure sur la qualité de la quantification. 3. On considère que l’échantillonnage est correct à condition qu’au moins 10 points de mesure soient effectués sur une période du signal à numériser. Est-ce le cas ici ? Combien de mesures sont faites par périodes. 4. Déterminer la taille du fichier en ko correspondant à cet enregistrement. 5. Aurait-on pu modifier un paramètre d’acquisition afin d’obtenir un fichier de taille plus petite sans que la qualité du signal soit affectée, pour une même durée totale d’enregistrement? Précisez. III.
Numérisation d’une image (5 points)
Tétris est un jeu vidéo populaire conçu en 1984 par l’ingénieur russe Alexei Pajitnov. Il consiste à disposer des pièces de différentes formes pour créer des lignes pleines. Ce jeu vidéo a été proposé avec la première console Game Boy lancé par l’entreprise Nintendo en 1989. L’écran de cette Game Boy avait une définition de 160 × 144 pixels en 4 nuances de gris. 1. Pourquoi peut-on associer à l’image numérique un tableau de nombres ? 2. Combien de nombres seraient utilisés pour décrire l’image numérique du jeu Tétris sur Game Boy en 1984 ? 3. Combien de bits sont nécessaires pour coder chaque nuance de gris ? La Game Boy Color sortie en 1998 avait un écran LCD (liquid crystal display) de 160 × 144 pixels avec une palette de couleur de 32 768=215 couleurs. 1. Donner le code binaire RGB d’un pixel de couleur magenta. 2. Calculer la taille en ko d’une image numérique. IV.
Traitement d’une image numérique (5 points)
Le code suivant en JavaScript permet d’obtenir une symétrie verticale d’une image de 500 × 500 pixels. Les quatre informations par pixel sont les niveaux : Red, Green, Blue, Transparency ; ces informations se trouvent dans une liste appelée imageData1 relative à l’image 1 que l’on transforme pour créer la liste imageData2 relative à l’image 2. function myFunction() { imageData1 = ctx1.getImageData(0,0,500,500); imageData2 = ctx2.getImageData(0,0,500,500); for (n=1;n<=500;n++) { for (p=1;p<=500;p++) { imageData2.data[((n-1)*500+p-1)*4]=imageData1.data[((n-1)*500+500-p+1)*4]; imageData2.data[((n-1)*500+p-1)*4+1]=imageData1.data[((n-1)*500+500-p+1)*4+1]; imageData2.data[((n-1)*500+p-1)*4+2]=imageData1.data[((n-1)*500+500-p+1)*4+2]; imageData2.data[((n-1)*500+p-1)*4+3]=imageData1.data[((n-1)*500+500-p+1)*4+3]; }} ctx2.putImageData(imageData2,0,0); }
Proposer un code permettant de réaliser de la même manière une symétrie horizontale de l’image. Expliquer votre raisonnement et le code.
Correction Contrôle n°1 ISN I.
Conversion (5 pts)
1. 1× 20 + 0 × 21 + 1× 22 + 0 × 23 + 1× 24 + 0 × 25 + 1× 26 + 0 × 27 = 1+ 4 + 16 + 64 = 85 . 2. On rajoute 3 : (00000011) à (01010101) et on obtient (01011000). 3. On travaille sur 16 bits : 85 s’écrit : (0000000001010101) ; on transforme les 0 en 1 et les 1 en 0 pour obtenir : (1111111110101010) puis on ajoute le bit 1 pour obtenir : (1111111110101011). 4. 8 × 160 + 0 × 161 + 10 × 162 = 8 + 10 × 256 = 2568 . 5. On reprend le code binaire de 88 : (01011000) établi à la question 2 et on décompose l’octet en deux parties (0101) dont la valeur en hexadécimal est 5 et (1000) dont la valeur en hexadécimal est 8 ; le code hexadécimal de 88 est donc 58. II.
Numérisation d’un signal sonore (5 pts)
1. La numérisation d’un signal consiste à l’échantillonner puis à le quantifier. plage de conversion plage de conversion 2 2. p = = = = 7,8⋅10−3 V 8 nombre d'intervalles sur 8 bits 255 2 −1 ; la quantification est correcte car p<10 mV. 3. Période d’échantillonnage= 1/fe=10-6 s=1 µs. 10 mesures se font sur une durée de 10-5 s. Une période du signal est T=1/f=2 ms=2000 µs ; elle permet 2000 points de mesure par période. 4. Chaque enregistrement est codé sur 1 octet. Sur la durée de 100 ms, le nombre d’échantillons est 100 000 car un échantillon dure 1 µs=0,001 ms, soit 105 octets, approximativement 100 ko. 5. On peut réduire la fréquence d’échantillonnage. Avec une période du signal de 2 ms, on nous dit que 10 points de mesure suffisent, on doit avoir au minimum Te = 0,2 ms donc fe=1/Te=5 kHz. III. 1. 2. 3. 1. 2. IV.
Numérisation d’une image (5pts) Une image numérique est un tableau comportant 160 × 144 = 23040 pixels auquel on associe, pour chaque pixel, une valeur de nuance de gris. Cela donne 23040 nombres. 2 bits donnent 4 possibilités donc 2 bits suffisent pour coder les 4 nuances de gris. Avec 32768=215 couleurs, chaque sous-pixel est codé sur 5 bits, le code de la couleur cyan est (111110000011111) ; c’est un mot binaire de 15 bits. La taille d’une image numérique est 160 × 144 ×15/8=43200 octets soit 43 ko. Traitement d’une image numérique (5 pts)
function myFunction() { imageData1 = ctx1.getImageData(0,0,500,500);//c’est une liste contenant toutes les données sur les pixels qui constituent l’image 1, chaque pixel étant codé sur 4 octets : R,V,B,Transparence. imageData2 = ctx2.getImageData(0,0,500,500); for (n=1;n<=500;n++) {//n représente le numéro de ligne for (p=1;p<=500;p++) {//p représente le numéro de colonne //la boucle permet de balayer, ligne après ligne, les 500 colonnes pour chaque ligne. imageData2.data[((n-1)*500+p-1)*4]=imageData1.data[((500-n-1)*500+p-1)*4]; imageData2.data[((n-1)*500+p-1)*4+1]=imageData1.data[((500-n-1)*500+p-1)*4+1]; imageData2.data[((n-1)*500+p-1)*4+2]=imageData1.data[((500-n-1)*500+p-1)*4+2]; imageData2.data[((n-1)*500+p-1)*4+3]=imageData1.data[((500-n-1)*500+p-1)*4+3]; } } ctx2.putImageData(imageData2,0,0);//on constitue l’image 2 à partir des données portant sur les pixels. } n + n' Les points (n,p) et (n’,p) sont symétriques par rapport à la ligne 250 si 250 = ⇒ n' = 500 − n . 2 Dans le code, il suffit de remplacer n par 500 –n . http://isnangellier.alwaysdata.net/traitement.html
colonne p
ligne 1
Pixel 1
ligne 2
Pixel 501 Pixel 502
Pixel 2
Pixel 500 imageData[((n-1)*500+p-1)*4]
imageData[((n-1)*500+p-1)*4+1]
rouge
vert
imageData[((n-1)*500+p-1)*4+2]
bleu
imageData[((n-1)*500+p-1)*4+3]
transparence
ligne n
Pixel (n-1)*500+p
ligne 250 Pixel (500-n-1)*500+p
ligne 500-n
imageData[((500-n-1)*500+p-1)*4] imageData[((500-n-1)*500+p-1)*4+1] imageData[((500-n-1)*500+p-1)*4+2] imageData[((500-n-1)*500+p-1)*4+3]
rouge
vert
bleu
transparence
Pixel 500*500 imageData[0]
imageData[1]
imageData[2]
imageData[3]
imageData= [valeur décimale Rouge Pixel1 ,valeur décimale Bleu Pixel1, valeur décimale Vert Pixel1, valeur décimale Transparence Pixel1 , valeur décimale Rouge Pixel2 ,valeur décimale Bleu Pixel2, valeur décimale Vert Pixel2, valeur décimale Transparence Pixel2, imageData[4] .................................. ]
imageData[5]
ImageData[4] est le niveau de rouge du pixel 2 : 4=(2-1)*4 ; ImageData est une liste indexée à partir de 0. ImageData[((n-1)*500+p-1)*4] est le niveau de rouge du pixel numéro (n-1)*500+p (ligne n, colonne p).