Codage Canal

Dans ce chapitre, nous prĂ©sentons les bases du codage de canal, c’est-Ă -dire les codes correcteurs d’erreur (FEC pour Forward Error Correction en anglais), la limite de Shannon, les codes de Hamming, les turbo-codes et les codes LDPC. Le codage de canal est un domaine Ă©norme dans les communications sans fil, et est une branche de la « thĂ©orie de l’information », qui est l’étude de la quantification, du stockage et de la communication de l’information.

Pourquoi nous avons besoin du codage des canaux

Comme nous l’avons appris dans le chapitre le Bruit et les dB, les canaux sans fil sont bruyants, et nos symboles numĂ©riques n’atteindront pas parfaitement le rĂ©cepteur. Si vous avez suivi un cours des rĂ©seaux, vous connaissez peut-ĂȘtre dĂ©jĂ  les contrĂŽles de redondance cyclique (CRC pour cyclic redundancy checks en anglais), qui dĂ©tectent les erreurs au niveau de la rĂ©ception. L’objectif du codage de canal est de dĂ©tecter et de corriger les erreurs au niveau du rĂ©cepteur. Si nous laissons une certaine marge d’erreur, nous pouvons transmettre avec un systĂšme de modulation d’ordre supĂ©rieur par exemple, sans que la liaison soit rompue. À titre d’exemple visuel, considĂ©rez les constellations suivantes montrant une QPSK (Ă  gauche) et une 16QAM (Ă  droite) avec la mĂȘme quantitĂ© de bruit. La QPSK fournit 2 bits par symbole, tandis que la 16QAM offre un dĂ©bit deux fois plus Ă©levĂ© avec 4 bits par symbole. Mais notez comment dans la constellation QPSK, les symboles ont tendance Ă  ne pas dĂ©passe pas les frontiĂšres de dĂ©cision des symboles, ou l’axe des x et l’axe des y, ce qui signifie que les symboles seront reçus correctement. En revanche, dans le tracĂ© de la constellation 16QAM, il y a un chevauchement des groupes de points et, par consĂ©quent, de nombreux symboles seront mal reçus.

_images/qpsk_vs_16qam.png

Un Ă©chec du CRC entraĂźne gĂ©nĂ©ralement une retransmission, du moins lorsqu’on utilise un protocole comme TCP. Si Alice envoie un message Ă  Bob, il est prĂ©fĂ©rable que Bob n’ait pas Ă  renvoyer un message Ă  Alice pour demander Ă  nouveau l’information. Le but du codage de canal est de transmettre des informations redondantes. La redondance est une sĂ©curitĂ© qui rĂ©duit le nombre de paquets erronĂ©s, de retransmissions ou de donnĂ©es perdues.

Nous avons vu pourquoi nous avons besoin du codage de canal, voyons donc oĂč il intervient dans la chaĂźne de transmission-rĂ©ception :

_images/tx_rx_chain.svg

Observez qu’il y a plusieurs Ă©tapes de codage dans la chaĂźne d’émission-rĂ©ception. Le codage source, notre premiĂšre Ă©tape, n’est pas la mĂȘme que le codage du canal; le codagesource a pour but de compresser les donnĂ©es Ă  transmettre autant que possible, tout comme lorsque vous zippez des fichiers pour rĂ©duire l’espace occupĂ©. En d’autres termes, la sortie du bloc de codage de la source doit ĂȘtre plus petite que l’entrĂ©e des donnĂ©es, mais la sortie du codage du canal sera plus grande que son entrĂ©e car la redondance est ajoutĂ©e.

Types de Codes

Pour effectuer le codage du canal, nous utilisons un « code de correction d’erreur ». Ce code nous dit, Ă©tant donnĂ© les bits que nous devons transmettre, quels sont les bits que nous transmettons rĂ©ellement? Le code le plus Ă©lĂ©mentaire est appelĂ© « code de rĂ©pĂ©tition », et il consiste Ă  rĂ©pĂ©ter simplement un bit N fois de suite. Pour le code de rĂ©pĂ©tition-3, on transmet chaque bit trois fois :

  • 0 000

  • 1 111

Le message 10010110 est transmis sous la forme 111000000111000111111000 aprĂšs codage du canal.

