喷泉码浅谈

news2024/11/17 8:41:42

01、喷泉码简介

喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。传统的纠错码(如海明码、RS码等)通常需要在发送方对数据进行编码,接收方则使用相同的编码进行解码和纠错。这些方法一般具有固定的码率(Code Rate),即针对一定长度的原始数据,编码后的长度是固定的,这些方法在面对不稳定的信道或严重的信道丢失时可能效果不佳。相比之下,喷泉码通过在发送方生成随机的冗余数据,然后将其注入到原始数据中,以创造出一个“喷泉”流——相应的码率也也就不固定了。接收方可以从这个流中采样任意数量的数据包,并将它们合并以恢复原始数据。喷泉码的一种常见应用是在无线传感器网络中,其中网络节点之间的通信可能受到弱信号、干扰和多径传播等因素的影响。通过使用喷泉码,节点可以在较差的通信条件下实现可靠的数据传输。喷泉码另外一个常用的场景是大量文件或者数据的广播,这种时候每位接受者的丢包率是不确定的,因此固定码率的编码就不适用,喷泉码却可以解决该场景下的问题——丢包率高的接受者多收一些包,丢包率少的接受者则少收一些包。本文会介绍最常见的两种喷泉码实现,LT 编码 和 Raptor 编码。通过这两种编码的介绍和比较可以比较好的了解喷泉码的特性和基本的实现原理。

02、LT 编码


LT 编码 是第一个被实现的具有实用价值的喷泉码,该编码在 2002 年被提出,实现记的基本原理也非常简单,即位运算中的 xor 操作。Xor 操作有如下的特性:

  1. 两个相同的数据块 M,它们 Xor 的结果是 0。即 M ^ M = 0。
  2. 对一块数据块 M,Xor 两次相同的数据块 N,最终结果仍然为 M。即 M ^ N ^ N = M。
  3. 假设两个等长的数据块 M 和 N,M ^ N = L。那么 L ^ M = N 并且 L ^ N = M。

基于上述的特性,LT 编码的方式就可以描述为下列的步骤:

  1. 对于长度为 N 的等宽数据块序列,随机选取一个 degree (d),1 ≤ d ≤ N。
  2. 从上述的数据块中选取随机 d 个数据块,将所有选取的数据块进行 xor 操作,最终得到一个编码的数据块。
  3. 重复上述步骤 1 和 2,我们可以得到源源不断的编码数据块,好像“喷泉”一样水流不断。

编码过程很简单,唯一需要注意一下的问题是如何获得等款的数据块。如果总数长度不能够恰巧分成 N 等分,我们可以通过在后续加 padding 的方式来实现可以 N 等分。解码相对比较复杂, 描述如下:

  1. 已经接受过的重复的编码块丢弃。
  2. 如果接收的数据块 d > 1, 将其和 所有已知和该编码块相关的 d = 1 的原始数据块进行 xor 操作,没操作一次 d 减一,如果知道最后 d > 1,则将结果暂存到队列中,否则将最终得到的原始数据块记录下来。
  3. 每当发现一个新的 d = 1的原始数据块,将该数据块和所有等待数据块中相关的数据块进行 xor 操作,以期待发现更多的 d = 1 的原始数据块。
  4. 重复上述操作,直到所有的原始数据块被恢复出来。

该过程中的编码数据块一般还是会携带 metadata 信息,包含原始数据块的位置信息,例如告知该编码块由 第1 和 第3 个原始数据块 xor 而来。LT 编码有其局限性,如果我们想保证编码块的数量 m 和原始数据块数量 k 非常接近,且恢复的成功率较高,那么平均每个编码块的生成需要进行 O(log(k)) 次 Xor 操作,需要消耗非常多的计算资源。相反,如果 degree 比较低,虽然每个编码块的操作数减少了,但是我们会需要更多的编码块来恢复出全部数据。上述所说的局限性是受到信息论的约束的,无法进一步降低。那么我们有没有办法实现一种方式来降低计算资源的消耗呢?比如我们如果不需要恢复出全部的原始数据呢?受到这个思路的启发 Raptor 算法应运而生。

03、Raptor 算法

Raptor 本质上是一类混合编码方式,结合 LT 编码和 LDPC 编码,同时获取了两种编码的好处。如下图所示:

Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

