avancée++

This commit is contained in:
2026-05-07 11:41:46 +02:00
parent 1b26a0fb57
commit 706061e9b2
3 changed files with 7217 additions and 4239 deletions

File diff suppressed because it is too large Load Diff

10133
main.pdf

File diff suppressed because it is too large Load Diff

415
main.typ
View File

@ -35,17 +35,21 @@
#v(1fr)
]
#myslide("Plan")[
#grid(
columns: (auto, 1fr),
align: horizon,
place(center + horizon, dx: 11.8cm, dy: 0.7cm)[#decor_matrice_etoilee()],
design_plan((
[Introduction], [Codes linéaires], [LDPC],
[Codage], [Décodage], [Analyse],
))
)
]
#myslide("Plan")[
#grid(
columns: (auto, 1fr),
align: horizon,
place(center + horizon, dx: 11.8cm, dy: 0.7cm)[#decor_matrice_etoilee()],
design_plan((
[Introduction],
[Codes linéaires],
[LDPC],
[Codage],
[Décodage],
[Analyse],
)),
)
]
#myslide("Introduction : Communication Numérique")[
#place(center + horizon, dy: 8cm)[
@ -249,40 +253,40 @@
#let colp = orange
#place(dx: 0cm, dy: 2.0cm)[
#set text(size: 1.1em)
Enfin
#set text(size: 1.1em)
Enfin
$
H = #math.mat(
(text(fill: colp)[1], text(fill: colp)[0], 1, 0, 0),
(text(fill: colp)[1], text(fill: colp)[1], 0, 1, 0),
(text(fill: colp)[0], text(fill: colp)[1], 0, 0, 1),
augment: 2,
)
$
$
H = #math.mat(
(text(fill: colp)[1], text(fill: colp)[0], 1, 0, 0),
(text(fill: colp)[1], text(fill: colp)[1], 0, 1, 0),
(text(fill: colp)[0], text(fill: colp)[1], 0, 0, 1),
augment: 2,
)
$
#v(0.8em)
#v(0.8em)
Vérification du mot de code $display(c = mat(#text(fill: colu)[1], #text(fill: colu)[1], #text(fill: colp)[1], #text(fill: colp)[0], #text(fill: colp)[1]))$
Vérification du mot de code $display(c = mat(#text(fill: colu)[1], #text(fill: colu)[1], #text(fill: colp)[1], #text(fill: colp)[0], #text(fill: colp)[1]))$
#v(0.8em)
#v(0.8em)
$
H c^top = mat(
1, 0, 1, 0, 0;
1, 1, 0, 1, 0;
0, 1, 0, 0, 1
) mat(#text(fill: colu)[1], #text(fill: colu)[1], #text(fill: colp)[1], #text(fill: colp)[0], #text(fill: colp)[1])^top
= mat(
1 plus.o 0 plus.o 1 plus.o 0 plus.o 0;
1 plus.o 1 plus.o 0 plus.o 0 plus.o 0;
0 plus.o 1 plus.o 0 plus.o 0 plus.o 1
)
= mat(0; 0; 0)
$
$
H c^top = mat(
1, 0, 1, 0, 0;
1, 1, 0, 1, 0;
0, 1, 0, 0, 1
) mat(#text(fill: colu)[1], #text(fill: colu)[1], #text(fill: colp)[1], #text(fill: colp)[0], #text(fill: colp)[1])^top
= mat(
1 plus.o 0 plus.o 1 plus.o 0 plus.o 0;
1 plus.o 1 plus.o 0 plus.o 0 plus.o 0;
0 plus.o 1 plus.o 0 plus.o 0 plus.o 1
)
= mat(0; 0; 0)
$
]
]
]
]
// A REMPLACER AVEC DE VRAI DONNE SUR DE VRAI CODE LDPC ET HAMMING PAR EXEMPLE
#myslide("Approcher la Limite de Shannon")[
@ -300,57 +304,57 @@
#myslide("Le Mur de la Complexité")[
#set text(size: 19pt)
#definition(titre: [Décodage par Maximum de Vraisemblance (MDL)], accent: black)[
Chercher le mot de code $bold(c) in cal(C)$ le plus probable sachant $bold(r)$ reçu :
$ hat(bold(c)) = arg min_(bold(c) in cal(C)) d_H (bold(r), bold(c)) $
]
#definition(titre: [Décodage par Maximum de Vraisemblance (MDL)], accent: black)[
Chercher le mot de code $bold(c) in cal(C)$ le plus probable sachant $bold(r)$ reçu :
$ hat(bold(c)) = arg min_(bold(c) in cal(C)) d_H (bold(r), bold(c)) $
]
- Équivalent à chercher l'erreur $bold(e)$ de poids minimal tel que $bold(H) bold(e)^top = bold(s)$.
#v(0.5em)
- Équivalent à chercher l'erreur $bold(e)$ de poids minimal tel que $bold(H) bold(e)^top = bold(s)$.
#definition(titre: "Le Problème du décodage par Syndrome")[
NP-Difficile et pour $H$ quelconque : $cal(O)(2^k)$
]
#v(0.5em)
- Pour $k=100$ bits, $2^100 approx 10^30$ opérations nécessaires.
#definition(titre: "Le Problème du décodage par Syndrome")[
NP-Difficile et pour $H$ quelconque : $cal(O)(2^k)$
]
- Pour $k=100$ bits, $2^100 approx 10^30$ opérations nécessaires.
]
#myslide("Définition des Codes LDPC")[
#definition(titre: [Formalisation des Codes LDPC Réguliers])[
Code linéaire en bloc avec une matrice de contrôle $bold(H)$ est *clairsemée*.
]
- *Poids de Colonne $w_c$*
- *Poids de Ligne $w_r$*
#v(0.5em)
#definition(titre: "Conditions de Faible Densité", accent: black)[
#set align(center)
$w_c << n - k $ #h(2cm) $w_r << n$
]
#definition(titre : "Rendement")[
$ display(R = (n - op("rg")(H)) / n >= 1 - m / n) $
]
#definition(titre: [Formalisation des Codes LDPC Réguliers])[
Code linéaire en bloc avec une matrice de contrôle $bold(H)$ est *clairsemée*.
]
#myslide([Matrice de contrôle])[
#definition(titre : [Code LDPC $(6, 3)$])[
- *Poids de Colonne $w_c$*
- *Poids de Ligne $w_r$*
#v(0.5em)
#definition(titre: "Conditions de Faible Densité", accent: black)[
#set align(center)
$w_c << n - k$ #h(2cm) $w_r << n$
]
#definition(titre: "Rendement")[
$ display(R = (n - op("rg")(H)) / n >= 1 - m / n) $
]
]
#myslide([Matrice de contrôle])[
#definition(titre: [Code LDPC $(6, 3)$])[
$m w_r = n w_c$ donc $H in cal(M)_(15, 30)(FF_2)$ et $display(R = 1 - m / n = 1/2)$
]
#v(2cm)
#place(center + horizon, dx: 0cm, dy: 7.3cm)[
#scale(140%)[#hldpc()]
#scale(140%)[#hldpc()]
]
]
#myslide("De la Matrice aux Équations de Parité")[
#set text(size: 17pt)
#set text(size: 17pt)
#let v_space = 2.83cm
@ -364,12 +368,14 @@
[
// #set math.mat(gap: 24.5pt)
#move(dy: 13.8pt)[
$ underbrace(
mat(r_0; r_1;#v(v_space);dots.v; r_29; delim: "["),
#text()[Mot reçu] r space in space FF_2^30
) $
]
]
$
underbrace(
mat(r_0; r_1; #v(v_space);dots.v; r_29; delim: "["),
#text()[Mot reçu] r space in space FF_2^30
)
$
]
],
)
]
]
@ -387,7 +393,7 @@
#set text(size: 1em)
#text(fill: orange)[$ f_0 : r_7 plus.o r_10 plus.o r_15 plus.o r_22 plus.o r_24 plus.o r_29 = 0 $]
]
#v(0.3cm)
#text(size: 1.1em)[- Si $f_j = 1$, un nombre impair de bits a été inversé par le canal.]
]
@ -395,34 +401,34 @@
#myslide("L'Entrelacement des Contraintes")[
#set text(size: 17pt)
#align(center)[
#move(dx: -1.2cm)[
#scale(115%)[#hldpc_dual(row1: 0, row2: 14)]
#align(center)[
#move(dx: -1.2cm)[
#scale(115%)[#hldpc_dual(row1: 0, row2: 14)]
]
]
]
#v(1cm)
#set text(size: 1.1em)
- Chaque bit $r_i$ participe à $w_c = 3$ équations distinctes
#set text(size: 1.1em)
- Chaque bit $r_i$ participe à $w_c = 3$ équations distinctes
#v(1cm)
// --- Étage 2 : Système et Décision ---
#set align(center + horizon)
#scale(115%)[
#block(fill: gray.lighten(95%), inset: 10pt, stroke: 0.5pt + gray, radius: 4pt)[
$ cases(
#block(fill: gray.lighten(95%), inset: 10pt, stroke: 0.5pt + gray, radius: 4pt)[
$
cases(
#text(fill: orange)[$r_7 plus.o r_10 plus.o r_15 plus.o r_22 plus.o bold(r_24) plus.o r_29 &= 0$],
#h(4.5cm) #text(size : 20pt)[$bold(dots.v)$],
#h(4.5cm) #text(size: 20pt)[$bold(dots.v)$],
#text(fill: blue)[$r_1 plus.o r_3 plus.o r_12 plus.o bold(r_24) plus.o r_25 plus.o r_28 &= 0$]
) $
]
)
$
]
]
#v(1cm)
#v(1cm)
#set align(left)
#set text(size: 1.1em)
@ -489,4 +495,229 @@
]
#myslide("Graphe de Tanner : Définition")[
#set text(size: 1em)
#definition(titre: [Graphe de Tanner $cal(G)(bold(H))$])[
#set text(size: 0.9em)
Graphe bipartite $cal(G) = (#text(fill: blue)[$V$] union.sq #text(fill: orange)[$C$], E)$
:
#v(4pt)
$ (#text(fill: blue)[$v_j$], #text(fill: orange)[$c_i$]) in E space <==> space H_(i,j) = 1 $
]
#v(0.4em)
#set text(size: 1.1em)
#grid(
columns: (1.4fr, 1fr),
gutter: 1em,
[- $#text(fill: blue)[$V$] = {#text(fill: blue)[$v_0$], dots, #text(fill: blue)[$v_(n-1)$]}$ nœuds de *variable*],
[- $|E| = n dot #text(fill: blue)[$w_c$] = m dot #text(fill: orange)[$w_r$]$],
[
- $#text(fill: orange)[$C$] = {#text(fill: orange)[$c_0$], dots, #text(fill: orange)[$c_(m-1)$]}$ nœuds de *contrôle*
],
[- $H tilde.equiv cal(G)$],
[- $deg(#text(fill: blue)[$v_j$]) = #text(fill: blue)[$w_c$]$],
[- $deg(#text(fill: orange)[$c_i$]) = #text(fill: orange)[$w_r$]$],
)
#align(center)[
#scale(115%)[
#tanner_illustration()
]
#text(size: 0.8em, style: "italic", fill: gray.darken(20%))[
Exemple $n=4, space m=2$
]
]
]
#myslide("Construction du Graphe : Les Nœuds")[
#v(1.2em)
#align(center)[
#scale(100%)[
// #h_mini_tanner()
#grid(
columns: (1fr, 1fr),
gutter: 1em,
[#hldpc_dynamic(hl_cols: range(30), show_labels: false, h_show: true)],
[#hldpc_dynamic(hl_rows: range(15), show_labels: false, h_show: false)],
)
]
]
#v(3.5em)
#align(center)[
#scale(180%)[
#tanner_canvas(colored: false)
]
]
// #v(2.5em)
// #[
// #set text(size: 1.05em)
// - Chaque *colonne* $j$ de $bold(H)$ $arrow$ nœud de variable #text(fill: blue, weight: "bold")[$v_j in V$] \ #text(fill: blue)[$n = 30$] nœuds, représentés par des *cercles* ○
// - Chaque *ligne* $i$ de $bold(H)$ $arrow$ nœud de contrôle #text(fill: orange, weight: "bold")[$c_i in C$] \ #text(fill: orange)[$m = 15$] nœuds, représentés par des *carrés* □
// - Les arêtes seront déterminées par les $1$ de $bold(H)$ — étapes suivantes
// ]
]
#myslide("Construction du Graphe : Nœud de Contrôle")[
#v(1.2em)
#align(center)[
#move(dx: 12.6pt, dy: -1.3pt)[
#scale(100%)[
#hldpc_dynamic(hl_rows: (0,), show_labels: true, h_show: true)
]
]
]
#v(3.5em)
#align(center)[
#move(dx: 2.7pt, dy: -13.8pt)[
#scale(180%)[
#tanner_canvas(hl_row: 0)
]
]
]
// #v(0.4em)
// #[
// #set text(size: 1.05em)
// - Ligne #text(fill: orange, weight: "bold")[0] de $bold(H)$ : $bold(H)_(0,j) = 1$ pour $j in {7, 10, 15, 22, 24, 29}$
// - #text(fill: orange)[$c_0$] est relié à #text(fill: orange)[$v_7, v_10, v_15, v_22, v_24, v_29$] — chaque 1 crée une arête
// - $deg(c_0) = 6 = w_r$ — $c_0$ porte l'équation : #text(fill: orange)[$f_0 : r_7 plus.o r_10 plus.o r_15 plus.o r_22 plus.o r_24 plus.o r_29 = 0$]
// ]
]
#myslide("Construction du Graphe : Nœud de Variable")[
#v(1.2em)
#align(center)[
#scale(100%)[
#hldpc_dynamic(hl_cols: (10,), show_labels: true, h_show: true)
]
]
#v(3.5em)
#align(center)[
#move(dx: -0pt, dy: -39pt)[
#scale(180%)[
#tanner_canvas(hl_col: 10)
]
]
]
// #v(0.15em)
// #align(center)[
// #grid(
// columns: (auto, auto),
// column-gutter: 0.7cm,
// align: horizon,
// [#h_mini_tanner(hl_col: 10)], [#tanner_canvas(hl_col: 10)],
// )
// ]
// #[
// #set text(size: 1.05em)
// - Colonne #text(fill: blue, weight: "bold")[10] de $bold(H)$ : $bold(H)_(i,10) = 1$ pour $i in {0, 5, 11}$
// - #text(fill: blue)[$v_10$] est relié aux nœuds de contrôle #text(fill: blue)[$c_0, c_5, c_11$] — participe à *3 équations* de parité
// - $deg(v_10) = 3 = w_c$ — chaque bit est surveillé par $w_c$ contraintes indépendantes
// ]
]
#myslide("Graphe de Tanner Final")[
#move(dy: 4.5cm)[
#align(center + horizon)[
#tanner_canvas(scale: 0.91cm, show_all: true, colored: true, v_c_show: false)
]
#align(center)[
#grid(
columns: (1fr, 1fr),
gutter: 0.45cm,
block(
fill: blue.lighten(88%),
stroke: 0.5pt + blue.lighten(40%),
radius: 6pt,
inset: (x: 10pt, y: 8pt),
width: 100%,
)[
#place(dx: 47pt, dy: -0pt)[#scale(110%)[#icon_var]] #text(fill: blue, weight: "bold")[ Nœuds de variable] \
// $n = 30 quad deg = w_c = 3$
],
block(
fill: orange.lighten(88%),
stroke: 0.5pt + orange.lighten(40%),
radius: 6pt,
inset: (x: 10pt, y: 8pt),
width: 100%,
)[
#place(dx: 47pt, dy: -0pt)[#scale(110%)[#icon_chk]] #text(
fill: orange,
weight: "bold",
)[ Nœuds de contrôle] \
// $m = 15 quad deg = w_r = 6$
],
)
]
]
]
// HARD DECISION
// #myslide("Graphe de Tanner : Utilité")[
// #grid(
// columns: (1.55fr, 1fr),
// column-gutter: 0.5cm,
// align: top,
// [
// #definition(titre: "Support du Passage de Messages")[
// Le graphe de Tanner est le *cadre naturel* des algorithmes de décodage itératifs — il rend la structure du code *explicite et locale*
// ]
//
// #v(0.45em)
//
// #[
// #set text(size: 1.05em)
// - *Localité* : chaque nœud n'opère qu'avec ses *voisins directs*
//
// - *Itérations — à chaque tour :*
// #pad(left: 0.9em)[
// #text(fill: blue, weight: "bold")[V → C :] $v_j$ envoie son estimation (LLR) aux $c_i$ voisins \
// #text(fill: orange, weight: "bold")[C → V :] $c_i$ renvoie une correction aux $v_j$ voisins
// ]
//
// - *Convergence* vers le mot de code le plus vraisemblable
//
// - *Complexité* : $cal(O)(n dot w_c)$ par itération \ vs $cal(O)(2^k)$ pour le MDL — gain *exponentiel*
// ]
// ],
// [
// #v(0.6em)
// #align(center)[
// #bp_diagram()
// #v(0.5em)
// #set text(size: 0.79em)
// #stack(
// dir: ttb,
// spacing: 0.25em,
// [#box(width: 1.3em, height: 2pt, fill: blue)
// #h(0.3em) #text(fill: blue, weight: "bold")[$mu_(j arrow i)$ : V → C] (LLR)],
// [#box(width: 1.3em, height: 2pt, fill: orange)
// #h(0.3em) #text(fill: orange, weight: "bold")[$nu_(i arrow j)$ : C → V] (correction)],
// )
// ]
// ],
// )
// ]