1 个不稳定版本

0.1.0 2023 年 11 月 3 日

#411科学

MIT/Apache

51KB
934

SSDV 系统性擦除 FEC

这个 Rust 包实现了 SSDV 的系统性擦除 FEC 方案。FEC 方案基于 GF(2¹⁶) 上的 Reed-Solomon 代码,用作类似喷泉的代码。这个想法首先在作者的这个包的博客文章 An erasure FEC for SSDV 中被描述。

给定由 k 个 SSDV 数据包组成的 SSDV 图像,FEC 编码器可以生成最多 2¹⁶ 个不同的 SSDV 数据包,这些数据包通过从 0 到 2¹⁶-1 的数据包 ID 进行标识。ID 从 0 到 k-1 的数据包被称为“系统性数据包”,与原始图像的 k 个数据包相同。其余的数据包被称为“FEC 数据包”。每个数据包可以根据发送器的需求按需生成。大量 2¹⁶ 个不同的数据包提供了几乎无限的包来源。接收器可以从任何一组 k 个不同的数据包中恢复原始的 SSDV 图像。

这个 FEC 方案的实现使用 218 字节的 SSDV 数据包,遵循 Longjiang-2 使用的格式,省略了同步字节、数据包类型和呼号字段(但在生成 CRC-32 时隐式包含它们)。

这个包支持 no_std,并且实现是为小型微控制器而设计的。GF(2¹⁶) 算术只使用两个 256 字节大小的表,这些表包含在 .rodata 部分。FEC 编码器和解码器与外部提供的切片一起工作,提供了关于如何执行内存分配的自由,并在可能的情况下进行就地计算。编码所需的内存对应于包含原始图像的 k 个 SSDV 数据包的缓冲区,以及包含正在编码的数据包的缓冲区。解码所需的内存对应于包含至少 k 个不同接收到的 SSDV 数据包的缓冲区,以及另一个可以写入组成原始图像的 k 个 SSDV 数据包的缓冲区。除了这些缓冲区外,算法还只使用了少量栈空间。

可以使用默认启用的 cli 功能构建一个简单的 CLI 应用程序,该程序可以执行编码和解码。

CLI 应用程序使用

可以使用以下方式安装 CLI 应用程序:

cargo install ssdv-fec

ssdv-fec 应用程序支持 encodedecode 命令。要执行编码,需要指定输出中要生成的数据包数量。这可以通过使用 --npackets 参数来指定固定数量的数据包,或者使用 --rate 参数来指定编码速率。如果使用 --rate,编码的数据包数量等于原始图像中的数据包数量除以编码速率(必须在 0 到 1 之间)。示例 SSDV 图像可以在 src/test_data 目录中找到。以下是一些编码示例。

ssdv-fec encode --rate 0.8 src/test_data/img_230.ssdv encoded.ssdv
ssdv-fec encode --npackets 256 src/test_data/img_230.ssdv encoded.ssdv
ssdv-fec encode --first 57 --npackets 15 src/test_data/img_230.ssdv encoded.ssdv

默认情况下,第一个编码数据包的包 ID 为零,但可以使用 --first 参数选择另一个第一个包 ID。剩余的数据包使用连续的包 ID。可以使用 --first 参数编码与之前编码的数据包不同的一组数据包。

解码只需要将输入文件和输出文件作为参数即可。以下是一个解码示例。

ssdv-fec decode encoded.ssdv decoded.ssdv

解码的输入文件应仅包含单个图像的数据包。数据包可以是任何顺序的,也可以重复。如果解码失败,应用程序将指示错误原因。

API 文档

ssdv-fec Rustcrate 的文档托管在 docs.rs

许可证

根据您的选择,许可如下:

贡献

除非您明确声明,否则任何有意提交给您的工作以包含在内的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,不附加任何其他条款或条件。

依赖项

~0.3–0.9MB
~20K SLoC