伽罗华有限域的FEC

FEC算法_cloudfly_cn的博客-CSDN博客_fec算法

I
基于IP的语音和视频通话业务为了实时性,一般都是采用UDP进行传输,基站无线一般配置UM模式的RLC承载,因此丢包是不可避免的,在小区信号的边沿则丢包率会更高;为了通话的实时性,一般不会采用接收端发现丢包了然后通知发送端重传的机制,因为这个在应用层的丢包检测和通知发送端重传是非常耗时的。引入前向纠错(FEC)机制是解决实时通话业务丢包的一个很好的机制,FEC的原理就是在发送端发送数据包时插入冗余包,这样即使接收端收到的数据有所丢包(丢包数不大于冗余包时)也是能还原出所有的数据包的。本文介绍FEC算法的原理,只涉及三阶冗余,因为只有前三阶的矩阵运算比较简单,而且实际中也足以够用了,而且阶数越高则传输冗余包占用带宽太大,那就没有意义了,本人曾负责的一个音视频实时通话软件就是只用到三阶冗余,效果已经很好了。

本文对FEC算法进行一步一步的数学推导,让不了解FEC的读者看完后可以有很好的理解,从而可以使用本文的FEC算法到实际项目中,或者为项目设计出更好的FEC算法;同时也重温一下大学的线性代数吧。

零阶冗余(没有冗余)
没有加入冗余数据,直接原始数据发送,假设原始数据为D1、D2、D3、...、Dn,则发送的数据就是D1、D2、D3、...、Dn。


(1) 编码矩阵为单位矩阵
一阶冗余
所谓一阶冗余算法,就是每n个数据插入一个冗余数据(也即FEC编码组长度为n+1);这n个数据和其对应的冗余数据构成一组数据,这组数据中丢掉任何一个数据都可以通过另外n个数据恢复出来。

发送端编码


(2) 图示编码算法(n=4的场景)
 

如上图示,左边矩阵为编码矩阵,就是在单位矩阵下面插入一行冗余算法参数,右边的C1为计算出来的冗余数据。

令R1i=1,i=1,2,...,n,则上式子可以简化为:

采用伽罗华有限域(Galois field :)运算,则可将加减法运算化为异或运算,因此C1的计算公式简化为:

接收端解码

如果接收端收到的某组数据丢失了一个,则可以通过如下公式推导出恢复丢失数据的公式;下图我们假设丢失的数据为D2,则D2的恢复矩阵运算为:


(3) 图示丢包恢复过程(假设n=4、丢包D2)
可得,

因此可得到D2的恢复公式:

一般地,若丢失的数据为Di,其中i=1,2,...,n,Di的恢复公式为:

令R1i=1,且采用伽罗华有限域运算,则上式子可以简化为:

二阶冗余
就是每n个数据插入两个冗余数据(也即FEC编码组长度为n+2);这n个数据和其对应的冗余数据构成一组数据,这组数据中丢掉任何一或两个数据都可以恢复出来。

发送端


(4)二阶冗余发送编码图示(n=4)
上式左边的矩阵成为编码矩阵,右边的C1、C2为冗余数据,其中:

令R1i=1、R2i=i,其中i=1,2,...,n,且采用伽罗华有限域运算,则上式子可以简化为:

其中gfm()函数表示伽罗华域乘法运算,gfm(i,Di)表示i和Di在伽罗华域的乘法运算。

接收端

场景1、丢失一个数据包Di,冗余包C1没有丢失,则可以通过接收到的数据包和冗余数据C1恢复出Di,其恢复算法和一阶冗余算法的一样:

令R1i=1,i=1,2,...,n,且采用伽罗华有限域运算,则上式子可以简化为:

场景2、丢失一个数据包Di,冗余包C1也丢失,C2没有丢失,则可以通过接收到的数据包和C2恢复出Di,其恢复算法推导如下:

令R2j=j,则上式可以简化为:

若采用伽罗华域运算,则上式可以简化为:

其中gfm()函数表示伽罗华域乘法运算,gfm(i,Di)表示在伽罗华域的乘法运算i*Di,gfd()函数表示伽罗华域除法运算,gfd(a,b)表示在伽罗华域的除法运算a/b。

场景3、丢失两个数据包Di、Dj,冗余包C1和C2没有丢失,则可以通过接收到的数据和冗余数据C1、C2恢复出Di和Dj,其恢复公式推导如下:


(5) 传输中丢掉了两个数据包图示
整理后为:


(6)丢弃两个数据包的恢复运算图示(D3、D4丢弃)
 

经过行操作消元整理后为:

其中,

因此,求解D3、D4本质就是解如下方程:

上式两边乘以矩阵的逆就可以求解出D3、D4:

再结合根据二阶方阵的求逆公式:

可以求解出:

一般地,如果传输中丢失Di和Dj数据包,则Di和Dj的求解公式为:

令R1i=1、R2j=j,i=1,2,..., j=1,2,...,可以简化为:

