返回

文章详情

展示HN:Rust中的SIMD维特比解码器

Hacker News2026年8月4日 22:37

用于SDR、空间和卫星应用的前向纠错。fec实现了两种在软件定义无线电和航天器链路中出现的纠错码:包含维特比解码器(硬判决和软判决)的卷积码,包括常见的速率-1/2 k=7、速率-1/2 k=9、速率-1/3 k=9和速率-1/6 k=15码。支持从1/2到1/8的任何速率,以及从k=4到k=16的任何顺序。在夜间Rust上,simd特性使维特比解码器能够在SSE/AVX2/AVX512上加速。GF(2⁸)上的里德-所罗门码具有错误和擦除解码,包括常规和电缆双基表示(Berlekamp表示)中的标准CCSDS (255,223)码。fec起初作为作者自己的libcorrect开始,并深受其启发,这是一个用于前向错误纠正的C库。这个crate还将Phil Karn的libfec C库作为这些编码的原始实现提供了认可,尽管这个crate并不借用任何源代码或与该库有任何关系,名称纯属巧合。标准参数(原始多项式、CCSDS双基变换)取自已发布的CCSDS标准(CCSDS 131.0-B,附录D用于双基)。快速入门卷积(维特比)使用fec::{ConvEncoder, ConvDecoder}; // 速率-1/2,阶数7的NASA码。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在传输中被损坏... let mut recovered = vec![0u8; msg.len()]; dec.decode_hard(&encoded, num_bits, &mut recovered).unwrap(); decode_soft用8位软符号代替,这在解调器可以报告其置信度时纠正更多错误。里德-所罗门使用fec::{RsEncoder, RsDecoder}; // 标准CCSDS (255,223)码。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在传输中被损坏... let mut recovered = vec![0u8; 223]; let corrected = dec.decode(&block, &mut recovered).unwrap(); println!("更正了{corrected}个符号错误"); 对于真实的航天器遥测(双基符号在电缆上),请使用encode_ccsds_dual/decode_ccsds_dual。兼容性这些编码与libfec(Phil Karn,KA9Q)位兼容,因此fec可以解码卡恩库生成的数据,反之亦然。一个配套的适配层库fec-shim,暴露了在libfec的C ABI下的fec(init_rs_char,create_viterbi27,encode_rs_ccsds等),作为现有C代码库的即插即用替代方案。启用simd特性(需要夜间版本)后,这个crate在x86上比libcorrect或libfec更具性能。路线图为里德-所罗门编码器/解码器提供更多宽度(窄于GF(2⁸)和宽于GF(2¹⁶))在卷积(维特比)解码器中进行硬决策擦除卷积编码器和解码器的打孔代码许可证BSD-3-Clause。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