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编码容器的指针

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169582.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • voliate Synchronized Lock

    voliate Synchronized Lock参考文章:https://blog.csdn.net/huyiju/article/details/97126274一、voliate相关1:java内存模型1.1:计算机的内存模型在计算机的内存模型中cpu和内存之间的速度存在数量级所以引入了高速缓存,告诉缓存会导致到底以哪个处理器的缓存为主,同步到主内存,这个时候有有了缓存一致性协议,来保证缓存一致性。指令重排:例如一下五行代码,前四行的在计算机cpu的执行顺序不一定是12345,也可以是13245或者34125,但是第五步的顺序不会变,这种

    2022年5月29日
    29
  • SQL学习规划

    SQL学习规划知乎话题:如何学习SQL语言?赵立新和猴子的回答挺好的! 

    2022年8月20日
    8
  • java nio 详_java NIO 详解

    java nio 详_java NIO 详解JavaNIO(NewIO)是从Java1.4版本开始引入的一个新的IOAPI,可以替代标准的JavaIOAPI。本系列教程将有助于你学习和理解JavaNIO。JavaNIO提供了与标准IO不同的IO工作方式:ChannelsandBuffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总…

    2022年7月7日
    18
  • 只读挂载磁盘linux,linux挂载磁盘就变只读怎么解决

    只读挂载磁盘linux,linux挂载磁盘就变只读怎么解决Linux系统挂载存储变成只读的解决方案:1、mount:用于查看哪个模块输入只读,一般显示为:[root@localhost~]#mount/dev/cciss/c0d0p2on/typeext3(rw)procon/proctypeproc(rw)sysfson/systypesysfs(rw)devptson/dev/ptstypedevpts(r…

    2022年6月19日
    20
  • 安装anaconda和pycharm_anaconda安装pycharm

    安装anaconda和pycharm_anaconda安装pycharm目标:实现pycharm上操作Anaconda环境:系统:window7pycharm:2019步骤:1.下载:如果打算安装Anaconda,需要卸载之前安装的Python(如果不想卸载,参考博客,不过这个实在有点长,我没看完都),因为Anaconda是一个集成环境,所以是自带Python的,下载Anaconda,这个是官网:如图:根据电脑型号,选择版本,这里建议选择3.x…

    2022年8月27日
    3
  • iOS_UIButton 简单操作

    iOS_UIButton 简单操作

    2022年1月20日
    35

发表回复

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

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