Certains codes fonctionnent sur des « blocs » de bits d’entrĂ©e, tandis que d’autres utilisent une approche par flux continu. Les codes qui fonctionnent sur des blocs, c’est-Ă -dire des donnĂ©es d’une longueur dĂ©finie, sont appelĂ©s « codes blocs », tandis que les codes qui fonctionnent sur un flux de bits, oĂč la longueur des donnĂ©es est arbitraire, sont appelĂ©s « codes convolutifs ». Ce sont les deux principaux types de codes. Notre code de rĂ©pĂ©tition-3 est un code de bloc oĂč chaque bloc est de trois bits.

Soit dit en passant, ces codes de correction d’erreurs ne sont pas uniquement utilisĂ©s dans le codage des canaux pour les liaisons sans fil. Vous avez dĂ©jĂ  stockĂ© des informations sur un disque dur ou un SSD et vous vous ĂȘtes demandĂ© comment il n’y avait jamais d’erreurs de bits lors de la relecture des informations? L’écriture, puis la lecture, de la mĂ©moire est similaire Ă  un systĂšme de communication. Les contrĂŽleurs de disques durs et de disques SSD intĂšgrent la correction d’erreurs. Elle est transparente pour le systĂšme d’exploitation et peut ĂȘtre propriĂ©taire puisqu’elle est intĂ©grĂ©e au disque dur/SSD. Pour les supports portables comme les CD, la correction d’erreurs doit ĂȘtre normalisĂ©e. Les codes Reed-Solomon Ă©taient courants dans les CD-ROM.

Rendement de Code

Toute correction d’erreur comprend une forme de redondance. Cela signifie que si nous voulons transmettre 100 bits d’information, nous devrons en fait envoyer plus que 100 bits. Le « dĂ©bit de code » est le rapport entre le nombre de bits d’information et le nombre total de bits envoyĂ©s (c’est-Ă -dire les bits d’information plus les bits de redondance). Pour en revenir Ă  l’exemple du codage par rĂ©pĂ©tition-3, si je dispose de 100 bits d’information, nous pouvons dĂ©terminer ce qui suit :

  • 300 bits sont envoyĂ©s

  • Seuls 100 bits reprĂ©sentent une information

  • Taux de codage = 100/300 = 1/3

Le taux de codage sera toujours inférieur à 1, car il existe un compromis entre la redondance et le débit. Un taux de codage plus faible signifie plus de redondance et moins de débit.

Modulation et Codage

Dans le chapitre Modulation numĂ©rique, nous avons abordĂ© le bruit dans les schĂ©mas de modulation. Pour un SNR (rapport signal Ă  bruit) faible, vous avez besoin d’un schĂ©ma de modulation d’ordre faible (par exemple, QPSK) pour faire face au bruit, et pour un SNR Ă©levĂ©, vous pouvez utiliser une modulation comme 256QAM pour envoyer plus de bits par seconde. Il en va de mĂȘme pour le codage du canal: vous souhaitez des taux de codage plus faibles Ă  des SNR faibles, et Ă  des SNR Ă©levĂ©s, vous pouvez utiliser un taux de codage proche de 1. Les systĂšmes de communication modernes disposent d’un ensemble de schĂ©mas de modulation et de codage combinĂ©s, appelĂ©s MCS (pour modulations and coding schemes) en anglais. Chaque MCS spĂ©cifie un schĂ©ma de modulation et un schĂ©ma de codage Ă  utiliser Ă  des niveaux de SNR spĂ©cifiques.

Les communications modernes modifient de maniĂšre adaptative le MCS en temps rĂ©el en fonction des conditions du canal sans fil. Le rĂ©cepteur envoie un retour d’information sur la qualitĂ© du canal Ă  l’émetteur. Le retour d’information doit ĂȘtre partagĂ© avant que la qualitĂ© du canal sans fil ne change, ce qui peut ĂȘtre de l’ordre de la ms. Ce processus adaptatif permet d’obtenir le meilleur dĂ©bit de communication possible et est utilisĂ© par les technologies modernes telles que LTE, 5G et WiFi. Ci-dessous, une visualisation d’une tour cellulaire changeant de MCS pendant la transmission en fonction de la distance entre l’utilisateur et la cellule.

_images/adaptive_mcs.svg

