diff --git a/main.c b/main.c index 1ec4ac3de05e23cca18a5da9df85f151ec78ef00..4a851d847d77e222239f99ed0c2383c55bdd88a2 100644 --- a/main.c +++ b/main.c @@ -2,48 +2,53 @@ int main(void) { + char *msg = "1001"; printf("\n----- II. Derrière certaines matrices génératrices... -----\n\n"); printf("-- Q3 --\n\n"); - printf("Message : %s\nMessage encodé : %s\n\n", "1001", encode("11100111")); - printf("Message encodé (sans erreur) : %s\nSyndrome : %s\n\n", "10101101", decode("10101101")); // Le syndrome doit être 0000 - printf("Message encodé (avec une erreur) : %s\nSyndrome : %s\n\n", "10100101", decode("10100101")); // Le syndrome doit être 1000 + printf("Message : %s\nMessage encodé : %s\n\n", msg, encode(msg)); + printf("Message encodé (sans erreur) : %s\nSyndrome : %s\n\n", encode(msg), decode(encode(msg))); // Le syndrome doit être 0000 + printf("Message encodé (avec une erreur) : %s\nSyndrome : %s\n\n", set_error(encode(msg), 0), decode(set_error(encode(msg), 0))); // Le syndrome doit être 1000 printf("-- Q4 --\n\n"); - printf("La distance de Hamming entre les codewords %s et %s est : %d\n\n", "10011000", "10001011", hamming_distance("10011000","10001011")); + char *c1 = "10011000", *c2 = "10001011"; + printf("La distance de Hamming entre les codewords %s et %s est : %d\n\n", c1, c2, hamming_distance(c1, c2)); printf("----- IV. Restaurez la gloire matricielle de P -----\n\n"); + printf("-- Q1 --\n\n"); - printf("Message : %s\n\tMessage encodé avec la matrice : %s\n\tMessage encodé avec le polynôme : %s\n\t%s\n\n", "1001", encode("1001"), polynomial_encode("1001"), strcmp(encode("1001"),polynomial_encode("1001")) == 0 ? "Bon résultat" : "Mauvais résultat"); + printf("Message : %s\n\tMessage encodé avec la matrice : %s\n\tMessage encodé avec le polynôme : %s\n\t%s\n\n", msg, encode(msg), polynomial_encode(msg), strcmp(encode(msg), polynomial_encode(msg)) == 0 ? "Bon résultat" : "Mauvais résultat"); + printf("Message encodé (sans erreur) : %s\nSyndrome : %s\n\n", polynomial_encode(msg), polynomial_decode(polynomial_encode(msg))); // Le syndrome doit être 0000 + printf("Message encodé (avec une erreur) : %s\nSyndrome : %s\n\n", set_error(polynomial_encode(msg), 0), polynomial_decode(set_error(polynomial_encode(msg), 0))); // Le syndrome doit être 1000 printf("-- Q2 --\n\n"); - // printf("Codeword : %s\t\tCodeword avec une erreur à la position %d : %s\n\n","10101101", 2, set_error("10101101", 2)); + printf("Codeword : %s\t\tCodeword avec une erreur à la position %d : %s\n\n", encode(msg), 2, set_error(encode(msg), 2)); printf("-- Q3 --\n\n"); - // char* codeword = polynomial_encode("1010"); - // printf("Codeword : %s\n", codeword); - // for(int i = 0; i < 8; i++) - // { - // char* false_codeword = set_error(codeword, i); - // printf("Erreur à la position %d : %s\t\tC mod P : %s\n", i, false_codeword, polynomial_decode(false_codeword)); - // } - // printf("\n"); - - // codeword = polynomial_encode("1101"); - // printf("\nCodeword : %s\n", codeword); - // for (int i = 0; i < 8; i++) - // { - // char *false_codeword = set_error(codeword, i); - // printf("Erreur à la position %d : %s\t\tC mod P : %s\n", i, false_codeword, polynomial_decode(false_codeword)); - // } - // printf("\n"); - - // codeword = polynomial_encode("0111"); - // printf("\nCodeword : %s\n", codeword); - // for (int i = 0; i < 8; i++) - // { - // char *false_codeword = set_error(codeword, i); - // printf("Erreur à la position %d : %s\t\tC mod P: %s\n", i, false_codeword, polynomial_decode(false_codeword)); - // } + char* codeword = polynomial_encode(msg); + printf("Codeword : %s\n", codeword); + for(int i = 0; i < 8; i++) + { + char* false_codeword = set_error(codeword, i); + printf("Erreur à la position %d : %s\t\tC mod P : %s\n", i, false_codeword, polynomial_decode(false_codeword)); + } + printf("\n"); + + codeword = polynomial_encode("1101"); + printf("\nCodeword : %s\n", codeword); + for (int i = 0; i < 8; i++) + { + char *false_codeword = set_error(codeword, i); + printf("Erreur à la position %d : %s\t\tC mod P : %s\n", i, false_codeword, polynomial_decode(false_codeword)); + } + printf("\n"); + + codeword = polynomial_encode("0111"); + printf("\nCodeword : %s\n", codeword); + for (int i = 0; i < 8; i++) + { + char *false_codeword = set_error(codeword, i); + printf("Erreur à la position %d : %s\t\tC mod P: %s\n", i, false_codeword, polynomial_decode(false_codeword)); + } printf("\n\n"); } \ No newline at end of file diff --git a/rapport.md b/rapport.md index 5d7a00386aa8f8867251e326ecf300331dd4bc2c..3ff860838ac1dd5276755241aa3ca33f9f78cdd1 100644 --- a/rapport.md +++ b/rapport.md @@ -16,11 +16,12 @@ La taille des blocs que l'on peut encoder est de 4 bits. Le nombre de bits de co * *Son rendement ;* -Son rendement est de $4/8$ (50%). +Son rendement est de $\frac{4}{8}$ (50%). * *La distance de Hamming du code C ;* -La distance de Hamming du code C est $d = 4$. +On sait que la $distance = Min_{X ≠0} (Poids(X))$. +On remarque que le poids minimal des codewords de la matrice G est de 3. Donc la distance de Hamming du code C est $d = 3$. * *Sa matrice de vérification de parité H* @@ -30,9 +31,9 @@ $$H = \begin{bmatrix}1 & 1 & 0 & 0 & 1 & 0 & 0 & 0\\ 1 & 0 & 0 & 1 & 0 & 0 & 0 & 1 \end{bmatrix}$$ -2. *Au vu de la distance de Hamming de C, quelles sont ses capacités de correction et de détection d’erreur(s) ?* +1. *Au vu de la distance de Hamming de C, quelles sont ses capacités de correction et de détection d’erreur(s) ?* -Pour un Hamming code de distance d, on peut détecter $d-1$ erreurs et corriger $[d-1]/2$ erreurs. Pour le code C on peut donc détecter 3 erreurs et en corriger une. +Pour un Hamming code de distance d, on peut détecter $d-1$ erreurs et corriger $\frac{d-1}{2}$ erreurs. Pour le code C on peut donc détecter 3 erreurs et en corriger une. ## III - ...se cachent des polynômes générateurs équivalents. @@ -59,51 +60,56 @@ On remarque le même motif qui se répéte en décalant à droite d'un bit sur c <thead><tr><th colspan="2" style="text-align:center">Message : 1010</th></tr></thead> <tbody> <tr><th>Position</th><th>C mod P</th></tr> - <tr><td><b>1</b></td><td>1 0 0 0</td></tr> - <tr><td><b>2</b></td><td>1 0 0 0</td></tr> - <tr><td><b>3</b></td><td>0.55700</td></tr> - <tr><td><b>4</b></td><td>0.43400</td></tr> - <tr><td><b>5</b></td><td>0.43400</td></tr> - <tr><td><b>6</b></td><td>0.43400</td></tr> - <tr><td><b>7</b></td><td>0.43400</td></tr> - <tr><td><b>8</b></td><td>0.43400</td></tr> + <tr><td><b>1</b></td><td>1 0 1 1</td></tr> + <tr><td><b>2</b></td><td>1 1 0 0</td></tr> + <tr><td><b>3</b></td><td>0 1 1 0</td></tr> + <tr><td><b>4</b></td><td>0 0 1 1</td></tr> + <tr><td><b>5</b></td><td>1 0 0 0</td></tr> + <tr><td><b>6</b></td><td>0 1 0 0</td></tr> + <tr><td><b>7</b></td><td>0 0 1 0</td></tr> + <tr><td><b>8</b></td><td>0 0 0 1</td></tr> </tbody> </table> <table style="margin:auto;text-align:center;"> <thead><tr><th colspan="2" style="text-align:center">Message : 1101</th></tr></thead> <tbody> <tr><th>Position</th><th>C mod P</th></tr> - <tr><td><b>1</b></td><td>1 0 0 0</td></tr> - <tr><td><b>2</b></td><td>1 0 0 0</td></tr> - <tr><td><b>3</b></td><td>0.55700</td></tr> - <tr><td><b>4</b></td><td>0.43400</td></tr> - <tr><td><b>5</b></td><td>0.43400</td></tr> - <tr><td><b>6</b></td><td>0.43400</td></tr> - <tr><td><b>7</b></td><td>0.43400</td></tr> - <tr><td><b>8</b></td><td>0.43400</td></tr> + <tr><td><b>1</b></td><td>1 0 1 1</td></tr> + <tr><td><b>2</b></td><td>1 1 0 0</td></tr> + <tr><td><b>3</b></td><td>0 1 1 0</td></tr> + <tr><td><b>4</b></td><td>0 0 1 1</td></tr> + <tr><td><b>5</b></td><td>1 0 0 0</td></tr> + <tr><td><b>6</b></td><td>0 1 0 0</td></tr> + <tr><td><b>7</b></td><td>0 0 1 0</td></tr> + <tr><td><b>8</b></td><td>0 0 0 1</td></tr> </tbody> </table> <table style="margin:auto;text-align:center;"> <thead><tr><th colspan="2" style="text-align:center">Message : 0111</th></tr></thead> <tbody> <tr><th>Position</th><th>C mod P</th></tr> - <tr><td><b>1</b></td><td>1 0 0 0</td></tr> - <tr><td><b>2</b></td><td>1 0 0 0</td></tr> - <tr><td><b>3</b></td><td>0.55700</td></tr> - <tr><td><b>4</b></td><td>0.43400</td></tr> - <tr><td><b>5</b></td><td>0.43400</td></tr> - <tr><td><b>6</b></td><td>0.43400</td></tr> - <tr><td><b>7</b></td><td>0.43400</td></tr> - <tr><td><b>8</b></td><td>0.43400</td></tr> + <tr><td><b>1</b></td><td>1 0 1 1</td></tr> + <tr><td><b>2</b></td><td>1 1 0 0</td></tr> + <tr><td><b>3</b></td><td>0 1 1 0</td></tr> + <tr><td><b>4</b></td><td>0 0 1 1</td></tr> + <tr><td><b>5</b></td><td>1 0 0 0</td></tr> + <tr><td><b>6</b></td><td>0 1 0 0</td></tr> + <tr><td><b>7</b></td><td>0 0 1 0</td></tr> + <tr><td><b>8</b></td><td>0 0 0 1</td></tr> </tbody> </table> </div> *Répétez l’opération sur au moins deux autres mots Mb et Mc. Qu’observez-vous ?* -On remarque que le syndrome est le même pour une postion i peu importe le message de base. +On remarque que le résultat de C mod P est le même pour une postion i peu importe le message de base. Donc C mod P renvoit le syndrome et donc la position de l'erreur dans le codeword C. -1. *Soit le vecteur vi à 9 bits tel que seul le i eme bit est à 1. Pour tout $vi|i ∈$ {0,9}, calculez vi mod P. Que constatez-vous ? Que pouvez-vous en conclure ?* +4. *Soit le vecteur vi à 9 bits tel que seul le i eme bit est à 1. Pour tout $vi|i ∈$ {0,9}, calculez vi mod P. Que constatez-vous ? Que pouvez-vous en conclure ?* + +On constate qu'en rajoutant un 9ème bit au vecteur, le syndrome se retrouve décalé d'un bit à gauche par rapport au syndrome qu'on obtient avec un vecteur de 8 bits. + +5. *À l’aide de vos observations, implémentez un mécanisme efficace permettant de corriger des erreurs uniques. Justifier vos choix d’implémentation et tester votre implémentation.* + +## V - Tests sur un Médium peu fiable -2. *À l’aide de vos observations, implémentez un mécanisme efficace permettant de corriger des erreurs uniques. Justifier vos choix d’implémentation et tester votre implémentation.*