采用伽罗华域运算,则上面的式子变为:

三阶冗余
所谓三阶冗余,就是每n个数据插入三个冗余数据;这n个数据和其对应的冗余数据构成一组数据,这组数据中丢掉任意m个(m<=3)数据都可以通过收到的其它数据恢复出来。

发送端

上式左边的矩阵成为编码矩阵,右边的C1,C2,C3为冗余数据,其中:

令R1j=1、R2j=j、R3j=j^2,其中j=1,2,...,n,则:

采用伽罗华域(gf())运算,可以将加减法变为异或操作,乘除法变为加减法的查表操作;C1就是一阶冗余数据,C2就是二阶冗余数据,C3就是三阶冗余数据。

接收端

场景1,仅丢掉一个数据包Di,接收到一个冗余包Ck,则恢复Di的公式为:

其中,k = 1 或 2 或 3 ,u ≠ i。

令R1u = 1、R2u = u、R3u = u^2,则:

场景2,丢掉两个数据包Di、Dj,接收到两个冗余包Ck、Cm;经过推导可以化简为解如下二元线性方程组:

解方程可得:

若令R1j=1、R2j=j、R3j=j^2,其中j=1,2,...,n,则上式Di和Dj的求解可简化为:

场景3,丢失三个数据包Di、Dj、Dk,且接收到三个冗余包C1、C2、C3,则经过简单的推导将丢失数据包的恢复计算抽象为解如下三元线性方程组:

若令R1j=1、R2j=j、R3j=j^2,其中j=1,2,...,n,则上式Di和Dj的求解可简化为:

根据附录的三阶矩阵求逆公式,就可以直接求解出Di、Dj、Dk:

采用伽罗华域(gf())运算,可以将加减法变为异或操作,乘除法变为加减法的查表操作。

注: 

【1】FEC的编码和解码都是使用伽罗华域(gf())运算。

【2】文中使用的冗余矩阵是范德蒙特行列式,这样构建出来的冗余矩阵,最后接收端解码求矩阵的逆时,不会遇到奇异矩阵的场景,否则如果出现奇迹矩阵则接收端就无法求解出丢失的数据包了。

【3】 相关的伽罗华域(gf())运算和矩阵运算请参考《FEC算法——附录》
————————————————
版权声明:本文为CSDN博主「cloudfly_cn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010178611/article/details/82656838

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

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

相关文章

mlecms v2.2版权

inc\tools\smarty 下的Smarty.class.php文件。找到 187行左右 我们会发现原来的 $dopud $_template->libfile($dopud);已经变成了$_headers $this->listaops($_headers);我们按照之前版本的方法将其注释掉&#xff0c;刷新&#xff0c;果然没有了。到这里还不算完&#…

如何求矩阵的逆矩阵

如何求矩阵的逆矩阵 - 叮叮当当sunny - 博客园 求逆矩阵最有效的方法是初等变换法&#xff08;虽然还有别的方法&#xff09;。如果要求方阵 AA 的逆矩阵&#xff0c;标准的做法是&#xff1a; 将矩阵 AA 与单位矩阵 II 排成一个新的矩阵 (AI)(AI)将此新矩阵 (AI)(AI) 做初等…

一篇英文文档中找出频数最多的10个单词

