Présentation

fec est une bibliothèque Rust qui implémente des codes correcteurs d'erreurs pour les applications de radio logicielle et de communication spatiale. Elle prend en charge les codes convolutionnels avec un décodeur Viterbi (décision dure et douce) et les codes Reed-Solomon sur GF(2⁸) avec décodage d'erreurs et d'effacements.

Architecture

La bibliothèque fec est conçue pour être rapide et efficace. Elle utilise la fonctionnalité simd pour activer l'accélération sur les processeurs SSE/AVX2/AVX512. Les codes convolutionnels sont pris en charge avec des taux allant de 1/2 à 1/8 et des ordres allant de k=4 à k=16. Les codes Reed-Solomon sont pris en charge avec la représentation standard CCSDS (255,223) et la représentation duale sur le fil (Berlekamp).

Fonctionnement

La bibliothèque fec fournit des interfaces pour encoder et décoder les données. Les utilisateurs peuvent créer des encodeurs et des décodeurs convolutionnels avec des paramètres spécifiques, tels que le taux et l'ordre. Les données peuvent être encodées et décodées à l'aide de méthodes telles que encode et decode_hard ou decode_soft. Les exemples de code montrent comment utiliser ces méthodes pour encoder et décoder des données.

Performances

Les performances de la bibliothèque fec ont été mesurées et comparées à celles de la bibliothèque libfec. Les résultats montrent que fec décode plus rapidement que libfec sur tous les codes, même sans l'utilisation de la fonctionnalité simd. Les tests ont été effectués sur un ordinateur portable Zen4 avec un processeur Ryzen 7840HS. Les résultats complets sont disponibles dans le fichier shim/BENCH.md.

use fec::{ConvEncoder, ConvDecoder};
let polys = [0o161, 0o127];
let mut enc = ConvEncoder::new(2, 7, &polys);
let mut dec = ConvDecoder::new(2, 7, &polys);
let msg = b"hello, error correction";
let mut encoded = vec![0u8; enc.encode_len(msg.len())];
let num_bits = enc.encode(msg, &mut encoded).unwrap();