前面简单说了一下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. 【JavaScript】BOM和DOM

    在第一篇JavaScript视频总结博客中.是对JavaScript做了一个宏观的认识.当中,不知道大家可否还记得.JavaScript的核心部分包含哪些? JavaScript的核心部分主要包含三个 ...

  2. 2015年11月26日 Java基础系列(七)正则表达式Regex

    package com.demo.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @autho ...

  3. 如何将cordova导入Android studio,只需两步即可

    Cordova的技术交流新群 微信公众号:

  4. oracle decode的用法

    需求:分别统计emp表中1980,1981,1982,1987年入职的同事的数量. 这里用decode很容易就解决了: select sum(t.num_1980) as "1980&quo ...

  5. spark的若干问题

    问题1:SPARK与HADOOP之间的关系? spark是一种高效处理hadoop分布式数据的处理引擎.借助hadoop的yarn框架,spark就可以运行在hadoop集群中.同时spark也可以处 ...

  6. basic--factory

    <?php /* 工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例: 工厂类是指包含了一个专门用来创建其他对象的方法的类.所谓按需分配,传入参数进行选择,返回具体的类.工厂模式的最主要 ...

  7. Android shape制作圆角、虚线、渐变

    xml控件配置属性 android:background="@drawable/shape" 标签 corners ----------圆角 gradient ---------- ...

  8. 【leetcode刷题笔记】Largest Rectangle in Histogram

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  9. 如何在 Eclipse 中使用命令行

    虽然我们已经有了像 Eclipse 这样高级的 IDE,但是我们有时候也是需要在开发的时候使用 Windows 的命令行,来运行一些独立的程序.在两个程序中切换来切换去是很麻烦的.所以 Eclipse ...

  10. BestCoder 1st Anniversary 1004 Bipartite Graph 【二分图 + bfs + 良好的逻辑思维 】

    题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=610&pid=1004 问题描述 Soda有一个$ ...