Lorsque vous utilisez un MCS adaptatif, si vous tracez le dĂ©bit en fonction du SNR, vous obtenez une courbe en forme d’escalier comme le graphique ci-dessous. Les protocoles comme LTE ont souvent un tableau indiquant quel MCS doit ĂȘtre utilisĂ© Ă  quel SNR.

_images/adaptive_mcs2.svg

Code de Hamming

Examinons un simple code correcteur d’erreurs. Le code de Hamming a Ă©tĂ© le premier code non trivial dĂ©veloppĂ©. À la fin des annĂ©es 1940, Richard Hamming travaillait aux Bell Labs et utilisait un ordinateur Ă©lectromĂ©canique qui utilisait des bandes de papier perforĂ©. Lorsque des erreurs Ă©taient dĂ©tectĂ©es dans la machine, celle-ci s’arrĂȘtait et les opĂ©rateurs devaient les corriger. Hamming a Ă©tĂ© frustrĂ© de devoir recommencer ses programmes Ă  partir de zĂ©ro Ă  cause des erreurs dĂ©tectĂ©es. Il s’est dit : « Bon sang, si la machine peut dĂ©tecter une erreur, pourquoi ne peut-elle pas localiser la position de l’erreur et la corriger? ». Il a passĂ© les annĂ©es suivantes Ă  dĂ©velopper le code de Hamming pour que l’ordinateur puisse faire exactement cela.

Dans les codes de Hamming, des bits supplĂ©mentaires, appelĂ©s bits de paritĂ© ou bits de contrĂŽle, sont ajoutĂ©s aux informations pour assurer la redondance. Toutes les positions binaires qui sont des puissances de deux sont des bits de paritĂ©: 1, 2, 4, 8, etc. Les autres positions binaires sont destinĂ©es Ă  l’information. Le tableau situĂ© sous ce paragraphe met en Ă©vidence les bits de paritĂ© en vert. Chaque bit de paritĂ© « couvre » tous les bits oĂč le ET binaire de la paritĂ© et de la position du bit est diffĂ©rent de zĂ©ro, marquĂ© d’un X rouge ci-dessous. Si nous voulons utiliser un bit de donnĂ©es, nous avons besoin des bits de paritĂ© qui le couvrent. Pour pouvoir aller jusqu’au bit de donnĂ©es d9, nous avons besoin du bit de paritĂ© p8 et de tous les bits de paritĂ© qui le prĂ©cĂšdent. Cette table nous indique donc le nombre de bits de paritĂ© dont nous avons besoin pour un certain nombre de bits. Ce schĂ©ma se poursuit indĂ©finiment.

_images/hamming.svg

Les codes de Hamming sont des codes de bloc, ils fonctionnent donc sur N bits de donnĂ©es Ă  la fois. Ainsi, avec trois bits de paritĂ©, nous pouvons opĂ©rer sur des blocs de quatre bits de donnĂ©es Ă  la fois. Nous reprĂ©sentons ce schĂ©ma de codage d’erreur par Hamming(7,4), oĂč le premier argument est le nombre total de bits transmis et le second argument est le nombre de bits de donnĂ©es.

_images/hamming2.svg

Voici trois propriétés importantes des codes de Hamming :

  • Le nombre minimal de changements de bits nĂ©cessaires pour passer d’un mot de code quelconque Ă  un autre mot de code quelconque est de trois.

  • Il peut corriger les erreurs d’un bit

  • Il peut dĂ©tecter mais pas corriger les erreurs de deux bits

D’un point de vue algorithmique, le processus de codage peut ĂȘtre rĂ©alisĂ© Ă  l’aide d’une simple multiplication matricielle, en utilisant ce que l’on appelle la « matrice gĂ©nĂ©ratrice ». Dans l’exemple ci-dessous, le vecteur 1011 reprĂ©sente les donnĂ©es Ă  coder, c’est-Ă -dire les informations que nous voulons envoyer au rĂ©cepteur. La matrice 2D est la matrice gĂ©nĂ©ratrice, et elle dĂ©finit le schĂ©ma de codage. Le rĂ©sultat de la multiplication fournit le mot de code Ă  transmettre.

_images/hamming3.png

