En télécommunications , un code convolutif est un type de code correcteur d'erreurs qui génère des symboles de parité par application glissante d'une fonction polynomiale booléenne à un flux de données. Cette application glissante correspond à la « convolution » de l'encodeur sur les données, d'où le terme « codage convolutif ». La nature glissante des codes convolutifs facilite le décodage par treillis à l'aide d'un treillis invariant dans le temps. Ce type de décodage permet un décodage par décision souple au maximum de vraisemblance des codes convolutifs avec une complexité raisonnable.
L'un des principaux avantages des codes convolutifs réside dans leur capacité à effectuer un décodage économique par décision souple à maximum de vraisemblance. Ceci contraste avec les codes en blocs classiques, généralement représentés par un treillis temporel et donc typiquement décodés par décision dure. Les codes convolutifs sont souvent caractérisés par leur débit de base et la profondeur (ou mémoire) de l'encodeur.
Les codes convolutifs sont souvent décrits comme continus. Cependant, on peut également dire qu'ils ont une longueur de bloc arbitraire, plutôt que d'être continus, car la plupart des codages convolutifs en pratique sont effectués sur des blocs de données. Les codes par blocs à codage convolutif utilisent généralement une terminaison. La longueur de bloc arbitraire des codes convolutifs contraste avec celle des codes par blocs classiques , qui ont généralement des longueurs de bloc fixes, déterminées par des propriétés algébriques.
Le taux de codage d'un code convolutif est généralement modifié par perforation de symboles . Par exemple, un code convolutif avec un taux de codage « mère »
Histoire
Les codes convolutifs ont été introduits en 1955 par Peter Elias . On pensait alors qu'il était possible de les décoder avec une qualité arbitraire, au prix d'une complexité de calcul et d'un délai importants. En 1967, Andrew Viterbi a démontré que les codes convolutifs pouvaient être décodés par maximum de vraisemblance avec une complexité raisonnable grâce à des décodeurs invariants dans le temps basés sur des treillis : l' algorithme de Viterbi . D'autres algorithmes de décodage basés sur des treillis ont été développés ultérieurement, notamment l' algorithme de décodage BCJR .
Les codes convolutionnels systématiques récursifs ont été inventés par Claude Berrou vers 1991. Ces codes se sont avérés particulièrement utiles pour le traitement itératif, y compris le traitement de codes concaténés tels que les turbo codes .
En utilisant la terminologie « convolutionnelle », un code convolutionnel classique pourrait être considéré comme un filtre à réponse impulsionnelle finie (FIR), tandis qu'un code convolutionnel récursif pourrait être considéré comme un filtre à réponse impulsionnelle infinie (IIR).
Où les codes convolutifs sont utilisés