该编码具有三层结构,中间编码结果经过了两层固定码率编码,分别是Hamming 编码LDPC 编码,然后再进行LT 编码生成最终的编码块。针对 Raptor 编码的解码方式一般有两种。第一种和编码方式完全相反,首先利用 LT 编码的解码方式恢复出部分的中间编码块,然后利用固定编码的解码方式恢复出原始的数据块。第二种方式则是将上述所有的多层编码方式都变成一种矩阵运算,针对收到数据后利用矩阵的高斯消元方法解出原始的数据块。现有为人所熟知的 Raptor 编码主要有 RFC 5053 和 RFC 6330 RaptorQ 编码。两者的实现细节有诸多区别,但是内在的思路和上述的方法是类似的,有兴趣的读者可以进一步进行阅读和学习。

04、总结

喷泉码是一种无固定码率的编码方式,其中比较著名的有 LT 编码和 Raptor 编码。LT 编码算法简单,实现也简单,但是算法效率不高。Raptor 算法结合了 LT 编码和一些固定码率编码,利用混合编码的方式实现了高效的喷泉码。

达坦科技(DatenLord)专注下一代云计算——“天空计算”的基础设施技术,致力于拓宽云计算的边界。达坦科技打造的新一代开源跨云存储平台DatenLord,通过软硬件深度融合的方式打通云间壁垒,实现数据高效跨云访问,建立海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。

公众号:达坦科技DatenLord

DatenLord官网:http://www.datenlord.io

知乎账号:

达坦科技DatenLord - 知乎

B站



https://space.bilibili.com/2017027518

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/956845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Android - RadioButton函数

RadioButton有两种状态:选中或未选中,这允许用户从一组中选择一个选项。 Radio Button 示例 本示例将带您完成一些简单的步骤,以展示如何使用Linear Layout和RadioButton创建自己的Android应用程序。 以下是修改后的主要Activity文件 src/MainActivity.java 的内容。 packa…

【算法】函数渐近的界基础知识及定理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Spring依赖注入(DI)

目录 构造器注入 set注入 拓展注入 bean的作用域 Singleton Prototype Dependency Injection 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 . 构造器注入 具体实现&#xff1a;SpringIOC创建对象的…

电力行业浪涌保护器应用方案

电力行业是一个涉及到高压、大电流、复杂环境的领域&#xff0c;对于电气设备的安全和可靠性有着极高的要求。在电力行业中&#xff0c;浪涌是一种常见的电力质量问题&#xff0c;它指的是在电气系统中出现的瞬时过电压或过电流&#xff0c;可能由雷击、开关操作、短路故障等因…

算法通关村——解析堆的应用

在数组中找第K大的元素 LeetCode21 Medium 我们要找第 K 大的元素&#xff0c;如果我们找使用大堆的话那么就会造成这个堆到底需要多大的&#xff0c;而且哪一个是第 K 的的元素我们不知道是哪一个索引&#xff0c;我们更想要的结果就是根节点就是我们要找的值&#xff0c;所以…

java之SpringBoot基础、前后端项目、MyBatisPlus、MySQL、vue、elementUi

文章目录 前言JC-1.快速上手SpringBootJC-1-1.SpringBoot入门程序制作&#xff08;一&#xff09;JC-1-2.SpringBoot入门程序制作&#xff08;二&#xff09;JC-1-3.SpringBoot入门程序制作&#xff08;三&#xff09;JC-1-4.SpringBoot入门程序制作&#xff08;四&#xff09;…

cocosCreator 之 微信小游戏打包

版本&#xff1a; v3.8.0 环境&#xff1a; Mac 介绍 cocosCreator 支持将游戏发布到多个小游戏平台&#xff0c;并提供了打包等流程处理。 本篇文章主要讲述下微信小游戏的发布流程相关。更多内容参考官方文档&#xff1a; 发布到小游戏平台 微信小游戏的发布相关&#xff…

2023-8-31 Floyd求最短路

题目链接&#xff1a;Floyd求最短路 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 210, INF 1e9;int n, m, Q;int d[N][N];void floyd() {for(int k 1; k < n; k)for(int i 1; i < n; i)for(int …

并发编程的故事——并发之共享模型

并发之共享模型 文章目录 并发之共享模型一、多线程带来的共享问题二、解决方案三、方法中的synchronize四、变量的线程安全分析五、习题六、Monitor七、synchronize优化八、wait和notify九、sleep和wait十、park和unpark十一、重新理解线程状态十二、多把锁十三、ReentrantLoc…

