FEC算法

2024-05-08 11:58
文章标签 算法 fec

本文主要是介绍FEC算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


基于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 :2^{8})运算,则可将加减法运算化为异或运算,因此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(2^{8}))运算,可以将加减法变为异或操作,乘除法变为加减法的查表操作;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(2^{8}))运算,可以将加减法变为异或操作,乘除法变为加减法的查表操作。


 

注: 

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

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

【3】 相关的伽罗华域(gf(2^{8}))运算和矩阵运算请参考《FEC算法——附录》

 

这篇关于FEC算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970253

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: