大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
1概念和原理
前向纠错
前向纠错也叫前向纠错码(Forward Error Correction,简称FEC),是增加数据通讯可信度的方法。在单向通讯信道中,一旦错误被发现,其接收器将无权再请求传输。FEC 是利用数据进行传输冗余信息的方法,当传输中出现错误,将允许接收器再建数据。
常用的前向纠错码
电视节目广播前向纠错采用2/3码率格形码、卷积交织码RS码构成的级联码。RS(209,187)分组码是截短的RS(255,233)分组码,可以纠正11B的传输误码。为了减少突发脉冲干扰所造成的连续误码的影响,DMB-T传输系统在内码和外码之间插入了卷积交织编码(B=19,M=22),总时延相当于36个RS(209,187)分组码。
多媒体综合数据业务服务的前向纠错采用的是多层分组乘积码(Multi-levelBlockProductCode)。它是由分组乘积码BPC(3762,2992)构成的一种系统码,是二维分组乘积码BPC(4096,3249)的删余截短,其解码器可以采用高性能Turbo算法。
影响FEC性能三个主要因素
FEC的使用可以有效提高系统的性能,根据香农定理可以得到噪声信道无误码传输的极限性能(香农限)。FEC方案的性能主要由编码开销、判决方式、码字方案这三个主要因素决定。
(1)编码开销:校验位长度(n-k)与信息位长度k的比值,称为编码开销。开销越大,FEC方案的理论极限性能越高,但增加并不是线性的,开销越大,开销增加带来的性能提高越小。开销的选择,需要根据具体系统设计的需求来确定。
(2)判决方式:FEC的译码方式分为硬判决译码和软判决译码两种。硬判决FEC译码器输入为0,1电平,由于其复杂度低,理论成熟,已经广泛应用于多种场景。软判决FEC译码器输入为多级量化电平。在相同码率下,软判决较硬判决有更高的增益,但译码复杂度会成倍增加。微电子技术发展到今天,100G吞吐量的软判决译码已经可以实现。随着传送技术的发展,100G时代快速到来,软判决FEC的研究与应用正日趋成熟,并将在基于相干接收的高速光通信中得到广泛应用。
(3)码字方案:当确定开销和判决方式后,设计优异码字方案,使性能更接近香农极限,是FEC的主要研究课题。目前,软判决LDPC码,由于其良好的纠错性能,且非常适合高并行度实现,逐步成为高速光通信领域主流FEC的方案
第三代FEC是高性能传输的关键
FEC在光纤通信中的应用研究起步较晚,从1988年Grover最早将FEC用于光纤通信开始,光纤通信中的FEC应用可分为三代。
第一代FEC:采用经典的硬判决码字,例如汉明码、BCH码、RS码等。最典型的代表码字为RS(255,239),开销6.69%,当输入BER为1.4E-4时输出BER为1E-13,净编码增益为5.8dB。RS(255,239)已被推荐为大范围长距离通信系统的ITU-T G.709 标准,可以很好匹配STM16帧格式,获得了广泛应用。1996年RS(255,239)被成功用于跨太平洋、大西洋长达7000km的远洋通信系统中,数据速率达到5Gbit/s。
第二代FEC:在经典硬判决码字的基础上,采用级联的方式,并引入了交织、迭代、卷积的技术方法,大大提高了FEC方案的增益性能,可以支撑10G甚至40G系统的传输需求,许多方案性能均达到8dB以上。ITU-T G .975.1中推荐的FEC方案可以作为第二代FEC的代表。
现有10G系统多采用第二代硬判决FEC,采用更大开销的硬判决FEC可以支撑现有系统的平滑升级。例如,10G海缆传输系统目前采用ITU-T G .975.1推荐的开销为6.69%的硬判决FEC方案,若采用20%开销的高性能硬判决FEC,较现有方案可提高1.5dB左右的编码增益,极大改善系统的性能。
第三代FEC:相干接收技术在光通信中的应用使软判决FEC的应用成为可能。采用更大开销(20%或以上)的软判决FEC方案,如Turbo 码、LDPC 码和TPC码,可以获得大于10dB的编码增益,有效支撑40G、100G至400G的长距离传输需求。
2开源库选取
目前找到了两种方案:
1、使用openfec http://openfec.org/accueil.html
但是该开源库代码量比较大,用起来也有点费事;编译通过cmake进行编译成一动态库(or静态库),window下cygwin内置cmake,可以顺利的编译(查看其readme),但是移植到android等其它ARM平台时比较麻烦;
2、使用更加小巧的feclib http://feclib.sourceforge.net/
该算法也是开源的,但是代码量比较小,只需在工程中添加其相关的几个代码文件即可;
不过该算法不能纠正数据包内部的错误,直接通过冗余包找到丢失的数据包;如果需要纠正数据包内部的错误,其官网推荐了另外一个算法RSCODE http://rscode.sourceforge.net/
目前我们选择用的是第二个开源库FECLIB
3FECLIB接口介绍
FEC编码相关接口
fecEncoder *NewFecEncoder (void *userData,
size_t (*userSend)(void *buf,size_t size, size_t count, void *userData),
char **errorMessage,
int s, int n, int k, int w, intg, int b)
函数说明:
函数功能:创建一个FEC编码容器
返回值:返回一个创建的FEC编码容器指针,后续的FEC编码需要用到此指针
参数说明:
userData 表示用户自定义的数据
userSend 数据在FEC编码后用于发送的回调函数
errorMessage 函数失败后的失败信息
s 表示每个数据包的大小
n 表示要发送的一组数据包的个数
k 表示每组数据包中要发送冗余包的个数
w 表示带型矩阵带宽的宽度
g 表示伽罗瓦域的大小
b 表示FEC编码器每秒应该限制输出的比特数
void FecEncode (fecPayload *buf, fecEncoder *f)
函数说明:
函数功能:把数据进行FEC编码
返回值:无
参数说明:
buf 表示需要FEC编码的数据
f 表示FEC编码容器的指针
FEC解码相关接口
fecDecoder *NewFecDecoder (void *userData, void (*userReceive)(
void *userData, __int64_tposition, fecPayload *buf, int len))
函数说明:
函数功能:创建一个FEC容器
返回值:返回一个创建的FEC容器指针,后续的FEC编码需要用到此指针
参数说明:
userData表示用户自定义的数据
userReceive数据在FEC解码后处理的回调函数
size_t FecDecode (void *buf, size_t size, size_t count, fecDecoder *f)
函数说明:
函数功能:把数据进行FEC编码
返回值:无
参数说明:
buf 表示需要进行FEC解码的数据
size 表示每次进行FEC解码的长度
count 表示FEC解码的次数 size*count必须为buf的大小
f 表示FEC编码容器的指针
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169582.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...