Les codes convolutifs sont largement utilisés pour assurer un transfert de données fiable dans de nombreuses applications, telles que la vidéo numérique , la radio, les communications mobiles (par exemple, les réseaux GSM, GPRS, EDGE et 3G (jusqu'à la version 7 du 3GPP) ) et les communications par satellite . Ces codes sont souvent implémentés en concaténation avec un code à décision dure, notamment le code de Reed-Solomon . Avant l' avènement des turbocodes, ces constructions étaient les plus efficaces, se rapprochant le plus de la limite de Shannon .
Encodage convolutif
Pour encoder des données par convolution, on utilise k registres mémoire , chacun contenant un bit d'entrée. Sauf indication contraire, tous les registres mémoire sont initialisés à 0. L'encodeur comporte n additionneurs modulo 2 (un additionneur modulo 2 peut être implémenté avec une simple porte XOR booléenne , dont la logique est : , ) et n polynômes générateurs , un par additionneur (voir figure ci-dessous). Un bit d'entrée m₁ est injecté dans le registre le plus à gauche. À l'aide des polynômes générateurs et des valeurs présentes dans les autres registres, l'encodeur produit n symboles . Ces symboles peuvent être transmis ou supprimés selon le débit de codage souhaité. On décale ensuite les valeurs de tous les registres vers la droite ( m₁ devient m₀ , m₀ devient m⁻₁ ) et on attend le bit d'entrée suivant. S'il ne reste plus de bits d'entrée, l'encodeur continue le décalage jusqu'à ce que tous les registres soient revenus à l'état zéro (terminaison par vidage du bit).

La figure ci-dessous représente un codeur de taux 1/3 ( m / n ) avec une longueur de contrainte ( k ) de 3. Les polynômes générateurs sont 1,1,1 et Par conséquent, les bits de sortie sont calculés (modulo 2) comme suit :
- n 1 = m 1 + m 0 + m −1
- n 2 = m 0 + m −1
- n 3 = m 1 + m −1 .
Les codes convolutifs peuvent être systématiques et non systématiques :
- répète systématiquement la structure du message avant l'encodage
- modifications non systématiques de la structure initiale
Les codes convolutionnels non systématiques sont plus répandus en raison de leur meilleure immunité au bruit. Cela est lié à la distance libre du code convolutionnel.
Une brève illustration du code convolutif systématique.
Codes récursifs et non récursifs
L'encodeur illustré ci-dessus est un encodeur non récursif . Voici un exemple d'encodeur récursif, qui admet à ce titre une structure de rétroaction :

L'encodeur présenté en exemple est systématique car les données d'entrée sont également utilisées dans les symboles de sortie (Sortie 2). Les codes dont les symboles de sortie n'incluent pas les données d'entrée sont dits non systématiques.
Les codes récursifs sont généralement systématiques, et inversement, les codes non récursifs sont généralement non systématiques. Ce n'est pas une obligation stricte, mais une pratique courante.
L'encodeur présenté en exemple sur l'image 2 est un encodeur à 8 états, car les 3 registres permettent de créer 8 états possibles (2<sup> 3</sup> ). Un décodeur correspondant utilise généralement lui aussi 8 états.
Les codes convolutionnels systématiques récursifs (RSC) sont devenus plus populaires grâce à leur utilisation dans les turbocodes. On les appelle également codes pseudo-systématiques.
Voici d'autres exemples de codes RSC et d'applications :

Utile pour l'implémentation du code LDPC et comme code constitutif interne pour les codes convolutifs concaténés en série (SCCC).

Utile pour les codes SCCC et les turbocodes multidimensionnels.

Utile comme code constitutif dans les turbocodes à faible taux d'erreur pour des applications telles que les liaisons par satellite. Convient également comme code externe SCCC.
Réponse impulsionnelle, fonction de transfert et longueur de contrainte
Un encodeur convolutif est ainsi nommé car il effectue une convolution du flux d'entrée avec les réponses impulsionnelles de l'encodeur :
où est une séquence de sortie est une réponse impulsionnelle pour la sortie désigne la convolution.
Un codeur convolutif est un système linéaire discret invariant dans le temps . Chaque sortie d'un codeur peut être décrite par sa propre fonction de transfert , étroitement liée au polynôme générateur. Une réponse impulsionnelle est associée à une fonction de transfert par la transformée en Z.
Les fonctions de transfert du premier encodeur (non récursif) sont :
Les fonctions de transfert du deuxième encodeur (récursif) sont :
Définir
où, pour toute fonction rationnelle
Alors , et la longueur de la contrainte est définie comme
Diagramme de treillis
Puisqu'un code convolutif ne fonctionne pas par blocs, mais traite un flux binaire continu, la valeur de t s'applique à un ensemble d'erreurs relativement proches les unes des autres. Autrement dit, plusieurs groupes de t erreurs peuvent généralement être corrigés lorsqu'ils sont relativement éloignés les uns des autres.
La distance libre peut être interprétée comme la longueur minimale d'une « rafale » erronée à la sortie d'un décodeur convolutif. Il est important de tenir compte du fait que les erreurs se manifestent par des « rafales » lors de la conception d'un code concaténé avec un code convolutif interne. La solution courante à ce problème consiste à entrelacer les données avant le codage convolutif, afin que le bloc externe (généralement de type Reed-Solomon ) puisse corriger la plupart des erreurs.
Décodage des codes convolutifs
Codes convolutifs perforés

Les codes convolutifs simples décodés par l'algorithme de Viterbi cèdent désormais la place aux turbocodes , une nouvelle classe de codes convolutifs courts itérés qui approchent les limites théoriques imposées par le théorème de Shannon, avec une complexité de décodage bien moindre que celle de l'algorithme de Viterbi appliqué aux longs codes convolutifs pour des performances équivalentes. La concaténation avec un code algébrique externe (par exemple, Reed-Solomon ) résout le problème des seuils d'erreur inhérents à la conception des turbocodes.
