← На главную

Вышел Rust-крейт fec для SDR и космоса — быстрее libfec

04.08.2026 22:37 · hackernews

Крейт fec на Rust добавляет в SDR и космическую связь два вида помехоустойчивого кодирования. Свёрточные коды с декодером Viterbi: жёсткое и мягкое решение, поддержка распространённых rate-1/2 k=7, rate-1/2 k=9, rate-1/3 k=9 и rate-1/6 k=15, а также любых rate от 1/2 до 1/8 и k от 4 до 16. На nightly Rust фича simd включает ускорение декодера через SSE/AVX2/AVX512. Второй тип — коды Reed-Solomon над GF(2⁸) с декодированием ошибок и стираний, включая стандартный CCSDS (255,223) в обычном и в «on-the-wire» dual-basis (Berlekamp) представлении.

Проект начинался как и опирается на авторскую C-библиотеку libcorrect. Статья отдаёт должное C-библиотеке libfec Фила Карна: та дала исходную реализацию этих кодов. Но fec не заимствует код из libfec, никак с ней не связан, а совпадение имени случайно. Стандартные параметры (примитивные полиномы, преобразование CCSDS dual basis) взяты из опубликованного стандарта CCSDS 131.0-B, приложение D.

С фичей simd fec декодирует быстрее libfec на всех кодах. Замеряли через собственные тестовые программы libfec, меняя только библиотеку кодека, на ноутбуке Zen4 (Ryzen 7840HS). Скорости в таблице: свёрточный rate-1/2 k=7 — 158 Mbps, rate-1/6 k=15 — 1187 Kbps; Reed-Solomon (255,223) без ошибок — 568 Mbps, с двумя ошибками — около 443–445 Mbps. Reed-Solomon не использует SIMD ни в одной из библиотек, поэтому у него 32- и 64-битные результаты различаются только шириной указателя. Полные таблицы, сравнение BER и методика — в shim/BENCH.md.

В API всё просто: ConvEncoder/ConvDecoder и RsEncoder/RsDecoder. decode_soft принимает 8-битные soft-символы и лучше исправляет ошибки, когда демодулятор выдаёт уверенность. Для настоящей телеметрии с dual-basis символами на проводе есть encode_ccsds_dual/decode_ccsds_dual. Коды побитово совместимы с libfec: fec декодирует то, что выдал Карн, и наоборот. Компаньон-крейт fec-shim выставляет fec под C ABI библиотеки libfec (init_rs_char, create_viterbi27, encode_rs_ccsds) и работает как drop-in для существующего C-кода.

В планах — другие ширины для Reed-Solomon: более узкие, чем GF(2⁸), и вплоть до GF(2¹⁶), hard-decision erasures в декодере Viterbi и punctured-коды. Лицензия — BSD-3-Clause.

Читать оригинал →