基于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)表示iDi在伽罗华域的乘法运算。

接收端

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

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

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

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

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

其中gfm()函数表示伽罗华域乘法运算,gfm(i,Di)表示在伽罗华域的乘法运算i*Digfd()函数表示伽罗华域除法运算,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算法——附录》

FEC介绍(三)—算法推导【转载】相关推荐

  1. 收藏 | 人人都能看懂的LSTM介绍及反向传播算法推导

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:陈楠 来源:知乎 链接:https://zhuanla ...

  2. 最小二乘拟合的三种算法推导及Python代码

    目录 1 最小二乘拟合(方法一) 1.1 数学推导 1.2 算例 1.3 Python 代码 2.最小二乘拟合(方法二) 2.1 数学推导 2.2 算例 2.3 Python 代码 3 最小二乘法拟合 ...

  3. CSK与KCF算法推导(三)

      本文是CSK与KCF算法推导的第三篇,主要介绍算法的主体部分推导. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 (本文)C ...

  4. SVD在推荐系统中的应用详解以及算法推导

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推导已经把SVD的过程讲的很清楚了,本文介 ...

  5. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> "我是谁,我在哪? ...

  6. CSK与KCF算法推导(二)

      本文是CSK与KCF算法推导的第二篇,主要介绍标量对向量求导.核函数.岭回归问题求解等内容. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 (本文)CSK与KCF算法推导(二)--带 ...

  7. REDIS09_LBS出现背景、GEO算法介绍、算法步骤、剖析、邻近网格位置推算

    文章目录 ①. LBS出现的背景 ②. 重新认识经纬度 ③. 感性认识GeoHash ④. Geohash算法介绍 ⑤. Geohash算法步骤 ⑥. 更深入剖析GeoHash ⑦. 邻近网格位置推算 ...

  8. AI从入门到放弃:BP神经网络算法推导及代码实现笔记

    作者 | @Aloys (腾讯员工,后台工程师) 本文授权转自腾讯的知乎专栏 ▌一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤 ...

  9. CSK与KCF算法推导(四)

      本文是CSK与KCF算法推导的第四篇,主要介绍将前面推导采用的一维情况推广到二维. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题 ...

最新文章

  1. 个人贷款的条件、流程和注意事项
  2. code3289 花匠
  3. 创文html5作品,【《创文故事》纪录短片入围作品展播之七】引路人
  4. 计算机主机核心通常包括,计算机一级考试题库选择题
  5. 最年轻图灵奖女性得主:谁说女的数学都比男的差
  6. 苹果将在内华达州里诺市再购地块 都是为了它
  7. 华中科技计算机基础第五次,华中科技大学c++第5次上机作业
  8. go语言结构体标签的意义
  9. 更快更高更强大,这是英特尔AI助力长城修缮的新进展
  10. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_1.页面发布-需求分析...
  11. 一个asp.net聊天是源码
  12. 好用的mysql数据字典工具
  13. SPSS编程-统计自动化-VBA脚本开发
  14. ISO 18000-6c 访问标签--应用程序访问操作ISO 18000-6C标签的方法
  15. Excel Rate 函数的java 实现,等额本息计算反推利率
  16. 什么是Bugly?Android热更新的初讲解
  17. ESLint 格式化程序
  18. 小程序生成自带参数的小程序码
  19. 《Android软件安全权威指南》原生程序分析 阅读笔记
  20. Unity2D—骨骼绑定、IK系统、动画(一)

热门文章

  1. 数据结构 小顶堆建堆过程 构建过程
  2. 存储过程中的in out in out 三种类型的参数
  3. mmdetection 报错 KeyError: ‘xxx is not in the models registry‘
  4. Problem C. L04-03 n阶勒让德多项式的值(递归)---初学简单版
  5. 灰度图像复原——空间滤波——修正后的阿尔法均值滤波器(Matlab)
  6. 二次供水泵站远程监测解决方案
  7. 使用python+numpy+scipy进行图像处理实战
  8. oracle 分隔符 0x05,sqlserver2005导出到oracle10错误 0xc0202009: 数据流任务 ROW-00060
  9. 基于ODU恢复truncate表的总结操作
  10. css 选择器 第一个class_【零基础上手JavaWeb】CSS小白学习笔记