"""一篇英文文档中找出频数最多的10个单词collections: Counter 提供计数器工具以支持方便和快速的计数 most_common(n) 返回n个最常见元素及其计数的列表&#xff0c;从最常见到最少。 如果省略nNone&#xff0c;则 most_c…

中断共享(硬件角度)

中断共享&#xff1a; 和别人讨论的时候&#xff0c;谈到了中断共享&#xff0c;下面记录下几种不同的情况&#xff1a;1、一个IP模块中只有一个中断引脚连接到中断控制器&#xff0c;该IP模块中只有一个部件可以产生中断请求&#xff1b;2、一个IP模块中只有一个中断引脚连…

web绿色环境搭建

开篇 需要的软件及他们各自的版本apache-tomcat-6.0.32(绿色版&#xff0c;能直接下载得到)java-jdk1.6.0_25/jre6(安装后制作的绿色版&#xff0c;不能直接下载得到)MyEclipse6.5(安装后制作的绿色版&#xff0c;不能直接下载得到)MySql_5.1.3(绿色版&#xff0c;直接下载得到…

Babel+vscode实现APICloud开发中兼容ES6及以上代码

本文出自APICloud官方论坛&#xff0c; 感谢论坛版主 penghuoyan 的分享。 使用APICloud开发时&#xff0c;考虑到兼容问题一直使用ES5开发&#xff0c;时间越久感觉越落后&#xff0c;整理了一个兼容ES6的开发环境&#xff0c;供大家参考。 步骤1&#xff1a; 安装Node开发环境…

sql完整性

转至&#xff1a;http://www.cnblogs.com/2007/archive/2007/08/24/868428.html更新数据库时&#xff0c;表中不能出现不符合完整性要求的记录&#xff0c;以保证为用户提供正确、有效的数据。实现该目的最直接的方法&#xff0c;是在编写数据库应用程序时&#xff0c;对每个更…

html小知识

字符文本中字符太多 一、正确&#xff1a; <a hrefShowFile.aspx?ID<%# DataBinder.Eval(Container.DataItem, "ID") %>>查看文件</a> 二、错误&#xff1a; <a href"ShowFile.aspx?ID<%# DataBinder.Eval(Container.DataItem, ID) %…

基本数据结构:树(tree)

参考博客 &#xff08;1&#xff09;基本数据结构&#xff1a;树&#xff08;tree&#xff09; - andyidea - 博客园 &#xff08;2&#xff09;《大话数据结构》 &#xff08;3&#xff09;《啊哈&#xff01;算法》 1、树的相关定义 &#xff08;1&#xff09;树&#xff1a;…

参数估计方法简介

1.参数估计和非参数估计 前面提到随机变量的分布不是很明确时&#xff0c;我们需要先对随机变量的分布进行估计。有一种情况是我们知道变量分布的模型&#xff0c;但是具体分布的参数未知&#xff0c;我们通过确定这些未知参数就可以实现对变量的估计&#xff0c;这种方式就是参…

VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错

vm 8.0上安装ubuntu 13.04系统以后&#xff0c;需要安装一个vm tool 方便屏幕适应和文件拷贝&#xff0c;但是发现由于ubuntu 13.04 使用的内核太新了&#xff0c;而vm8.0 不能够提供这样的文件&#xff0c;导致安装失败。现在总结一下解决方法。首先下载最新版本的linux 头文件…

如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置(三)

在 如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置&#xff08;二&#xff09; 文中末尾&#xff0c;出现下图报错&#xff1a; 一般情况下&#xff0c;按上篇提到的hvremote.wsf 脚本配置说明文件HVRemote Documentation操作后&#xff0c;不会出现此报错&#xff0…

异或运算交换两个整数

异或运算有两个特性&#xff1a; 1、一个数异或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一个数异或0恒等于本身&#xff0c;如5^0恒等于5。 基于此&#xff0c;交换操作如下&#xff1a; aa^b; bb^a; ab^a;

Liferay中使用portlet:resourceURL触发serveResource()方法调用的细节

引入&#xff1a;大家在Portlet 开发中经常用到<portlet:resourceURL>&#xff0c;而大体上都会去调用相应的serveResource()方法&#xff0c;这个过程虽然大家都清楚&#xff0c;但是能弄明白这个过程细节的&#xff0c;我相信全世界不超过100人&#xff0c;至少我去年就…

使用ESP定律_手工脱壳

ESP定律脱壳一般的加壳软件在执行时&#xff0c;首先要初始化&#xff0c;保存环境&#xff08;保存各个寄存器的值&#xff09;&#xff0c;一般利用PUSHAD&#xff08;相当于把所有寄存器都压栈&#xff09;&#xff0c;当加壳程序的外壳执行完毕以后&#xff0c;再来恢复各个…

原码、反码、补码,以及负数的位操作

1、 原码&#xff1a;将符号位数码化了的数&#xff0c;其中“”用0表示&#xff0c;“-”用1表示。 反码&#xff1a;正数的反码表示与原码表示一样&#xff1b;负数的反码表示是原码表示的符号位不变&#xff0c;数值位逐位取反。 补码&#xff1a;正数的补码表示与原码表…

IT菜鸟之DHCP

DHCP 动态主机配置协议&#xff08;Dynamic host configuration protocol&#xff09;作用&#xff1a;分配网络地址选项&#xff1a;excluded-address 排除地址pool IP地址池&#xff08;网段 - 排除地址 地址池&#xff09;relay DHCP代理服务器&#xff08;无用&#xff09…

override render 方法

有时候需要在ASP.net 或MVC 中在页面呈现前&#xff0c;把要显示的内容作一个拦截&#xff0c;更改内容后显示。 只要重写 protected override void Render(System.Web.UI.HtmlTextWriter writer) 方法。 例如&#xff1a; 我把返回的内容中的html 的标题进行改变&#xff0c;…

Sliverlight MD5

突然想在WP上用MD5 &#xff0c;c#的MD5方法在SL下是不能用的额 搜索下MSDN&#xff0c;找到解决方法&#xff1a; http://archive.msdn.microsoft.com/SilverlightMD5 下载那两个类添加到工程中&#xff0c;然后添加代码: 1: protected string GetMD5Hash(string input) 2: { …

“指针+1”的理解

1、一个32位的机器&#xff0c;该机器的指针是多少位的&#xff1f; 指针是多少位只要看地址总线的位数就行了&#xff0c;80386以后的机子都是32的地址总线&#xff0c;所以指针的位数就是4个字节了。 2、指针加1&#xff0c;结果是对该指针增加1个储存单位。 &#xff08;…