L’intĂ©rĂȘt de se plonger dans les codes de Hamming Ă©tait de donner un aperçu du fonctionnement du codage des erreurs. Les codes en bloc ont tendance Ă  suivre ce type de schĂ©ma. Les codes convolutifs fonctionnent diffĂ©remment, mais nous ne nous y attarderons pas ici ; ils utilisent souvent un dĂ©codage de type Trellis, qui peut ĂȘtre reprĂ©sentĂ© par un diagramme ressemblant Ă  celui-ci:

_images/trellis.svg

DĂ©codage souple ou dur

Rappelons qu’au niveau du rĂ©cepteur, la dĂ©modulation intervient avant le dĂ©codage. Le dĂ©modulateur peut nous dire quel symbole a Ă©tĂ© envoyĂ©, ou il peut nous donner la valeur « souple ». Pour la BPSK, au lieu de nous dire 1 ou 0, le dĂ©modulateur peut dire 0.3423 ou -1.1234, quelle que soit la valeur « souple » du symbole. En gĂ©nĂ©ral, le dĂ©codage est conçu pour utiliser des valeurs dures ou souples.

  • DĂ©codage Ă  dĂ©cision souple - utilise les valeurs souples.

  • DĂ©codage Ă  dĂ©cision dure - utilise uniquement les 1 et les 0.

Les codes souples sont plus robustes parce que vous utilisez toutes les informations Ă  votre disposition, mais ils sont aussi beaucoup plus compliquĂ©s Ă  mettre en Ɠuvre. Les codes de Hamming dont nous avons parlĂ© utilisaient des dĂ©cisions dures, alors que les codes convolutifs ont tendance Ă  utiliser des dĂ©cisions souples.

Limit de Shannon

La limite de Shannon ou capacitĂ© de Shannon est un incroyable Ă©lĂ©ment de thĂ©orie qui nous indique combien de bits par seconde d’informations sans erreur nous pouvons envoyer :

\[C = B \cdot log_2 \left( 1 + \frac{S}{N} \right)\]
  • C - CapacitĂ© du canal [bits/sec]

  • B - Largeur de bande du canal [Hz].

  • S - Puissance moyenne du signal reçu [watts].

  • N - Puissance moyenne du bruit [watts].

Cette Ă©quation reprĂ©sente ce que tout schĂ©ma MCS peut faire de mieux lorsqu’il fonctionne Ă  un rapport signal/bruit suffisamment Ă©levĂ© pour ĂȘtre exempt d’erreurs. Il est plus logique de reprĂ©senter la limite en bits/sec/Hz, c’est-Ă -dire en bits/sec par quantitĂ© de spectre:

\[\frac{C}{B} = log_2 \left( 1 + \mathrm{SNR} \right)\]

avec SNR en termes linéaires (et non en dB). Cependant, lors de la représentation graphique, nous représentons généralement le SNR en dB pour des raisons de commodité:

_images/shannon_limit.svg

Si vous voyez ailleurs des courbes de limites de Shannon qui ont l’air un peu diffĂ©rents, ils utilisent probablement un axe x en terme « d’énergie par bit » ou \(E_b/N_0\), qui est juste une alternative au SNR.

Il pourrait aider Ă  simplifier les choses de rĂ©aliser que lorsque le SNR est assez Ă©levĂ© (par exemple, 10 dB ou plus), la limite de Shannon peut ĂȘtre approximĂ©e comme \(log_2 \left( \mathrm{SNR} \right)\), qui est approximativement \(\mathrm{SNR_{dB}}/3\) (expliquĂ© ici). Par exemple, avec un rapport signal Ă  bruit de 24 dB, vous obtenez 8 bits/seconde/Hz, donc si vous avez 1 MHz Ă  utiliser, cela reprĂ©sente 8 Mbps. Vous vous dites peut-ĂȘtre que ce n’est qu’une limite thĂ©orique, mais les communications modernes sont assez proches de cette limite, ce qui vous donne au moins une idĂ©e approximative. Vous pouvez toujours diviser ce chiffre par deux pour tenir compte de les champs additionnels dans les paquets/trames et d’un schĂ©ma MCS sous optimal.

