前面简单说了一下FEC,以及它的配合使用的方法。下面我想详细说一下FEC算法

曾经有位大神在帖子里这么写着:采用改进型的vandermonde矩阵RS算法.其优点算法运算复杂度更低且解决了利用矩阵构造RS码当矩阵奇异时,构造的纠错码不为RS码的问题。

  • FEC的方案:在RTP或私有协议头上扩展出包组头(Group head),一个Group有k个媒体包和r个冗余包组成,他们在Group内拥有不同的组号,通过组号的连续性可以判断本组内数据包的丢失情况,从而选择性的予以恢复(冗余包丢失无需恢复)、因为UDP协议保障了包内数据的正确性,所以我们无需考虑包内纠错的情况。Group是一个完整的独立的FEC处理单元,不同Group之间无相关性。由于冗余性的存在,一个Group中任意k个数据包可以用来重建k个原始媒体包,如果丢失数据包数小于等于r,接受者收到一个Group中任意的k个数据包后,即可以通过组号信息确定丢失包的相对位置并进行FEC解码,以恢复k个原始媒体包。这里我们定义冗余包数r与原始媒体包数k的比值为FEC编码冗余度r/k,冗余度越高,抗丢包能力越强,同时传输效率也越低。

下面借鉴大神的FEC编解码算法进行简述:

1)数据包分割

对数据包FEc编码运算首先进行的是包内分割,将数据包分割为多个定长单元,定长单元成为自,设字长为w bits,w的取值一般为8/16/32。FEc编码对k个原始媒体包朱子进行处理,生成m个冗余数据包与之对应的字。

例如:现有两个原始数据包D1、D2,包的长度都为b bytes(对于包长不足b bytes的使用0补齐)-- b B,字长为w  bits -- w 位,那么一个数据包的总字长为1 = 8b/w。用这两个冗余包C1、C2的过程简述如下:

图中F代表FEC编码运算

2)Vandermonde编解码以及改进

设k个原始媒体包D=(D1,D2,...,Dk),,r个冗余数据包C=(C1,C2,...,Cr),那么传输组Group表示为Y=(Y1,Y2,...,Yn),其中Yi=Di(0<=i<=k-1),Y

j=Cj(k<=j<=n-1)。B为 n x k 维 FEC生成矩阵,有单位矩阵I和矩阵G组成,则一个Group可表示为如下所示:

通过这种方式构造的RS码是系统码,信息组以不变的形式在码组的任意k位(通常在最前面: D1,D2,...,Dk)。如果以数据包为对象,那么传输组的前k个包就是k个被保护的数据包。在接收端,如果接收者收到了Group中的任意k个数据包,即可根据所收到的数据包在Group中的位置信息,从FEC生成矩阵B中提取对应的行,组成一个新的 kxk 维矩阵B‘,显然

如果B’ 为非奇异矩阵,那么就可以通过如下逆变换得到原始数据报,完成恢复。

设计RS码的关键在于怎样设计生成矩阵B,也就是其系数矩阵G。本方案使用Vandermonde矩阵来构建系数矩阵G。常规定义Vandermonde矩阵V,r x k 维,如下所示:

系数矩阵G=V,该矩阵元素的运算都是在有限域GF(2^8)中进行的。Gij(i=0,1,...,r-1; j=0,1,...,k-1)为系数矩阵的元素,Ci(i=1,2,。。。,r)表示第i个冗余包,Dj(j=1,2,。。。,k)表示第j个原始媒体包,根据下式:

上式运算时以包分割后的数据为运算单位的,模运算使用查表方式实现。例如发端使用k=6,r=2的荣誉模式,那么对应的系数矩阵为:

根据上面系数矩阵,可以计算得到冗余包为:

生成冗余包C1C2,发送端就可以一次发送原始媒体包和冗余包。如果发送的途中原始媒体包D3,D4丢失,那么接收端就可以根据收到的包恢复丢失的原始媒体包,具体过程如下:

  • 由于接收到的原始媒体包再次产生冗余包:

  • 将其与接收到的冗余包作比较,就能得到丢失的原始媒体包的表达式:

  • 要求出D3、D4,可利用高斯消除法求出系数矩阵 的逆 矩阵,前提是该矩阵是非奇异的。

