From 09e4bfabdb20ec826a9ffb5a824b6f2a38b55256 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Mon, 4 May 2026 17:02:46 +0200 Subject: [PATCH] vu global --- pres.md | 43 +++++ presentation.pdf | Bin 2316 -> 104828 bytes presentation.typ | 414 +++++++++++++++++++++++++++++++++++++++++++++ presentation.typst | 0 4 files changed, 457 insertions(+) create mode 100644 pres.md create mode 100644 presentation.typ delete mode 100644 presentation.typst diff --git a/pres.md b/pres.md new file mode 100644 index 0000000..be20203 --- /dev/null +++ b/pres.md @@ -0,0 +1,43 @@ +# Introduction +## 1 +1. L'Amorce (Le défi physique) + + Contexte : Le pilotage de drones FPV impose une transmission sous de fortes contraintes : un canal hautement bruité couplé à une exigence stricte de très faible latence. + +2. Le Fondement Théorique + + Le problème : L'environnement physique altère inévitablement les bits. La solution réside dans le FEC (Forward Error Correction) : l'injection de redondance intelligente. + + Le théorème de Shannon (1948) : Il démontre qu'une transmission sans erreur est mathématiquement possible, à condition que le débit d'information soit inférieur à la limite théorique appelée "capacité du canal". + +3. Le Paysage des Codes Correcteurs + + Diversité : Le code de Hamming a initié la famille des codes linéaires. Depuis, d'autres familles dominent selon les applications : codes algébriques structurés (Reed-Solomon) ou approches itératives (Turbo-codes). + + Transition vers le sujet : L'objectif ultime est de saturer la limite de Shannon tout en garantissant un décodage rapide. C'est exactement la promesse des codes LDPC, que nous allons maintenant définir mathématiquement. + +# Problématique +## 1 +... + +# Définition Codes Linéaires +## 1 +On "plonge" l'information dans un espace de dimension supérieure. Le code C est un sous-espace vectoriel de dimension k de l'espace F2n. La redondance ajoutée est de m=n−k bits. +Lien entre distance de Hamming et nombre d'arrete qu'il faut pour passer d'un mot à un autre. +Phi injective pour pas avoir 2 message disctincts qui represente le meme mot. +## 2 +C est un sous espace vectoriel de dim k plongé dans F_2^n +On peut définir tout ça bien à base de frome linaire et adjoint... perche +## 3 +Linéarité => decodage par syndrome + +# Redondance et limite theorique +## 1 +Ajouter de la redondance coûte cher en débit, c'est ce que l'on appelle l'overhead. Pour garder un débit élevé tout en corrigeant beaucoup d'erreurs, la solution est d'utiliser des codes de très grande taille. En augmentant la longueur du bloc N, nous permettons au décodeur de traiter l'information de manière statistique et de nous approcher très près de la capacité limite du canal. +## 2 +La correction d'erreur n'est pas gratuite : elle se paie en débit. Pour ne pas gaspiller de bande passante tout en restant fiable, la théorie de Shannon nous montre qu'il faut utiliser des codes de très grande taille. Un bloc long permet de mieux diluer l'impact du bruit. C'est pour cette raison que les standards modernes (5G, Wi-Fi) utilisent des codes LDPC massifs : ils offrent le meilleur ratio 'correction / sacrifice de débit' possible à ce jour. + +# MDL +## 1 +## 2 +Mathématiquement, le décodeur idéal est celui du Maximum de Vraisemblance (ML). Il garantit le taux d'erreur le plus bas, mais au prix d'une complexité exponentielle en O(2k). Pour les codes modernes à gros blocs, c'est un problème NP-complet insoluble. C'est ici que réside le génie des LDPC : en imposant une matrice H très creuse, on peut utiliser des algorithmes de propagation de croyance qui transforment ce mur de complexité en une simple progression linéaire, rendant le décodage haute performance physiquement possible dans un drone ou un smartphone. diff --git a/presentation.pdf b/presentation.pdf index dce071f0bc46fd40d7dff538f007ecf0df120a9e..523c72727605a21f9cea6d29e1ab1a1e1d99f954 100644 GIT binary patch literal 104828 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

    f|xc{YqR>zHHP14@xME6BD4*d5G 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 delta 557 zcmZ{hPfG$(6vewq29HG25h{pYq?H8q=KnlXp(rZ~0^0;pWH_Q>j?S1)ZlZmQVuDAz z+O)4t&?vBExaY2zg{{07hy-> zqRvim$SI!(oY6s!jig|XWp{xK$yA;eR9V5A#7}D))wWqM4Z|TB6P!iqG}0@1V{acJ zncZ5zfyS<55cT`I+yZtIf-opduwb@_h=N3zX+dr<*4G_OgtpVe}v&#l7N9^iRaei~5T0K~+8X3FRvJRJY_SS&Oe_CP_9-L>& zF`o@%pt86PH$d5o4dj?;1QV}tC4kz35JBQQn8>RgOwyDNCM&dqDOCE+cvaOrcKms` zZstm5-9*Wx_e~q6mX4{XvW8K|?w}jG>sBfS1G^``+ydU3{4 1 { + block(width: 100%, fill: black, inset: (top: 0.2cm, bottom: 0.2cm, left: 1.5cm, right: 1.5cm))[ + #set text(fill: white, size: 12pt, weight: "bold") + #grid( + columns: (1.5fr, 2fr, 1fr, auto), + align: (left, center, center, right), + [#auteur n°#numero], [#titre], [#annee], [#(cur - 1) / #(tot - 1)], + ) + ] + } + } +] + +// Plan +// Plan +#let design_plan(items) = { + let r = 6pt + let epaisseur = 2pt + let hauteur_ligne = 2.5em + let espace_vertical = 20pt + + pad(left: 1cm, top: 1cm)[ + #block[ + #place(dx: r, dy: hauteur_ligne / 2)[ + #line( + length: (items.len() - 1) * (hauteur_ligne + espace_vertical), + angle: 90deg, + stroke: epaisseur + black, + ) + ] + + #grid( + columns: (2 * r, auto), + column-gutter: 20pt, + row-gutter: espace_vertical, // On applique la variable ici + ..items + .map(item => ( + box(height: hauteur_ligne, align(center + horizon)[ + #circle(radius: r, fill: white, stroke: epaisseur + black) + ]), + box(height: hauteur_ligne, align(left + horizon)[ + #text(weight: "bold", size: 1.1em)[#item] + ]), + )) + .flatten() + ) + ] + ] +} + +// Page de garde +#slide[ + #v(1fr) + #align(center)[ + #pad(x: 1.5cm)[ + #text(size: 3em, weight: "bold")[#titre] + #v(0cm) + #text(size: 1.4em)[*#auteur n°#numero*] \ + #v(1cm) + #text(size: 1.1em)[#annee] + ] + ] + #v(1fr) +] + +#myslide("Plan")[ + #design_plan(( + [Introduction], + [Codes linéaires], + [LDPC], + [Codage], + [Décodage], + [Analyse], + )) +] + + +#myslide("Introduction : transmission numérique")[ + // Schema Shannon + #align(center + horizon)[ + #cetz.canvas({ + import cetz.draw: * + + // Styles + let s = (stroke: 2pt + black) + let s_fleche = (stroke: 2pt + black) + let pointe_pleine = (end: "stealth", fill: black) + + let espacement = 5.5 + + // Blocs + content((0, 0), [Source], name: "src", frame: "rect", ..s, padding: .3) + content((espacement, 0), [Emetteur], name: "em", frame: "rect", ..s, padding: .3) + content((espacement * 2, 0), [Canal], name: "chan", frame: "rect", ..s, padding: .3) + content((espacement * 3, 0), [Récepteur], name: "rec", frame: "rect", ..s, padding: .3) + content((espacement * 4, 0), [Destinataire], name: "dest", frame: "rect", ..s, padding: .3) + + // Bruit + content((rel: (0, 1.8), to: "chan"), [Bruit], name: "bruit", frame: "rect", ..s, padding: .3) + + // Codage / Décodage + content((rel: (0, 1), to: "em"), [*Codage*]) + content((rel: (0, 1), to: "rec"), [*Décodage*]) + + // Flèches (On utilise s_fleche et pointe_pleine) + line("src.east", "em.west", mark: pointe_pleine, ..s_fleche) + line("em.east", "chan.west", mark: pointe_pleine, ..s_fleche) + line("chan.east", "rec.west", mark: pointe_pleine, ..s_fleche) + line("rec.east", "dest.west", mark: pointe_pleine, ..s_fleche) + line("bruit.south", "chan.north", mark: pointe_pleine, ..s_fleche) + + // Annotation + let note-style = (size: 0.75em, style: "italic") + content((espacement * 0.5, -0.5), text(..note-style)[Message]) + content((espacement * 1.5, -0.5), text(..note-style)[Signal]) + content((espacement * 2.5, -0.5), text(..note-style)[Signal]) + content((espacement * 3.5, -0.5), text(..note-style)[Message]) + }) + ] + #v(5cm) + image de mon drone FPV, 5G +] + +#myslide("Problématique")[ + #align(center)[ + Comment utiliser les codes LDPC pour garantir la fiabilité d'une transmission en présence de + bruit ? + ] +] + +#myslide("Définition : Codes Linéaires")[ + $cal(C)$ de paramètres $(n, k) in NN^2$, ($n > k$) + + // $Phi : & FF_2^k --> FF_2^n \ + // & x arrow.long.bar Phi(x) = c$ + // $Phi : #box(baseline: 1.6em)[$ cases( + // delim: "|", + // bb(F)_2^k & arrow bb(F)_2^n, + // x & arrow.long.bar Phi(x) + // ) $]$ + + // $Phi$ linéaire et injective + + Espace des messages : $FF_2^k$\ + Espace des mots transmis :$FF_2^n$ + + Redondance de $n - k$ bits + + Rendement $display(R = k / n)$ + + #align(center)[ + #cetz.canvas(length: 1.5cm, { + import cetz.draw: * + + // Styles + let style-pointille = (stroke: (paint: black, thickness: 1.2pt, dash: "dashed")) + let style-point = (fill: black, stroke: none) + let rayon-point = 0.08 + let pointe-fleche = (end: "stealth", fill: black) + + let m = ( + p00: (-4, 0), + p01: (-2, 0), + p11: (-2, -2), + p10: (-4, -2), + ) + + // Arêtes pointillés + line(m.p00, m.p01, m.p11, m.p10, close: true, ..style-pointille) + + // Points sur les sommets + circle(m.p00, radius: rayon-point, ..style-point) + circle(m.p01, radius: rayon-point, ..style-point) + circle(m.p11, radius: rayon-point, ..style-point) + circle(m.p10, radius: rayon-point, ..style-point) + + // Étiquettes + content(m.p00, [00], anchor: "south-east", padding: .2) + content(m.p01, [01], anchor: "south-west", padding: .2) + content(m.p11, [11], anchor: "north-west", padding: .2) + content(m.p10, [10], anchor: "north-east", padding: .2) + + content((-3, -3), [$FF_2^2$]) + + line((-1.2, -1), (1.2, -1), mark: pointe-fleche, stroke: 1.5pt + black) + content((0, -0.6), [*Plongement*]) + + // Sommets face arrière + let cb = (p000: (2.5, 0), p001: (4.5, 0), p011: (4.5, -2), p010: (2.5, -2)) + // Sommets face avant (décalés) + let cf = (p100: (3.5, 1), p101: (5.5, 1), p111: (5.5, -1), p110: (3.5, -1)) + + // Arêtes pointillés du cube + line(cb.p000, cb.p001, cb.p011, cb.p010, close: true, ..style-pointille) // Face arrière + line(cf.p100, cf.p101, cf.p111, cf.p110, close: true, ..style-pointille) // Face avant + line(cb.p000, cf.p100, ..style-pointille) // Liaisons + line(cb.p001, cf.p101, ..style-pointille) + line(cb.p011, cf.p111, ..style-pointille) + line(cb.p010, cf.p110, ..style-pointille) + + // Points sur les sommets du cube + circle(cb.p000, radius: rayon-point, ..style-point) + circle(cb.p001, radius: rayon-point, ..style-point) + circle(cb.p011, radius: rayon-point, ..style-point) + circle(cb.p010, radius: rayon-point, ..style-point) + circle(cf.p100, radius: rayon-point, ..style-point) + circle(cf.p101, radius: rayon-point, ..style-point) + circle(cf.p111, radius: rayon-point, ..style-point) + circle(cf.p110, radius: rayon-point, ..style-point) + + // Étiquettes du cube + content(cb.p000, [000], anchor: "south-east", padding: .2) + content(cb.p001, [001], anchor: "south-west", padding: .2) + content(cb.p011, [011], anchor: "north-west", padding: .2) + content(cb.p010, [010], anchor: "north-east", padding: .2) + content(cf.p100, [100], anchor: "south-east", padding: .2) + content(cf.p101, [101], anchor: "south-west", padding: .2) + content(cf.p111, [111], anchor: "north-west", padding: .2) + content(cf.p110, [110], anchor: "north-east", padding: .2) + + content((4, -3), [$FF_2^3$]) + }) + ] + +] + +// #myslide("Définition : Codes Linéaires")[ +// // Matrice génératrice : $op("Mat")_cal(B)(Phi) = G in cal(M)_(k, n)(FF_2)$, $op("rg")(G) = k$ +// +// // $cal(C) = op("Im")(Phi) = {x G | x in FF_2^k}$ +// +// Forme bilinéaire symétrique : +// $forall x, y in FF_2^n, space (x|y)_(FF_2^n) = display(sum_(i=0)^n x_i y_i)$ +// +// Encodage : +// $Phi : #box(baseline: 1.6em)[$ cases( +// delim: "|", +// FF_2^k & -> FF_2^n, +// x & arrow.long.bar Phi(x) +// ) $]$ +// +// $Phi in cal(L)(FF_2^k, FF_2^n)$, $op("rg")(Phi) = k$, $Phi$ injective +// +// $cal(C) = op("Im")(Phi)$ +// +// $G = op("Mat")_cal(B)(Phi) in cal(M)_(k,n)(FF_2)$ +// Pour $x in FF_2^k, Phi(x) = x G$ +// +// $Phi$ admet un unique adjoint $Phi^*$, +// $ +// forall x in FF_2^k, forall y in FF_2^n, (Phi(x) | y)_(FF_2^n) = (x, Phi(y)^*)_(FF_2^k) +// $ +// de plus $cal(C)^bot = op("Im")(Phi)^bot = ker(Phi^*)$ et $dim(cal(C)^bot) = n - k$ +// +// Equation du code dual : $y in cal(C^bot) <==> Phi(y)^* = 0 <==> y G^T = 0$ +// +// De plus $display((cal(C)^bot)^bot) = cal(C)$ (car non dégénérée) +// +// +// ] +// +// #myslide("Définition : Codes Linéaires")[ +// +// $(h_1, ..., h_(n-k))$ base de $cal(C)^bot$ +// Définisson $H in cal(M)_(n-k, n)(FF_2)$ avec les $h_i$ comme lignes +// $H$ : matrice de contrôle de parité +// +// $forall c in FF_2^n, c in cal(C) <==> c H^T = 0$ +// +// $S : #box(baseline: 1.6em)[$ cases( +// delim: "|", +// FF_2^n & -> FF_2^(n-k), +// y & arrow.long.bar y H^T +// ) $]$ +// et $ker(S) = cal(C)$ ... +// +// ] + +#myslide("Définition : Codes Linéaires")[ + faire un truc plus theoriques... +] + +#myslide("Définition : Codes Linéaires")[ + - Matrice génératrice + + $G in cal(M)_(k,n)(FF_2)$ + + - Encodage : $m in FF_2^k, c = m dot.o G$ + + - Forme systématique : $G = [I_k | P]$ avec $P$ matrice de parité + + - Matrice de contrôle de parité $H = [- P^top | I_(n-k)]$ + $c in FF_2^n$ est un mot de code valide $<==>$ $c^top dot.o H = 0$ + + De plus $G dot.o H^T = 0$ +] + +#myslide("Définition : Codes Linéaires")[ + Reception de $r = c + e$ avec $c in cal(C), e in FF_2^n$ + $r^top dot.o H = s$ le syndrome + + $(c + e)^top H = c^top H + e^top H = e^top H$ +] + +#myslide("Redondance et limite théorique")[ + Graphique waterfall avec n = 100 et n = 64800 avec limite de Shannon, $display(R = k /n) < 1$, $m = n - k$ + + Bande passante... + + Il existe $C$ pour un canal tel que pour $R < C$ on peut atteindre une probabilité d'erreur nulle. + $=>$ gros bloc (moyenne du bruit aléatoire) +] + +#myslide("Décodage par Maximum de Vraisemblance")[ + Trouver le message envoyer le + probable sachant le message recu : NP-COMPLET (Max) + Decodage par syndrome d'une code lin'aire général est NP-Complet + Complexité $O(2^k)$ +] + +#myslide("LDPC")[ + Matrice $H$ clairsemée(low density) donc complexité mointre, pas de produit de matrice mais algorithme itératif efficace quasi linéaire + Graphique d'un H très grand clairesemée avec plein de 0, généré en rust par exemple où les 1 sont des points noir et le reste du blanc + Défniition avec (w_r,w_c) +] + +#myslide("Graphe de Tanner")[ + Il existe un isomorphisme entre H et le Graphe de Tanner + Graphe de tanner (cetz) + Contrainte de somme nulle +] + +#myslide("Encodage")[ +] + +#myslide("Décodage")[ + Canal d'étude (AWGN) analogique, tension etc, ce qui se passe en radio dans les cables etc +] + +#myslide("Hard decoding")[ + Nul (0 ou 1) + transition perte d'information +] + +#myslide("Implementation")[ + +] + +#myslide("Soft decoding")[ + belief propagation, log ou virgule fixe, explication resultat meilleur +] + +#myslide("Implementation")[ + +] + +#myslide("Test")[ + Irl hackrf, test de diff de debit avec des paquets +] + +#myslide("Image")[ + Test de transmission d'image avec différent ldpc non opti et opti (le H) +] + +#myslide("Annexe")[ + Annexe +] + +#myslide("Théorie deriere la définition des codes linaires")[ + Poser les notations algebriques +] +#myslide("Unicité de l'adjoint")[ + Unicité de l'adjoint pour une forme bilinéaire symétrique non dégénérée. +] diff --git a/presentation.typst b/presentation.typst deleted file mode 100644 index e69de29..0000000