Le dĂ©bit maximal du WiFi 802.11n fonctionnant dans la bande 2.4 GHz (qui utilise des canaux de 20 MHz de large), suivant les spĂ©cifications, est de 300 Mbps. Il est Ă©vident que vous pourriez vous asseoir juste Ă  cĂŽtĂ© de votre routeur et obtenir un rapport signal/bruit extrĂȘmement Ă©levĂ©, peut-ĂȘtre 60 dB, mais pour ĂȘtre fiable/pratique, le dĂ©bit maximal MCS (rappelez-vous la courbe en escalier ci-dessus) ne nĂ©cessitera probablement pas un rapport signal/bruit aussi Ă©levĂ©. Vous pouvez mĂȘme jeter un coup d’oeil Ă  la liste MCS pour 802.11n. 802.11n va jusqu’à 64-QAM, et combinĂ© avec le codage de canal, il nĂ©cessite un SNR autour de 25 dB selon ce tableau. Cela signifie que, mĂȘme avec un SNR de 60 dB, votre WiFi utilisera toujours la 64-QAM. Donc, Ă  25 dB, la limite de Shannon est d’environ 8.3 bits/sec/Hz, ce qui, compte tenu de 20 MHz de spectre, reprĂ©sente 166 Mbps. Cependant, si vous tenez compte de la technologie MIMO, que nous aborderons dans un prochain chapitre, vous pouvez obtenir quatre de ces flux en parallĂšle, ce qui donne 664 Mbps. En divisant ce chiffre par deux, vous obtenez un rĂ©sultat trĂšs proche de la vitesse maximale annoncĂ©e de 300 Mbps pour le WiFi 802.11n dans la bande 2.4 GHz.

La preuve de la limite de Shannon est assez folle; elle implique des calculs qui ressemblent Ă  ceci:

_images/shannon_limit_proof.png

Pour plus d’informations, voir ici.

Codes de l’état de l’art

Actuellement, les meilleurs schémas de codage de canal sont :

  1. Les turbo-codes, utilisés en 3G, 4G, et dans les vaisseaux spatiaux de la NASA.

  2. Les codes LDPC, utilisĂ©s dans la DVB-S2, le WiMAX, l’IEEE 802.11n.

Ces deux codes s’approchent de la limite de Shannon (c’est-Ă -dire qu’ils l’atteignent presque sous certains SNR). Les codes de Hamming et d’autres codes plus simples sont loin d’atteindre la limite de Shannon. Du point de vue recherche, il n’y a plus beaucoup de possibilitĂ©s d’amĂ©lioration des codes eux-mĂȘmes. La recherche actuelle se concentre davantage sur l’amĂ©lioration de l’efficacitĂ© du dĂ©codage en termes de complexitĂ© et sur l’adaptation avec un canal retour.

Les codes Ă  contrĂŽle de paritĂ© Ă  faible densitĂ© (LDPC pour Low Density Parity Check) sont une classe de codes en bloc linĂ©aires trĂšs efficaces. Ils ont Ă©tĂ© introduits pour la premiĂšre fois par Robert G. Gallager dans sa thĂšse de doctorat en 1960 au MIT. En raison de la complexitĂ© de leur mise en Ɠuvre, ils ont Ă©tĂ© ignorĂ©s jusque dans les annĂ©es 1990 ! À l’heure oĂč nous Ă©crivons ces lignes (2020), Gallager a 89 ans, est toujours en vie et a remportĂ© de nombreux prix pour ses travaux (des dĂ©cennies aprĂšs les avoir rĂ©alisĂ©s). Le code LDPC n’est pas brevetĂ© et est donc libre d’utilisation (contrairement aux turbo-codes), c’est pourquoi il a Ă©tĂ© utilisĂ© dans de nombreux protocoles ouverts.

Les turbo-codes sont basĂ©s sur les codes convolutifs. Il s’agit d’une classe de codes qui combine deux ou plusieurs codes convolutifs plus simples et un entrelaceur. La demande de brevet pour les turbo-codes a Ă©tĂ© dĂ©posĂ©e le 23 avril 1991. Les inventeurs Ă©tant français, et lorsque Qualcomm a voulu utiliser les turbo-codes dans le CDMA pour la 3G, elle a dĂ» conclure un accord de licence payante avec France TĂ©lĂ©com. Le brevet principal a expirĂ© le 29 aoĂ»t 2013.