fec es una biblioteca (crate) escrita en Rust que implementa técnicas de corrección de errores hacia adelante (Forward Error Correction, FEC) orientadas a aplicaciones de radio definida por software (SDR), comunicaciones espaciales y enlaces por satélite. Su objetivo es ofrecer, en un crate único, los dos esquemas de codificación más extendidos en estos entornos, con un rendimiento igual o superior al de las bibliotecas en C ya consolidadas.
La primera pieza del crate es un codificador/decodificador convolucional con decodificador de Viterbi, disponible en decisión dura y decisión blanda. Incluye los códigos más empleados en misiones espaciales —rate-1/2 k=7 (el código de la NASA), rate-1/2 k=9, rate-1/3 k=9 y rate-1/6 k=15— y, en general, cualquier tasa entre 1/2 y 1/8 con órdenes de k=4 a k=16. Sobre el compilador nightly de Rust, la feature simd activa una versión acelerada del decodificador de Viterbi con instrucciones SSE/AVX2/AVX512.
La segunda pieza son los códigos Reed–Solomon sobre GF(2⁸), con decodificación de errores y de erasures. Se proporciona el código estándar CCSDS (255,223), tanto en su representación convencional como en la representación dual-basis (Berlekamp) tal y como aparece en el enlace físico.
El proyecto se inspira en libcorrect, una biblioteca en C del mismo autor, y mantiene compatibilidad a nivel de bit con libfec de Phil Karn (KA9Q), de modo que los datos codificados con una pueden decodificarse con la otra. Existe además un crate satélite, fec-shim, que expone la misma funcionalidad bajo la ABI C de libfec (create_viterbi27, init_rs_char, encode_rs_ccsds, etc.) para integrarla como sustituto directo en bases de código C existentes. El proyecto se distribuye bajo licencia BSD-3-Clause y contempla futuras ampliaciones —anchos de Reed–Solomon distintos de GF(2⁸), erasure en decisión dura para Viterbi y soporte de códigos punteados—.
