FEC算法,cm256 或者OpenFEC ?

FEC算法,cm256 或者OpenFEC ?

<<前向纠错FEC算法实现原理>>,这篇文章详细介绍了FEC算法的原理,之前根据这个原理实现过一个FEC算法,仅支持特定k、h组合,上线有一定的优化效果。随着对用户网络质量的进一步分析,VoIP通话场景在传输信道上很容易受到噪声影响,产生丢包。

VoIP场景较传统的互联网CS业务相比,数据的发送端和接收端都在用户侧,还使用不可靠传输协议,更容易因网络波动、路由器异常产生连续丢包。因此,发送端的FEC(冗余编码)需要支持更多的k、h组合,以抵抗用户网络带来的丢包问题,例如 两倍冗余(2+4)、八倍冗余(2+16)。

我们需要实现一套新的FEC算法,支持更多的k、h组合。经过调研发现,FEC算法在业界已经有了一些比较成熟的开源方案,例如,Cm256、OpenFEC

cm256算法指的是利用柯西矩阵(cauchy matrix)实现的纠删码的FEC冗余技术,支持k + h < 256以下任意FEC组合。 根据开源文档介绍cm256,传统的矩阵求逆会使用到高斯消元,时间复杂度为O(N^3)。为了加速计算逆矩阵的过程cm256应用了O(N^2) LDU-decomposition algorithm  。

OpenFEC 是一个支持多种FEC实现的开源项目,支持GF(28)、GF(2m)、LDPC-staircase stable codec,矩阵求逆使用的是高斯消元,项目有自己的官方网站,最新的版本是2014年开发的v1.4.2 版本。

初步浏览代码,两种算法的实现都比较精巧,对CPU、内存的使用都有严苛的限制,矩阵运算并行处理128位,性能优化比较充分,这是值得借鉴的地方。我们需要对两种算法进行PK。验证在相同丢包率下,两种算法恢复后的丢包率、恢复耗时,以便于决策采用哪种算法。验证方法模拟用户使用场景。

FEC验证方法

实验条件为,发送端通过本地socket 向接收端发送数据和冗余包,网络传输中模拟随机丢包,接收端根据数据包和冗余包进行丢包恢复,计算出恢复后的丢包率。主要对比内容为,相同丢包率下的恢复后丢包率、恢复延时对比

这两张图中包括OpenFEC、cm256算法,Theoretical。Theoretical表示发送与冗余包同等数量的数据包,例如FEC 采用4 +8,则对于Theoretical类型来说,同一个数据包就会发送相同的2份,这样4个数据包也会有8个冗余包。从图中可以看出,恢复后丢包率与FEC中k、h的组合有强相关。

  • 冗余倍数越高,FEC恢复能力越强。
  • OpenFEC和cm256 在采用相同的k、h组合时,恢复后丢包率相同,恢复能力没有差异。
  • 冗余比例相同的情况下,Theoretical(数据包重复发送)的恢复能力,在丢包率小于20%以下与FEC接近,超过20%要弱于FEC。
  • 冗余比例相同的情况下,冗余包的个数越多,FEC恢复能力越强,但恢复延时也在增大。与FEC实现原理基本一致

上面的测试无法区分出这两种FEC恢复成功率的差异,我们选取数据包大小为1200字节,验证相同丢包率的FEC恢复延时变化,延时越大说明性能较差。测试的主要结论如下。

  • FEC的冗余比例越高,恢复延时越大。
  • 同等冗余比例下,丢包率越高恢复延时越大。
  • 相同冗余级别下,cm256的恢复延时要小于openfec,cm256的性能优化更好。

综合丢包恢复能力、恢复延时对比,OpenFEC和cm256的抗丢包能力保持一致,但是cm256恢复延时更小,算法内部优化更胜一筹,适合性能要求较高的SFU场景。

欢迎关注右上角个人公众号,交流更多技术问题。

发表评论

邮箱地址不会被公开。 必填项已用*标注