Dasturlash

fec Rust kutubxonasi: SIMD tezlashtirish bilan kosmik aloqa va SDR uchun Forward Error Correction

5-avgust, 2026, 06:180 ko'rish4 daqiqa o'qish
fec Rust kutubxonasi: SIMD tezlashtirish bilan kosmik aloqa va SDR uchun Forward Error Correction

Rust ekotizimi forward error correction (FEC) sohasida yangi bosqichga kirdi. fec nomli crate hozir GitHub va crates.io da mavjud — bu dasturchilarga konvolyutsion (Viterbi) va Reed-Solomon kodlarini bitta, xavfsiz va tezlashgan paketda beradi. Asosiy farqi: simd xususiyati (nightly Rust talab qiladi) x86-da SSE, AVX2 va AVX-512 vektor buyruqlaridan foydalangan holda Viterbi dekoderini tezlashtiradi.

Nima uchun bu muhim?

Dazmol signalni tiklash — bu faqat akademik masala emas. Starlink uydu tarmog'idan Mars roverlari telemetriyasigacha, barcha zamonaviy kosmik aloqa va software-defined radio (SDR) tizimlari shovqinli kanallar orqali ma'lumot uzatish uchun FEC ga bog'liq. Hatto 5G va Wi-Fi 7 ham ichki qatlamlarda turli xil konvolyutsion va LDPC kodlaridan foydalanadi. fec paydo bo'lishidan oldin Rust dasturchilari ya C-kutubxonalariga (libfec, libcorrect) bog'lanishlari kerak edi, ya o'zlarini yozishlari kerak edi — bu xavfsizlik va samaradorlik o'rtasida kompromiss berardi.

Crates.io

Ichida nima bor?

  • Konvolyutsion kodlar (Viterbi): hard- va soft-decision dekoding. Standart NASA/CCSDS parametrlari: rate-1/2 k=7, rate-1/2 k=9, rate-1/3 k=9, rate-1/6 k=15. Umumiy qo'llab-quvvatlash: rate 1/2 dan 1/8 gacha, order k=4 dan k=16 gacha.
  • Reed-Solomon GF(2⁸): xato va erasure dekoding. Standart CCSDS (255,223) kodi — hem oddiy, hem dual-basis (Berlekamp) ko'rinishida.
  • SIMD tezlashtirish: nightly Rust da simd feature yoqilganda Viterbi dekoder AVX-512 ga qadar vektorlanadi. Muallifga ko'ra, bu libcorrect va libfec dan tezroq ishlaydi.
  • C ABI shim: fec-shim crate'i init_rs_char, create_viterbi27, encode_rs_ccsds kabi funksiyalarni taqdim etadi — mavjud C/C++ kod bazalariga drop-in o'rn almashtiruvchi.

Kod misoli: oddiylik va kuch

API Rust-ga xos ergonomiklikka ega. Quyida rate-1/2, order-7 NASA kodi bilan kodlash/dekodlash:

Docs.rs
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(); // ... kanal shovqini ... let mut recovered = vec![0u8; msg.len()]; dec.decode_hard(&encoded, num_bits, &mut recovered).unwrap();

Soft-decision (decode_soft) 8-bit soft simvollar qabul qiladi — demodulyator ishonch darajasini berishi xatolarni kuchi bilan kamaytiradi. Reed-Solomon uchun ham xuddi shu kadar oddiy:

use fec::{ConvEncoder, ConvDecoder};

// Rate-1/2, order-7 NASA code.
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();

// ... encoded is corrupted in transit ...

let mut recovered = vec![0u8; msg.len()];
dec.decode_hard(&encoded, num_bits, &mut recovered).unwrap();
use fec::{RsEncoder, RsDecoder};
let mut enc = RsEncoder::new_ccsds();
let mut dec = RsDecoder::new_ccsds();
let msg: Vec = (0..223).collect();
let mut block = vec![0u8; 255];
enc.encode(&msg, &mut block).unwrap();
// ... buzilgan blok ...
let mut recovered = vec![0u8; 223];
let corrected = dec.decode(█, &mut recovered).unwrap();

Manba va standartlarga sadokat

Kutubxona avtorining o'z C-kutubxonasi — libcorrect — va Phil Karn (KA9Q) ning efsanevi libfec dan ilhom olingan. Lekin manba kodi o'zlashtirilmagan; nom faqat tesodifiy moslik. Barcha primitiv polinomlar va CCSDS dual-basis o'zgaruvi rasmiy CCSDS 131.0-B standartidan (Ilova D) olingan. Natija: fec libfec bilan bit-darajasida mos — bir kutubxona kodlagan ma'lumotni ikkinchisi xatosiz dekoda oladi.

use fec::{RsEncoder, RsDecoder};

// Standard CCSDS (255,223) code.
let mut enc = RsEncoder::new_ccsds();
let mut dec = RsDecoder::new_ccsds();

let msg: Vec<u8> = (0..223).collect();
let mut block = vec![0u8; 255];
enc.encode(&msg, &mut block).unwrap();

// ... block is corrupted in transit ...

let mut recovered = vec![0u8; 223];
let corrected = dec.decode(&block, &mut recovered).unwrap();
println!("corrected {corrected} symbol error(s)");

Kelajak rejalari va litsenziya

Roadmap da: Reed-Solomon uchun GF(2⁸) dan kengroq (GF(2¹⁶) gacha) va darozalari kengaytirilgan variantlar; Viterbi dekoderida hard-decision erasures; konvolyutsion kodlar uchun punctured kodlar. Litsenziya — BSD-3-Clause, yani kommersiyali loyihalarda cheklovsiz ishlatish mumkin.

Xulosa

fec — bu Rust-da FEC uchun de facto standart bo'lishi uchun barcha shartlarga ega: xavfsiz xotira, nol-absraktsiya SIMD tezlashtirish, kosmik aloqa standartlariga to'liq moslik va C-ekotizimi bilan interoperabilitet. Agar siz SDR, uydu aloqa yoki yuqori ishonchlilik talab qiluvchi har qanday tizim ustida ishlasangiz — bu crate ni Cargo.toml ga qo'shish waqtingizni tejaydi va kod xavfsizligini ta'minlaydi.

Asl manba: github.com

Manba: Hacker News
#rust #fec #viterbi #reed-solomon #sdr
Telegram da muhokama qilish