传统的Vandermonde矩阵构造RS码是,需要非奇异矩阵,由于Vandermonde矩阵元素取值与有限域,且元素的运算遵循有限域的运算规则,就会存在一定概率出现矩阵奇异,用该矩阵构造的纠错码就不是RS码,不能从任意k个包中恢复出原始媒体包。为此长沙这位大婶对该传统Vandermonde矩阵进行改进,解决了矩阵概率奇异的问题,具体实现见代码。

3)私有协议/RTP与FEC的结合,下文继续讲解

FEC之我见二的更多相关文章

  1. FEC之我见四

    接上文,来详细的说明一下FEC前向纠错的具体实现: FEC_matrix是一个比较常用的算法,Vandermonde,范德蒙矩阵是法国数学家范德蒙提出的一种各列为几何级数的矩阵. 范德蒙矩阵的定义: ...

  2. FEC之我见三

    继续上文讲解: 3) 标准的RTP头结构如下所示: 其中第一个字节中的x标志位是否扩展了RTP头,RTP协议允许用户自定义的扩展,扩展的字段紧挨上述RTP固定头.RTP扩展投中承载如下信息: 1).当 ...

  3. FEC之我见一

    顾名思义,FEC前向纠错,根据收到的包进行计算获取丢掉的包,而和大神沟通的结果就是 纠错神髓:收到的媒体包+冗余包 >= 原始媒体包数据   直到满足 收到的媒体包+ 冗余包 >= 原始媒 ...

  4. Spring Mvc 源代码之我见 二

    上一篇简单介绍了spring mvc 的一些基本内容 和DispatcherServlet 的doc.这一篇将会继续写我对Spring Mvc 源代码的理解.直接上代码: /** * This imp ...

  5. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  6. RENIX 软件RAW流发送——网络测试仪实操

    本文主要介绍了RENIX软件如何进行RAW流发送操作.文章通过预约端口.添加RAW流.修改负载.发送流量.查看流统计.数据包捕获六个步骤详细介绍了操作过程. 步骤一:预约端口.1.先安装RENIX软件 ...

  7. 56-混沌操作法之我见:二、AO、AC指标.(2015.2.9)

    混沌操作法之我见:二.AO.AC指标 先看看其算法: Y=(H+L)/2: AO=MA(Y,5)-MA(Y,34): AC=AO-MA(AO,5). 由算法可以看出,AO表示的是近5期的综合价格与近3 ...

  8. 利用Hadoop实现超大矩阵相乘之我见(二)

    前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...

  9. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...

随机推荐

  1. 贝塞尔曲线与CAShapeLayer的关系以及Stroke动画

    1.贝塞尔曲线与CAShapeLayer的关系    1.1CAShapeLayer须要一个形状才干生效,贝塞尔曲线能够创建基于矢量的路径.进而能够给CAShapeLayer提供路径,路径会闭环.   ...

  2. ajax 和jsonp 不是一码事 细读详解

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  3. eclipse tasks

    tasks可以在代码里增加标识,通过tasks view可以快速的找到这些标识的地方,有助于提高开发效率和代码管理. 通过Eclipse的 Window==>Show View==>Tas ...

  4. Linux下安装 activemq 并指定jdk 1.8

    1. 下载安装包 <apache-activemq-5.15.4-bin.tar.gz> 下载地址:https://pan.baidu.com/s/18xzjBAchjWqsHNA1HuY ...

  5. WCF基础之消息协定

    通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1.插入自定义soap标头:2.另一种是定义消息的头和正文的安全属性.消息协定通过MessageContra ...

  6. WCF基础之承载服务和生成客户端

    wcf的承载有三种iis.was和自承载,它们如何承载园子里有很多,就不多赘述. 自iis7以后iis支持http和非http的协议,使用iis承载服务与其他两种承载相比,我觉的最明显的是was和自承 ...

  7. iOS 邓白氏编码的申请

    http://www.cocoachina.com/ios/20161214/18225.html

  8. Linux安装Nignx基于域名的多虚拟主机实战

    看这个文章之前,要保证你的Nginx已经安装成功! 如果没有,请移步到下面这个文章,看完后再回来看! https://www.cnblogs.com/apollo1616/p/10214531.htm ...

  9. 我的Java开发学习之旅------>Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  10. leetcode第一刷_Best Time to Buy and Sell Stock II

    这道题尽管是上一道题的增强.可是反而简单了. 能够交易无数次,可是买卖必须成对的出现. 为了简单起见.我用abc三股股票来说明,且忽略掉相等的情况.三个数一共同拥有六种大小关系.注意他们之间的先后顺序 ...