瓜分双十一10亿红包设计:在线分享教程?

在如今激烈的市场竞争中&#xff0c;瓜分红包营销活动成为了各大企业争相使用的一种营销手段。这种活动不仅能够吸引用户的关注和参与&#xff0c;还能够提高用户的粘性和忠诚度。那么&#xff0c;如何自建瓜分红包营销活动呢&#xff1f;下面将为大家详细解析。 首先&#xff…

振动智能监测与设备可靠性:无线技术的契机

在现代工业领域&#xff0c;设备的可靠性和稳定运行对于生产效率和安全性至关重要。然而&#xff0c;由于设备的频繁使用和各种环境影响&#xff0c;设备故障和突发停机仍然是不可避免的挑战。为了有效地应对这些挑战&#xff0c;振动智能监测技术结合无线传感器的应用正在成为…

FPGA可重配置原理及实现(1)——导论

一、概述 可重配置技术是Xilinx提供的用来高效利用FPGA设计资源实现FPGA资源可重复利用的最新的FPGA设计技术&#xff0c;这种技术的发展为FPGA应用提供了更加广阔的前景。 术语“重构”是指FPGA已经配置后的重新编程。FPGA的重构有两种类型&#xff1a;完全的和部分的。完全重…

【附安装包】Substance3D 2022安装教程

软件下载 软件&#xff1a;Substance3D版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;4.0G安装环境&#xff1a;Win11/Win10&#xff08;1809版本以上&#xff09;硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff0c;不支持7代以下CPU&#xff09;下载通…

即时通讯开发应用中的实时消息推送技术

即时通讯开发领域正以前所未有的速度蓬勃发展&#xff0c;实时消息推送技术成为促进即时通讯应用体验的关键要素。本文将深入探讨即时通讯应用中的实时消息推送技术&#xff0c;为读者呈现这一领域的全貌。 2. 实时消息推送的重要性 在当今数字化时代&#xff0c;人们日益需要…

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 &#xff08;就可以回滚到你要去的版本&#xff09;git push -f &#xff08;因为本地回滚了&#xff0c;所以和远程会差几个版本。所以这时候只有强制推送&#xff0c;覆盖远程才可以&#xff09;

实力认证!OceanBase获“鼎信杯”优秀技术支撑奖

6 月 30 日&#xff0c;2023 “鼎信杯”信息技术发展论坛在京隆重举办第二届“鼎信杯”大赛颁奖典礼。OceanBase 凭借完全自主研发的原生分布式数据库&#xff0c;以及丰富的核心系统国产数据库升级案例&#xff0c;斩获“优秀技术支撑奖”。 论坛上&#xff0c;国内首个基于在…

JavaScript基础03

JavaScript 基础 文章目录 JavaScript 基础for 语句for语句的基本使用循环嵌套倒三角九九乘法表 数组数组是什么&#xff1f;数组的基本使用定义数组和数组单元访问数组和数组索引数据单元值类型数组长度属性 操作数组 if 多分支语句和 switch的区别&#xff1a; 共同点 都能实…

C语言如何判断闰年?

首先需要了解闰年的判断规则&#xff0c;以下是百度百科的介绍&#xff1a; 1.普通年份能被4整除&#xff0c;且不能被100整除的&#xff0c;是闰年。&#xff08;如2004年就是闰年&#xff09; 2.世纪年份能被400整除的是闰年。&#xff08;如2000年是闰年&#xff0c;1900年不…

JVM-CMS

when 堆大小要求为4-8G 原理 初始标记&#xff1a;执行CMS线程->STW&#xff0c;标记GC Root直接关联的对象->低延迟 并发标记&#xff1a;执行CMS线程和业务线程&#xff0c;从GC Root直接关联的对象开始遍历整个对象图 重新标记&#xff1a;执行CMS线程->STW&a…

【炼气境】Java集合框架篇

【炼气境】Java集合框架篇 文章目录 【炼气境】Java集合框架篇概述接口Collection接口List接口ArrayList类LinkedList类 Set接口HashSet类LinkedHashSet类TreeSet类 Queue接口LinkedList类PriorityQueue类ArrayDeque Map接口HashMap类LinkedHashMap类TreeMap类 常用方法特性适用…