精华内容
下载资源
问答
  • 信道编码

    2020-06-20 17:17:10
    一般可以将信道编码方法分为两大类:分组码和卷积码。在分组编码中,将长度为k的二进制信道输出序列映射为长度为n的二进制信道输入序列,因此所得到的码率就是每次传输k/n比特。这样的一种码称为(n,k)分组码,并由...

    在有噪声信道上通信将产生差错。为了减少差错的影响并实现可靠的通信,有必要使发射的序列尽量不同,以使信道噪声不会将一个序列变成另一个序列。这就意味着不得不引入某些冗余度,以提高通信的可靠性。冗余度的引入会导致额外的比特传输,从而降低传输速率。
    一般可以将信道编码方法分为两大类:分组码卷积码。在分组编码中,将长度为k的二进制信道输出序列映射为长度为n的二进制信道输入序列,因此所得到的码率就是每次传输k/n比特。这样的一种码称为(n,k)分组码,并由长度为n的2k2^k个码字组成,通常记为c1,c2,c3c2kc_1,c_2,c_3\ldots c_{2^k}。信源输出映射为信道输入是独立完成的,而编码器输出仅取决于当前长度为k的输入序列,与先前的输入序列无关。在卷积编码中,长度为k0k_0的信源输出映射为长度为n0n_0的信道输入,但是该信道输入不仅与最近的k0k_0个信源输出有关,还与前面的(L1)k0(L-1)k_0个编码器输入有关。

    简单重复码

    最简单的一种分组码是简单重复码,其中有两个消息要在二元对称上传输,对这两个消息不用0和1传输,而是用由全0和全1组成的两个序列来传输。这两个序列的长度选为某个奇数n,其编码方法如下:
    0>00001>11110->00\ldots00\\1->11\ldots 11
    译码是按照简单多数表决的方式进行的;也就是说,如果接收符号大多数是1,译码器就判决为1;如果接受符号大多数是0,译码器就判决为0。
    如果接收到的传输符号至少有(n+1)/2个是错误的,就会发生差错。因为信道是交叉概率为c的二元对称信道。要想将差错降为0,就要增加利用信道的次数,因此传输速率将降为0。

    线性分组码

    线性分组码是最重要和应用最广泛的一类分组码。如果任意两个码字的线性组合还是一个码字,这种分组码就是线性的。在二进制情况下,这就意味着任意两个码字的和还是一个码字。在线性分组码中,码字形成n维空间的一个k维子空间。线性分组码是利用它们的生成矩阵G来描述的,它是一个k*n的二进制矩阵,以使每个码字c都能写成如下形式:
    c=uGc=uG
    其中,u是长度为k的二进制数据序列(编码器输入)。很显然,长度为n的全0序列总是(n,k)线性分组码的一个码字。
    线性分组码的一个重要参数就是最小码距,它决定了该码的纠错能力,定义为任意两个码字之间的最小Hamming距离。码的最小距离表示为dmind_{min},即有
    dmin=mini!=jdH(ci,cj)d_{min}=min_{i!=j}d_H(c_i,c_j)
    对于线性码,最小距离等于码的最小权重,定义为
    wmin=minci!=0w(ci)w_{min}=min_{c_i!=0}w(c_i)
    也就是说,在任何非零码字中1的最少个数。
    如果生成矩阵具有G=[IkP]G=[I_k|P]那么线性分组码就具有规则形式,其中,IkI_k代表kkk*k的单位矩阵,而P代表k(nk)k*(n-k)的矩阵。在一个规则码中,一个码字的前k个二进制符号是信息比特,而余下的n-k个二进制符号是奇偶校验符号。
    码字的奇偶校验矩阵是一个任意(n-k)*n维二进制矩阵H,使得对全部码字c有cHT=0cH^T=0显然GHT=0GH^T=0并且,如果G具有规则形式,则H=[PTIk]H=[P^T|I^k]

    Hamming码

    Hamming是最小距离为3的(2m1,2mm12^m-1,2^m-m-1)线性分组码,并且有一个简单的奇偶校验矩阵。奇偶校验矩阵是m(2m1)m*(2^m-1)的矩阵,除去全0序列以外,用长为m的所有二进制序列作为它的列。例如,对于m=3,有一个(7,4)码,它的规则形式的奇偶校验矩阵为
    在这里插入图片描述

    展开全文
  • 简介 随着数据的存储呈现出集中化(以分布式存储系统为基础的云存储系统)和移动化(互联网移动终端)...比如3副本下,存储开销为3,因为同样的数据被存储了三份,而在10+3(将原始数据分为10份,计算3份冗余)的纠删

    简介

    随着数据的存储呈现出集中化(以分布式存储系统为基础的云存储系统)和移动化(互联网移动终端)的趋势,数据可靠性愈发引起大家的重视。集群所承载的数据量大大上升,但存储介质本身的可靠性进步却很小,这要求我们必须以更加经济有效的方式来保障数据安全。

    副本与纠删码都是通过增加冗余数据的方式来保证数据在发生部分丢失时,原始数据不发生丢失。但相较于副本,纠删码能以低得多的存储空间代价获得相似的可靠性。比如3副本下,存储开销为3,因为同样的数据被存储了三份,而在10+3(将原始数据分为10份,计算3份冗余)的纠删码策略下,存储开销为为1.3。采用纠删码能够极大地减少存储系统的存储开销,减少硬件、运维和管理成本,正是这样巨大的收益驱使各大公司纷纷将纠删码应用于自己的存储系统,比如Google、Facebook、Azure、EMC等等国际巨头,在国内以淘宝、华为、七牛云等为代表的公司也在自己的存储系统上应用了纠删码。

    最典型的纠删码算法是里德-所罗门码(Reed-Solomon码,简称RS码)。RS码最早应用于通信领域,经过数十年的发展,其在存储系统中得到广泛应用,比如光盘中使用RS码进行容错,防止光盘上的划痕导致数据不可读;生活中经常使用的二维码就利用了RS码来提高识别的成功率。近年RS码在分布式存储系统中的应用被逐渐推广,一方面是分布式存储系统存储的存储容量和规模增大的需求;另一方面是由于纠删码编码速度在近年得到迅猛提升。随着对高性能纠删码引擎在实际系统中应用需要,也催生了对纠删码在具体系统中实现的各种优化手段。并为相关的决策者带来了困扰——究竟什么样的编码引擎才是高效的呢?

    我们将以这个问题展开对纠删码技术的剖析,帮助企业更全面,深入的了解纠删码在存储系统中的应用并更好地做出技术选型。本系列文章将从纠删码的基本原理开始,随后引出如何判断编码引擎优劣这个问题,接下来将深度分析代码实现,帮助开发者顺利完成定制开发。

    一、纠删码编码原理

    在展开分析之前,我们先来看一看RS码是如何工作的。

    编码:
    为了计算冗余数据,首先我们需要选举出一个合适的编码矩阵。编码矩阵的上部为一个单位矩阵,这样保证了在编码后原始数据依然可以直接读取。通过计算编码矩阵和原始数据的乘积,可以到最终的结果。

    解码:
    当数据块发生丢失,在编码矩阵中去掉相应行,等式仍然保持成立。这为我们接下来恢复原始数据提供了依据。
    为了恢复数据,首先我们求剩余编码数据的逆矩阵,等式两边乘上这个逆矩阵仍然保持相等。与此同时,互逆矩阵的乘积为单位矩阵,因此可以被消掉。那么所求得的逆矩阵与剩余块的数据的乘积就是原始数据了。

    文章后面会给出具体的编码解码计算示例;这里只做理论说明;

    数据编码以字节为单位,如果将被编码数据看做一个「数组」,「数组」中每个元素是一个字节,数据按照字节顺序被编码。编码过程是计算编码矩阵中元素和「数组」的乘积过程。为保证乘积的运算结果仍旧在一个字节大小以内(即0-255),必须应用到有限域。有限域上的算术运算不同于通常实数的运算规则。我们通常事先准备好乘法表,并在算术运算时对每一次乘法进行查表得到计算结果。早期的编码引擎之所以性能不佳,是因为逐字节查表的性能是非常低的。倘若能一次性对多字节进行查表以及相应的吞吐和运算,引擎的工作效率必将大幅度提升。

    许多CPU厂商提供了包含更多位数的寄存器(大于64位),这类寄存器和相应支持的运算使得用户程序可以同时对大于机器位数的数据进行运算,支持这类寄存器和运算的指令称之为SIMD(SingleInstructionMultipleData)指令集,比如Intel支持的SSE指令集最大支持128bits的数据运算,AVX2指令集最大支持512bits的数据运算。它们为我们对一个「数组」数据分别执行相同的操作,提高了数据运算的并行性。目前,市面上所有高性能的纠删码引擎均采用了该项技术以提高编解码性能。

    1. 数学理论工程化

    以RS码为例,纠删码实现于具体的存储系统可以分为几个部分:编码、解码和修复过程中的计算都是在有限域上进行的;编码过程即是计算生成矩阵(范德蒙德柯西矩阵)和所有数据的乘积;解码则是计算解码矩阵(生成矩阵中某些行向量组成的方阵的逆矩阵)和重建数据的乘积。

    1.1有限域运算

    有限域是纠删码中运算的基础域,所有的编解码和重建运算都是基于某个有限域的。不止是纠删码,一般的编码方法都在有限域上进行,比如常见的AES加密中也有有限域运算。使用有限域的一个重要原因是计算机并不能精确执行无限域的运算,比如有理数域和虚数域

    此外,在有限域上运算另一个重要的好处是运算后的结果大小在一定范围内,这是因为有限域的封闭性决定的,这也为程序设计提供了便利。比如在RS中,我们通常使用GF(28),即0~255这一有限域,这是因为其长度刚好为1字节,便于我们对数据进行存储和计算。

    在确定了有限域的大小之后,通过有限域上的生成多项式可以找到该域上的生成元,进而通过生成元的幂次遍历有限域上的元素,利用这一性质我们可以生成相应的指数表。通过指数表我们可以求出对数表,再利用指数表与对数表最终生成乘法表

    有了乘法表,我们就可以在运算过程中直接查表获得结果,而不用进行复杂的多项式运算了。同时也不难发现,查表优化将会成为接下来工作的重点与难点。

    1.2选择生成矩阵

    生成矩阵(GM,generatormatrix)定义了如何将原始数据块编码为冗余数据块,RS码的生成矩阵是一个n行k列矩阵,将k块原始数据块编码为n块冗余数据块。如果对应的编码是系统码(比如RAID),编码后包含了原始数据,则生成矩阵中包含一个k×k大小的单位矩阵和(n−k)×k的冗余矩阵,单位矩阵对应的是原始数据块,冗余矩阵对应的是冗余数据块。非系统码没有单位矩阵,整个生成矩阵都是冗余矩阵,因此编码后只有冗余数据块。通常我们会使用系统码以提高数据提取时的效率,那么接下来我们需要找到合适的冗余矩阵

    在解码过程中我们要对矩阵求逆,因此所采用的矩阵必须满足子矩阵可逆的性质。目前业界应用最多的两种矩阵是Vandermondematrix(范德蒙矩阵)Cauchymatrix(柯西矩阵)。其中范德蒙矩阵历史最为悠久,但需要注意的是我们并不能直接使用范德蒙矩阵作为生成矩阵,而需要通过高斯消元后才能使用,这是因为在编码参数(k+m)比较大时会存在矩阵不可逆的风险

    柯西矩阵运算简单,只不过需要计算乘法逆元,我们可以提前计算好乘法逆元表以供生成编码矩阵时使用。创建以柯西矩阵为生成矩阵的编码矩阵的伪代码如下图所示:

         /*
         * 存储系统中的符号约定
         * k:数据块的个数
         * m:校验块的个数(就是code)
         * n:k+m,也就是数据块和校验块的个数总和。
         编码效率:r = k/m
         */
    //这里有设定 行数为 rows=(k),cols(=k)为列数,编码生成矩阵为M
    //先生成单位矩阵(在线性代数中,n阶单位矩阵,是一个 的方形矩阵,其主对角线元素为1,其余元素为0。 单位矩阵以In表示;如果阶数可忽略,或可由前后文确定的话,也可简记为I。)
    for (j = 0; j < cols; j++)
    {
        M[j][j] = byte(1);
    }
    
    //生成mxk的柯西矩阵,这里的cols=k,row = (k+m)
    for(i = cols;  i< rows; i++)
    {
         for(j = 0; j < cols; j++)
          {
              d = i ^ j;//这里的i j对应的是预先设定的两个矩阵中对应的元素值
              a = inverseTable[d];// 查乘法逆元表
              M[i][j] = byte(a)
          }
    }
    
    

    1.3矩阵求逆运算
    有限域上的求逆方法和我们学习的线性代数中求逆方法相同,常见的是高斯消元法,算法复杂度是O(n3)。过程如下:

    1. 在待求逆的矩阵右边拼接一个单位矩阵
      2.进行高斯消元运算
    2. 取得到的矩阵左边非单位矩阵的部分作为求逆的结果,如果不可逆则报错

    我们在实际的测试环境中发现,矩阵求逆的开销还是比较大的(大约6000ns/op)。考虑到在实际系统中,单盘数据重建往往需要几个小时或者更长(磁盘I/O占据绝大部分时间),求逆计算时间可以忽略不计。需要说明的是,发送端和接收端需要统一生成编码矩阵的算法,否则接收端没有办法根据缺失的包序号生成对应的矩阵,进行求逆运算。
    在实际的测试环境中发现,矩阵求逆的开销还是比较大的(大约6000ns/op)。考虑到在实际系统中,单盘数据重建往往需要几个小时或者更长(磁盘I/O占据绝大部分时间),求逆计算时间可以忽略不计。

    下面我给出了一个我自己手写的一个简单的计算示例:
    假设编码生成矩阵和源数据包如下所示

     

    发送端编码.png

    假设传输过程中丢失了第二个包(这里用8代替,实际计算中按字节计算)和最后一个冗余包(22)丢失,接收端只收到了数据包 4、9、1 和冗余包22,则下面我们一起恢复原始数据包;

     

    摘取生成矩阵中丢失元素对应行后,该方阵的逆矩阵就是解码矩阵.png

    通过解码矩阵和接收到接受到的有效数据块构成的解码列向量,相乘来恢复原始数据包.png

    二、编码引擎评判标准

    我们将从以下几个关键指标来对编码引擎进行分析:

    1、高编/解码速度;

    2、参数可配置;

    3、代码简洁、稳定;

    4、降低修复开销等。

    2.1 高编/解码速度

    无须多言,编/解码性能是最基本也是最重要的指标。对于一款性能优异的引擎来说,应该同时满足以下几个指标:

    根据CPU的特性自动选择最优的指令集进行加速。上文提到,依赖于SIMD技术RS码编码性能有了大幅度的提高。其中,我们可以利用多种指令集扩展以供加速,引擎应该能够自主发现最优解

    不亚于目前最出色的几款引擎的性能表现(详见第三章著名引擎对比)

    通过SIMD加速,性能会有大幅度攀升。我们还可以将逐字节查表(下称基本方法)的编码速度与利用SIMD技术加速的编码速度做对比,两者应该有数倍的差距

    编/解码速度稳定,对于不同尺寸的数据块会有相近的性能表现。由于系统缓存的影响,当被编码数据的大小和缓存大小相当时,编码应该具有最快的速度。当编码数据的大小大于缓存大小时,内存带宽成为编码速度的瓶颈,文件大小和编码时间呈现近似线性关系。这样,数据编码时间是可预期的,用户的服务质量也是可保障的。在实际中,我们对于大文件进行定长分块,依次编码,分块大小和缓存大小保持一定关系。

    下图展示了在10+4策略下,不同大小的数据块的编码速度变化趋势[2]:

    注:

    测试平台:MacBookPro(Retina,13-inch,Mid2014),2.6GHzi5-4278U(3MBL3CacheSize),8GB1600MHzDDR3

    编/解码速度计算公式:在k+m策略下,每一个数据块的尺寸计作s,编/解码m个数据块的耗时计作t,则速度=(k*s)/t

    测试方法:在内存中生成随机数据,运行若干次编/解码,取平均值

    分别执行了avx2指令集,ssse3指令集,基本方法(base)这三种编码方案

    被编码文件尺寸指,每一个数据块的尺寸与总的数据块个数的乘积,即原始数据的总大小

    作为对比,利用go语言自带的copy函数(copy),对k个数据块进行内存拷贝。copy同样使用了SIMD技术进行加速

    image

    另外,解码速度应该大于或等于编码速度(视丢失的数据块数量而定),下图为10+4策略下修复不同数量的原始数据的速度对比[2]:

    注:

    测试平台与上文的编码测试相同

    lostdata=丢失数据块数目(个)

    原始数据块每块大小为128KB,总大小为1280KB

    image

    2.2 参数可配置

    一款合理的纠删码引擎必须能做到编码策略在理论范围内可随意切换,这指的是如果要将编码策略进行变化时,仅需从接口传入不同参数而不需要改动引擎本身。这大大降低了后续的开发和维护所需要的精力。一个可配置参数的编码引擎可以根据数据的冷热程度和数据重要程度选择不同的编码系数,比如可靠性要求高的数据可以选择更多冗余。

    2.3 代码简洁、稳定

    为了利用SIMD加速我们不得不引入汇编代码或者封装后的CPU指令,因此代码形式并不常见。为了增强可读性可将部分逻辑抽离到高级语言,然而会损失部分性能,这其中的利弊需要根据团队的研发实力进行权衡。

    接下来的可维护性也非常重要。首先是接口稳定,不会随着新技术的引入而导致代码大规模重构;另外代码必须经过有合理的测试模块以便在后续的更新中校验新算法。

    比如早先的SIMD加速是基于SSE指令集扩展来做的,随后Intel又推出AVX指令集进一步提高了性能,引擎应该能即时跟上硬件进步的步伐。再比方说,再生码[5](可以理解为能减少修复开销的纠删码)是将来发展的趋势,但我们不能因为算法的升级而随意改变引擎的接口。

    2.4 降低修复开销

    纠删码的一大劣势便是修复代价数倍于副本方案。k+m策略的RS码在修复任何一个数据块时,都需要k份的其他数据从磁盘上读取和在网络上传输。比如10+4的方案下,丢失一个数据块将必须读取10个块来修复,整个修复过程占用了大量磁盘I/O和网络流量,并使得系统暴露在一种降级的不稳定状态。因此,实际系统中应该尽量避免使用过大的k值。

    再生码便是为了缓解数据修复开销而被提出的,它能够极大减少节点失效时所需要的吞吐的数据量。然而其复杂度大,一方面降低了编码速度,另外一方面牺牲了传统RS码的一些优秀性质,在工程实现上的难度也大于传统纠删码。

    三、著名引擎对比

    目前被应用最广泛并采用了SIMD加速的引擎有如下几款:

    1.Intel出品的ISA-L[4]

    2.J.S.Plank教授领导的Jerasure[5]

    3.klauspost的个人项目(inGolang)[6]

    这三款引擎的执行效率都非常高,在实现上略有出入,以下是具体分析:

    3.1 ISA-L

    intel®-storage-acceleration-library Intel存储加速库,包括两个大类:加密和非加密的。非加密的 crc,izip,erase-code,加密的包括sha512,sha256,md5,sha1等。

    核心技术就是使用intel sse/avx/avx2/avx256的扩展指令,并行运算多个流的方法。单线程比openssl要快2~8倍。

    现在ISA-L已经开源:

    https://github.com/01org/isa-l

    https://github.com/01org/isa-l_crypto


    http://www.zhixing123.cn/computer/57905.html

    纠删码作为ISA-L库所提供的功能之一,其性能应该是目前业界最佳。需要注意的是Intel采用的性能测试方法与学术界常用的方式略有出路,其将数据块与冗余块的尺寸之和除以耗时作为速度,而一般的方法是不包含冗余块的。另外,ISA-L未对vandermonde矩阵做特殊处理,而是直接拼接单位矩阵作为其编码矩阵,因此在某些参数下会出现编码矩阵线性相关的问题。好在ISA-L提供了cauchy矩阵作为第二方案。

    ISA-L之所以速度快,一方面是由于Intel谙熟汇编优化之道,其次是因为它将整体矩阵运算搬迁到汇编中进行。但这导致了汇编代码的急剧膨胀,令人望而生畏。

    另外ISA-L支持的指令集扩展丰富,下至SSSE3,上到AVX512,平台适应性最强。

    3.2 Jerasure2.0

    不同于ISA-L直接使用汇编代码,Jerasure2.0使用C语言封装后的指令,这样代码更加的友好。另外Jerasure2.0不仅仅支持GF(28)有限域的计算,其还可以进行GF(24)-GF(2128)之间的有限域。并且除了RS码,还提供了CauchyReed-Solomoncode(CRS码)等其他编码方法的支持。它在工业应用之外,其学术价值也非常高。目前其是使用最为广泛的编码库之一。目前Jerasure2.0并不支持AVX加速,尽管如此,在仅使用SSE的情况下,Jerasure2.0依然提供了非常高的性能表现。不过其主要作者之一JamesS.Plank教授转了研究方向,另外一位作者Greenan博士早已加入工业界。因此后续的维护将是个比较大的问题。

    3.3 klauspost的ReedSolomon

    klauspost利用Golang的汇编支持,友好地使用了SIMD技术,此款引擎的SIMD加速部分是目前我看到的实现中最为简洁的,矩阵运算的部分逻辑被移到了外层高级语言中,加上Golang自带的汇编支持,使得汇编代码阅读起来更佳的友好。不过Go并没有集成所有指令,部分指令不得不利用YASM等汇编编译器将指令编译成字节序列写入汇编文件中。一方面导致了指令的完全不可读,另外一方面这部分代码的语法风格是Intel而非Golang汇编的AT&T风格,平添了迷惑。这款引擎比较明显的缺陷有两点:1.对于较大的数据块,编码速度会有巨大的下滑;2.修复速度明显慢于编码速度。

    3.4 编码速度对比

    我在这里选取了IntelISA-L(图中intel),klauspost的ReedSolomon(图中k),以及自研的一款引擎2这三款引擎进行编码效率的对比,这三款引擎均支持avx2加速。测试结果如下:

    image

    注:

    编码速度计算公式,测试方法与上一节相同。其中isa-l默认的速度计算方式与公式有冲突,需要修改为一致

    测试平台:AWSt2.microIntel®Xeon®CPUE5-2676v3@2.40GHz,Memory1GB

    编码方案:10+4

    klauspost的引擎默认开了并发,测试中需要将并发数设置为1

    参考文章:
    高性能纠删码编码
    基于柯西矩阵的Erasure Code技术详解

    展开全文
  • 基于汉明码的信道编码仿真

    千次阅读 2020-06-07 16:45:55
    设信息序列被分为长度为k的分组,用向量x={x1,…,xk}表示,编码后长度为n的码字用向量c={c1,…,cn}表示,则线性分组码的编码可以利用的生成矩阵G实现:c=xG。 当码字c通过信道后,接收端收到的向量为v={v1,…,vn},...

    实验原理

    线性分组码的编码与译码
    设信息序列被分为长度为k的分组,用向量x={x1,…,xk}表示,编码后长度为n的码字用向量c={c1,…,cn}表示,则线性分组码的编码可以利用的生成矩阵G实现:c=xG。
    当码字c通过信道后,接收端收到的向量为v={v1,…,vn},为判定v是否为合法的码字,可以利用的校验矩阵H通过以下方法实现:通过s=VH’计算伴随式s,若s为全0向量,则v为合法的码字,若s不为全0向量,则v不是合法的码字。

    MATLAB实现:
    N=1000000;error=0.01;
    e=zeros(7,7);
    for i=1:7
        for j=1:7
            if(i==j)
                e(i+j*7-7)=1;
            else
                e(i+j*7-7)=0;
            end
        end
    end
    [H,G]=hammgen(3); %(7,4)汉明码的校验和生成矩阵
    Data=randi([0,1],[1,N]); %按均匀分布产生0,1随机序列,长度为一百万
    v=zeros(1,7);
    for i=1:N/4
        x=Data(:,4*i-3:4*i); %对序列分组
        c=mod(x*G,2); %进行(7,4)汉明编码
        for j=1:7 %送入出错概率为0.01的仿真BSC信道
            if(rand()<error)
                if(c(j)==1)
                    v(j)=0;
                else
                    v(j)=1;
                end
            else
                v(j)=c(j);
            end
        end
        s=mod(v*H',2);%利用(7,4)汉明码的校验矩阵,对信道输出比特分组计算伴随式
        if(any(s))%判断是否有错
            for k=1:7
                if(mod(e(k,:)*H',2)==s)
                    Result=mod(v+e(k,:),2);
                    break;
                end
            end 
        else
            Result=v;
        end
        ResData(:,4*i-3:4*i)=Result(:,4:7);
    end
    count=0;
    for i=1:N
        if(Data(:,i)==ResData(:,i))
            continue;
        else
           count=count+1;
        end
    end
    disp('最终误码率:');disp(count/1000000);
    
    展开全文
  • 信道编码和交织的有效总结和理解

    千次阅读 2020-07-06 10:49:52
    信道编码的引入主要是为了解决数据在信道中传输时引入的误码问题。解决误码问题有两个办法:前向纠错、后向纠错 一.FEC(Forward erro correction) 1.重复码 将每一个信息比特重复3次编码:0→000,1→111。 接收端...

    在这里插入图片描述
    信道编码的引入主要是为了解决数据在信道中传输时引入的误码问题。解决误码问题有两个办法:前向纠错、后向纠错

    一.FEC(Forward erro correction)

    1.重复码

    将每一个信息比特重复3次编码:0→000,1→111。
    接收端根据少数服从多数的原则进行译码。
    传输效率低

    2.分组码

    为了提高传输效率,将k位信息比特分为一组,增加少量多余码元,共计n位,这就是分组码。
    包含k位信息比特的n位分组码,一般记为(n,k)分组码,如图5所示。
    在这里插入图片描述
    奇偶校验码:只能查错(奇数个错误)不能纠错
    汉明码:可检测两位错误,纠正一位错误
    检错原理:如(7,4)汉明码
    s2=a6⊕a5⊕a4⊕a2
    s1=a6⊕a5⊕a3⊕a1
    s0=a6⊕a4⊕a3⊕a0
    根据计算结果s2s1s0,可以判断出是否出错,如果出错,具体是哪个码元出错,
    纠错原理:发现错误位后将其取反

    3.卷积码

    编码原理:
    (1)编码器工作原理
    用(n,k,K)来表示卷积码,其中:
    n:编码器每次输出的码元个数;
    k:编码器每次输入的信息码元个数,一般k=1;
    K:约束长度,在k=1的情况下,表示编码器的输出与本次及之前输入的K个码元相关。
    例如:(2,1,3)卷积编码器则需要两个移位寄存器
    在这里插入图片描述
    编码器输入:mi,输出:u1和u2。
    u1=mi⊕mi-1⊕mi-2
    u2=mi⊕mi-2
    两个移位寄存器的初始状态为:00;
    (2)编码器网格图
    两个寄存器的输出共有4种可能状态:00、10、01、11,沿纵轴排列,以时间为横轴,将寄存器状态和编码器输出随输入的变化画出来,这就是编码器网格图,如图所示。
    在这里插入图片描述
    实线表示输入0,虚线表示输入1。
    实线和虚线旁边的数字表示编码器输出。
    t1时刻:寄存器状态为00。
    t2时刻:
    如果输入为0,寄存器状态保持00,编码器输出00;
    如果输入为1,寄存器状态变为10,编码器输出11。
    以此类推得到输出
    例子:如果输入11011,输出11 01 01 00 01
    译码原理:
    卷积码译码一般采用最大似然译码
    (1)最大似然译码
    假定信道的误码率为Pe,且Pe<0.5。
    编码器的输入信息序列长度为L,输出的码字序列有2L种可能:Ai=(i=1,2,…,2L),如图所示。

    在这里插入图片描述

    译码器在接收到码字序列B后,遍历Ai(i=1,2,…,2L),计算发送码字序列为Ai、接收码字序列为B的发生概率,将发生概率最大的发送码字序列对应的发送信息序列作为译码结果,这就是最大似然译码。
    接上例:假定接收11 01 01 00 01,L=5,发送序列11011,编码器输出11 01 01 00 01,全部正确,概率为(1-pe)^10;
    但如果发送序列为10011,编码器输出11 10 11 11 01,与接收序列相比错了5个码元,概率为pe^5 * (1-pe)^5;
    其他情况略,很明显11011的概率最高,
    错误的码元越少,发生概率越高。要找到发生概率最高的发送序列,只要找出误码数最少的发送码字序列就可以了。而两码字间对应位不同的个数总和称为汉明距离,所以只要找出汉明距离之和最小的发送码字序列就行了。

    要经过遍历2^L次可能码字序列计算概率完成译码,译码过程的计算量随L的增大而指数增长,难以实现。维特比发现了一种方法,可以大大减小译码的计算量,将最大似然译码推向实用

    (2)维特比译码
    维特比译码的原理可以结合译码器网格图来理解。译码器网格图与编码器网格图类似,唯一的不同是:实线和虚线旁的数字不再表示编码器的输出,而是表示接收码字序列与编码器输出码字序列的汉明距离。
    接上例:假定接收码字序列为11 01 01 10 01(11 01 01 00 01错了一个码元)

    在这里插入图片描述
    t1~t2:接收到11,存在两条可能路径,汉明距离分别为2和0,
    t2~t3:接收到01, t1~t3间存在4条可能路径,汉明距离分别为3、3、2、0
    t3~t4: 接收到01,t1~t4间存在8条可能路径,到每个状态存在2条可能路径
    最终选取汉明距离之和最短的那条

    在这里插入图片描述

    交织

    交织和去交织是通过对寄存器按行写入按列读出实现的。

    信道编码后的码字逐行写入交织寄存器,再逐列读出并发送出去
    在这里插入图片描述
    接收到的数据逐行写入去交织寄存器,再逐列读出码字用于信道译码
    在这里插入图片描述在信道传输过程中如果出现了如图中所示的连续误码,去交织后,恢复出的第3、第4、第5、第6码字的第3码元出错,对于出错的几个码字来讲,每个码字只是错了1个码元,信道译码时很容易纠错。
    解决连续误码问题

    反馈重传

    一、ARQ
    自动请求重传:发送端发送具有一定检错能力的码,接收端发现出错后,立即通知发送端重传,如果还是错,再次请求重传,直至接收正确为止
    在这里插入图片描述
    二、HARQ
    混合ARQ:是FEC和ARQ的结合,发送端发送具有一定检错和纠错能力的FEC码,接收端发现出错后,尽其所能进行纠错,纠正不了,则立即通知发送端重传,如果还是接收错误,再次请求重传,直至接收正确为止

    在这里插入图片描述
    三、HARQ+ARQ
    很明显,HARQ的性能是优于ARQ的,但如果单纯使用HARQ重传,会导致解调门限大大提高。这是因为:重传次数一般都要受到最大重传次数的限制,要满足最恶劣信道条件下在达到最大重传次数之前能将数据传输正确,对解调门限提出了很高的要求。为了降低对解调门限的要求,移动通信系统中一般将二者结合起来使用,
    在这里插入图片描述利用HARQ重传将误码控制在一定水平,残留一部分误码给ARQ进行重传,这样系统性能可以达到最优。

    展开全文
  • 本篇博客是弥补前段时间做完一个小项目却没有写工作总结,这个项目是跟着老师做的,主要内容是利用FPGA实现信道编码与BOK—Chirp调制,进行时序仿真并移植到NI平台上。主要分为三个阶段的任务: 目录 一、信道编码...
  • 信道编码之设计线性分组码

    千次阅读 2020-01-24 23:51:13
    根据生成矩阵的不同分为系统码和非系统码:系统码是码字中信息位与监督位分离,非系统码在码字中无法直观的得到原信息,在接收时需要额外译码。接收时由检校矩阵生成接收码字的伴随式S,并根据S判断该码字是否出错,...
  • TCH FR/HR全速率、半速率信道编码

    千次阅读 2012-11-26 14:18:55
    业务信道(TCH)载有编码的话音或用户数据,它有全速率业务信道(TCH/F)和半速率业务信道(TCH/H)之分,两者分别载有总速率为22.8和11.4kbit/s的信息,使用全...载有编码话音的业务信道分为全速率话音业务信道(TCH/F
  • 在中继节点上,采用网络-信道编码联合设计方案能进一步提高系统的误码性能。基于Razaghi等人研究的两种双层LDPC码(Bilayer LDPC,分为删余型和延长型),设计了一种在中继节点上联合设计的网络双层LDPC延长码...
  • 信道、信道编码及其作用 1.信道(channel)  信道和通信电路并不等同,用来表示向某一个方向传送信息的媒体。因此一条通信线路往往包含一条发送信道和一条接收信道。 从通信的双方信息交互方式看有三个基本方式:...
  • ─ 第3部分:物理层复用和信道编码 ─ 第4部分:物理层过程 ─ 第5部分:物理层测量 ─ 第6部分:MAC协议 ─ 第7部分:RLC协议 ─ 第8部分:PDCP协议 ─ 第9部分:RRC协议 ─ 第10部分:UE处于空闲模式下的过程 ─ ...
  • Viterbi译码的实质是最大似然译码,但它利用了编码网格图的特殊结构,降低了计算复杂性,译码建立的基础是编码器状态的马尔可夫性:即当前状态完全概括了编码器的历史信息,以前的状态不会影响将来的状态或者将来的...
  • ​FEC:全称Forward Erro Correction,就是前向纠错码。 一、重复码 将同一数据重复多次发送,这就是重复码。...将k位信息比特分为一组,增加少量多余码元,共计n位,这就是分组码,一般记为(n,k)分组码。..
  • 该方法将图像分为感兴趣区和背景区,并采用多描述编码方法,将感兴趣区和背景区码流编码成多个描述。同时对感兴趣区和背景区描述码流采用不同的冗余树分配方案,以进一步增强图像感兴趣区的抗分组丢失能力。实验证明...
  • matlab优化二元一次方程组代码该存储库包含以下代码的仿真代码: 基于源编码的毫米波信道估计与基于深度学习的解码 如果您认为此代码有用或在您的工作...信道估计分为两个子问题。 第一个子问题是Measuerment Design ,
  • 编码信道: 数字信号由编码器输出端传输到译码器输入端经过的部分。 调制信道: 从调制器的输出端传输到解调器的输入端经过的部分。 2.信道传输特性 不同类型的信道对信号的影响差异较大: 1.随机参数信道...
  • 信道与多径效应基础知识总结

    千次阅读 2020-04-03 23:52:22
    根据分类方法的不同,根据信道的组成,信道分为狭义信道(是指信道的传输媒质)和广义信道(除了信道的传输媒质外还包括通信系统的某些设备),其中由调制器,传输媒质,解调器组成的广义信道称为编码信道,由发射...
  • GSM的逻辑信道-业务信道(TCH)

    千次阅读 2014-09-30 13:50:46
    基本概念 业务信道(TCH:Traffic ...话音业务信道主要分为以下三类:全速率话音业务信道(TCH/F)、半速率话音业务信道(TCH/H)、增强型全速率话音业务信道(Enhanced TCH/F)。 全速率(Full Rate) 全
  • GSM信道介绍

    万次阅读 2008-09-24 11:21:00
    关于无线信道的作用我们知道,每...在GSM系统中,逻辑信道分为专用信道(DCH)和通用信道(CCH)两大类,有时也可分为业务信道和控制信道两大类。业务信道(TCH)载有编码的话音或用户数据,它有全速率业务信道(TCH/
  • 数字信道编码3.调制技术与码元数4.极性编码5.归零性编码6.曼彻斯特编码7.各种编码效率 1.模拟信道调制 分为: 调幅ASK:调节幅度 调频FSK:调节速度 调相PSK:调接相位 正交变换QAM:幅度相同,相位相差90度。 2...
  • 分为狭义信道和广义信道。 狭义信道:传输信号的媒质 ; 有线信道:架空明线、双绞线、同轴电缆、光缆; 无线信道:地波、天波、微波、卫星等。 广义信道:传输媒质及有关变换装置(收、发转换器、 放大、频率变换等)...
  • 信息论与编码

    千次阅读 2018-06-05 01:42:03
    编码在信息论里分为两大块,一块是信道编码,一块是信源编码。(一)信道编码 1. 香农有噪信道编码定理香农有噪信道编码定理指出一个令人惊叹的事实,尽管噪声会带来干扰,我们还是可以以任意小的错误概率传送数据...
  • 3 编码与调制

    千次阅读 2020-12-04 09:30:39
    分为信道编码和信源编码。 •信源编码是对信源信息进行加工处理,模拟数据要经过采样、量化和编码变换为数字数据,为降低所需要传输的数据量,在信源编码中还采用了数据压缩技术。 •信道编码是将数字数据编码成适合...
  • 根据编码目的不同,可分为信源编码和信道编码。 信源编码是对信源输出的信号进行变换,目的是提高信息传输的有效性以及完成模/数转换等,信源解码是信源编码的逆过程。 信道编码是对信源编码器输出的信号进行再...
  • 编码主要分为信源编码和信道编码。  信源编码是对信源输出的信号进行变换,对RFID而言,编码的对象通常是存储在存储器中的数字信息。信源解码是信源编码的逆过程。  信道编码是对信源编码器输出的信号进行再变换...
  • GSM中的信道分为物理信道和逻辑信道,一个物理信道就为一个时隙(TS),而逻辑信道是根据BTS与MS之间传递的信息种类的...1.业务信道(TCH):用于传送编码后的话音或客户数据,在上行和下行信道上,点对点(BTS对一个...
  • 信道编码和信道解码统称为信道编码,主要解决可靠性问题,即尽量使处理过的信号在传输的过程中不出错或者少出错,即使出了错也要能自动检错和尽量纠错。 2.语音编码通常分为哪几类?波形编码、参数编码与混合编码各...
  • 线性分组码生成矩阵例题

    万次阅读 多人点赞 2019-03-05 09:46:57
    这块属于信道编码的部分,信道编码分为线性分组码(循环码)和非分组码(卷积码)。 生成矩阵(n,k)线性分组码的生成矩阵为 k 行 n列,如 (7,3),即信息位 3位,码长 7位。监督矩阵和生成矩阵的正相反,互为转置...
  • 信道编码。对信源编码器输出的信号进行再变换,包括区分通路、适应信道条件和提高通信可靠性而进行的编码。③保密编码。对信道编码器输出的信号进行再变换,即为了使信息在传输过程中不易被人窃取而进行的编码。...
  • 编码与调制

    2021-03-29 00:32:01
    按传输信号分为:模拟信道(传输模拟信号),数字信道(传输数字信号) 按传输介质分为:无线信道,有线信道 信道上传送的信号: 基带信号:将数字信号0和1直接用两种不同的电压表示,再送到数字信道上去传输...
  • 2.2 编码与调制

    2021-01-21 11:12:49
    信道分为数字信道和模拟信道两种。 编码:------>数字信号;调制:------>模拟信号; 码元:构成信号的一段波形。 2)传输媒体和信道的关系 传输媒体和信道不能直接划等号。对于单工传输,传输媒体中只...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 293
精华内容 117
关键字:

信道编码分为