FEC相关知识「建议收藏」

FEC相关知识「建议收藏」1概念和原理前向纠错前向纠错也叫前向纠错码(ForwardErrorCorrection,简称FEC),是增加数据通讯可信度的方法。在单向通讯信道中,一旦错误被发现,其接收器将无权再请求传输。FEC是利用数据进行传输冗余信息的方法,当传输中出现错误,将允许接收器再建数据。常用的前向纠错码(1)电视传输专用的前向纠错码电视节目广播前向纠错采用2/3码率格形码、卷积交织

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1概念和原理

前向纠错

前向纠错也叫前向纠错码(Forward Error Correction,简称FEC),是增加数据通讯可信度的方法。在单向通讯信道中,一旦错误被发现,其接收器将无权再请求传输。FEC 是利用数据进行传输冗余信息的方法,当传输中出现错误,将允许接收器再建数据。

常用的前向纠错码

(1)电视传输专用的前向纠错码

电视节目广播前向纠错采用2/3码率格形码、卷积交织码RS码构成的级联码。RS(209187)分组码是截短的RS(255233)分组码,可以纠正11B的传输误码。为了减少突发脉冲干扰所造成的连续误码的影响,DMB-T传输系统在内码和外码之间插入了卷积交织编码(B=19M=22),总时延相当于36RS(209187)分组码。

(2)多媒体传输的前向纠错码

多媒体综合数据业务服务的前向纠错采用的是多层分组乘积码(Multi-levelBlockProductCode)。它是由分组乘积码BPC(37622992)构成的一种系统码,是二维分组乘积码BPC(40963249)的删余截短,其解码器可以采用高性能Turbo算法。

 

影响FEC性能三个主要因素

FEC的使用可以有效提高系统的性能,根据香农定理可以得到噪声信道无误码传输的极限性能(香农限)。FEC方案的性能主要由编码开销、判决方式、码字方案这三个主要因素决定。

1)编码开销:校验位长度(n-k)与信息位长度k的比值,称为编码开销。开销越大,FEC方案的理论极限性能越高,但增加并不是线性的,开销越大,开销增加带来的性能提高越小。开销的选择,需要根据具体系统设计的需求来确定。

2)判决方式:FEC的译码方式分为硬判决译码和软判决译码两种。硬判决FEC译码器输入为01电平,由于其复杂度低,理论成熟,已经广泛应用于多种场景。软判决FEC译码器输入为多级量化电平。在相同码率下,软判决较硬判决有更高的增益,但译码复杂度会成倍增加。微电子技术发展到今天,100G吞吐量的软判决译码已经可以实现。随着传送技术的发展,100G时代快速到来,软判决FEC的研究与应用正日趋成熟,并将在基于相干接收的高速光通信中得到广泛应用。

3)码字方案:当确定开销和判决方式后,设计优异码字方案,使性能更接近香农极限,是FEC的主要研究课题。目前,软判决LDPC码,由于其良好的纠错性能,且非常适合高并行度实现,逐步成为高速光通信领域主流FEC的方案

 

第三代FEC是高性能传输的关键

FEC在光纤通信中的应用研究起步较晚,从1988Grover最早将FEC用于光纤通信开始,光纤通信中的FEC应用可分为三代。

第一代FEC:采用经典的硬判决码字,例如汉明码、BCH码、RS码等。最典型的代表码字为RS255239),开销6.69%,当输入BER1.4E-4时输出BER1E-13,净编码增益为5.8dBRS255239)已被推荐为大范围长距离通信系统的ITU-T G.709 标准,可以很好匹配STM16帧格式,获得了广泛应用。1996RS255239)被成功用于跨太平洋、大西洋长达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的编码增益,有效支撑40G100G400G的长距离传输需求。

 

2开源库选取

目前找到了两种方案:

1、使用openfec    http://openfec.org/accueil.html

    但是该开源库代码量比较大,用起来也有点费事;编译通过cmake进行编译成一动态库(or静态库),windowcygwin内置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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号