精华内容
下载资源
问答
  • 汉明码是信道编码的一种,详情可百度,一下给出汉明码的一种实现方式:#include #include #include #include using namespace std; int main(){ srand((int)time(0)); string xinxi1;//需要编码的二进制序列 //...
    汉明码是信道编码的一种,详情可百度,一下给出汉明码的一种实现方式:
    #include<iostream>
    #include<string>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    
    int main(){
    	srand((int)time(0));
    	string xinxi1;//需要编码的二进制序列
    
    	//随机生成一个长度最长为248的二进制序列
    	//unsigned int xinxi_length = rand() % 248 + 1;
    	//for (unsigned int i = 0; i < xinxi_length; i++) {
    	//	xinxi.push_back(rand() % 2 + 48);
    	//}
    	//cout << "随机生成的二进制序列为" << xinxi << endl;
    
    	//手动输入一个二进制序列和这个二进制序列的长度
    	unsigned int xinxi_length;
    	cin >> xinxi1 >> xinxi_length;
    	string xinxi;
    	for (int i = xinxi1.size() - 1; i >= 0; i--) {
    		xinxi.push_back(xinxi1[i]);
    	}
    	cout << xinxi << endl;
    	//编码过程
    
    	unsigned int a = 128, jiaoyan=7;
    	for (; xinxi_length + jiaoyan < a; jiaoyan--, a /= 2);
    	jiaoyan++;
    	cout << xinxi_length << " " << jiaoyan << endl;
    
    	//将信息位存入最后要输出的编码序列
    	string bianma(xinxi_length+jiaoyan,0);
    	for (unsigned int i = 1, j = 1, k = 0; j <= xinxi_length + jiaoyan; j++) {
    		if (j == i) {
    			i *= 2;
    			bianma[j - 1] = ' ';
    		}
    		else {
    			bianma[j - 1] = xinxi[k];
    			k++;
    		}
    	}
    	cout << bianma << endl;
    
    	//ch用来存最高为八位的校验位
    	char ch;
    	for (unsigned int i = 0; i < xinxi_length + jiaoyan; i++) {
    		if (bianma[i] == '1') {
    			ch = i+1;
    			break;
    		}
    	}
    	for (unsigned int i = ch; i < xinxi_length + jiaoyan; i++) {
    		if (bianma[i] == '1') {
    			ch = ch ^ (char)(i+1);
    		}
    	}
    	for (unsigned int i = 0, j = 1; i < jiaoyan; i++) {
    		if ((ch & 1 << i) != 0) {
    			bianma[j - 1] = '1';
    		}
    		else {
    			bianma[j - 1] = '0';
    		}
    		j *= 2;
    	}
    	string bianma1;
    	for (int i = bianma.size() - 1; i >= 0; i--) {
    		bianma1.push_back(bianma[i]);
    	}
    	cout << bianma1 << endl;
    	//cout << "输入一个七位汉明码:" << endl;
    	//string hanming;
    	//cin >> hanming;
    	//char b[4];
    
    	system("pause");
    	return 0;
    }
    

    代码写的并不规范,很多地方都写的很蠢,有很多可以优化的地方;

    在网上找到过一些利用生成矩阵实现的汉明码编码,但因对其原理并不了解,便用其它方法实现了一个汉明码编码;

    下次要实现的是输入一个接收到的汉明码然后对其进行纠错和译码。

    展开全文
  • 关于莫顿编码计算过程

    千次阅读 2019-10-12 11:29:39
    关于摩顿编码的计算 莫顿码的基本原理 莫顿码是一种将多维空间中的点坐标用一个一维的数值来表示,通过利用莫顿编码的方式来... 在本篇博客中,我增添了对于二维几何和三维几何坐标所对应的莫顿码值的整个过程。 ...

    关于摩顿编码的计算

    莫顿码的基本原理

    莫顿码是一种将多维空间中的点坐标用一个一维的数值来表示,
    通过利用莫顿编码的方式来讲空间中点所对应的空间关系用莫顿码值之间的相邻关系来近似表示。
    

    莫顿编码的计算方式

     1.通过依次对多维空间中的点进行“迭代交叉计算”;
     2.通过利用查询表来计算对应的莫顿码;   
     在本篇博客中,我增添了对于二维几何和三维几何坐标所对应的莫顿码值的整个过程。
     一种是通过依次进行迭代计算多维空间中点对应的莫顿码,这种方法比较容易理解,但是相对
     查询表的计算复杂度相对较低。
     特别注意的是,在查询表的计算过程中,每个点所对应的莫顿码的查询表的计算过程
     应该与点所对应的几何精度相关。下面,我主要分为两部分来讲,
     一种是关于依次进行迭代计算莫顿码,另外一种是基于查询表来计算的。
    

    基于点坐标的依次迭代计算

    下面分别是二维几何坐标和三维几何坐标分别对应的莫顿码计算过程:

    //二维几何坐标对应莫顿码的计算过程
    //我们将attr_aps.raht_depth设置为24,也就是最大的几何坐标的几何精度
     for (int n = 0; n < voxelCount; n++) {
          const auto position = inputPointCloud[n];
          int x = int(position[0]);
          int y = int(position[1]);
          int z = int(position[2]);de
          long long mortonCode = 0;
          for (int b = 0; b < attr_aps.raht_depth; b++) {
            mortonCode|= (long long)((x >> b) & 1) << (2 * b + 1);
            mortonCode|= (long long)((y >> b) & 1) << (2 * b);
          }
    }
    //三维几何坐标对应莫顿码的计算过程
    for (int n = 0; n < voxelCount; n++) {
          const auto position = inputPointCloud[n];
          int x = int(position[0]);
          int y = int(position[1]);
          int z = int(position[2]);de
          long long mortonCode = 0;
          for (int b = 0; b < attr_aps.raht_depth; b++) {
            mortonCode|= (long long)((x >> b) & 1) << (3 * b + 2);
            mortonCode|= (long long)((y >> b) & 1) << (3 * b + 1);
            mortonCode|= (long long)((z >> b) & 1) << (3 * b);
          }
    }
    

    在这里要特别注意的是,上面二维坐标的莫顿码编码顺序为yx,
    三维坐标的莫顿码的编码顺序为zyx,也就是说莫顿码的编码顺序是按照由低位到高位的顺 序进行编码。但是莫顿编码的交叉顺序是按照由高位到低位的顺序,也就是二维的莫顿编码的交叉编码顺序为xy,三维莫顿编码的顺序是xyz.

    基于莫顿查询表进行计算莫顿码

    如下表所示,我们将分别计算二维坐标对应的莫顿码和三维坐标的莫顿码。

    //二维莫顿码查询表
    const uint32_t pcc::kMortonCode256_twoDimensions[256] = {
      0x00000000, 0x00000001, 0x00000004, 0x00000005, 0x00000010, 0x00000011,
      0x00000014, 0x00000015, 0x00000040, 0x00000041, 0x00000044, 0x00000045,
      0x00000050, 0x00000051, 0x00000054, 0x00000055, 0x00000100, 0x00000101,
      0x00000104, 0x00000105, 0x00000110, 0x00000111, 0x00000114, 0x00000115,
      0x00000140, 0x00000141, 0x00000144, 0x00000145, 0x00000150, 0x00000151,
      0x00000154, 0x00000155, 0x00000400, 0x00000401, 0x00000404, 0x00000405,
      0x00000410, 0x00000411, 0x00000414, 0x00000415, 0x00000440, 0x00000441,
      0x00000444, 0x00000445, 0x00000450, 0x00000451, 0x00000454, 0x00000455,
      0x00000500, 0x00000501, 0x00000504, 0x00000505, 0x00000510, 0x00000511,
      0x00000514, 0x00000515, 0x00000540, 0x00000541, 0x00000544, 0x00000545,
      0x00000550, 0x00000551, 0x00000554, 0x00000555, 0x00001000, 0x00001001,
      0x00001004, 0x00001005, 0x00001010, 0x00001011, 0x00001014, 0x00001015,
      0x00001040, 0x00001041, 0x00001044, 0x00001045, 0x00001050, 0x00001051,
      0x00001054, 0x00001055, 0x00001100, 0x00001101, 0x00001104, 0x00001105,
      0x00001110, 0x00001111, 0x00001114, 0x00001115, 0x00001140, 0x00001141,
      0x00001144, 0x00001145, 0x00001150, 0x00001151, 0x00001154, 0x00001155,
      0x00001400, 0x00001401, 0x00001404, 0x00001405, 0x00001410, 0x00001411,
      0x00001414, 0x00001415, 0x00001440, 0x00001441, 0x00001444, 0x00001445,
      0x00001450, 0x00001451, 0x00001454, 0x00001455, 0x00001500, 0x00001501,
      0x00001504, 0x00001505, 0x00001510, 0x00001511, 0x00001514, 0x00001515,
      0x00001540, 0x00001541, 0x00001544, 0x00001545, 0x00001550, 0x00001551,
      0x00001554, 0x00001555, 0x00004000, 0x00004001, 0x00004004, 0x00004005,
      0x00004010, 0x00004011, 0x00004014, 0x00004015, 0x00004040, 0x00004041,
      0x00004044, 0x00004045, 0x00004050, 0x00004051, 0x00004054, 0x00004055,
      0x00004100, 0x00004101, 0x00004104, 0x00004105, 0x00004110, 0x00004111,
      0x00004114, 0x00004115, 0x00004140, 0x00004141, 0x00004144, 0x00004145,
      0x00004150, 0x00004151, 0x00004154, 0x00004155, 0x00004400, 0x00004401,
      0x00004404, 0x00004405, 0x00004410, 0x00004411, 0x00004414, 0x00004415,
      0x00004440, 0x00004441, 0x00004444, 0x00004445, 0x00004450, 0x00004451,
      0x00004454, 0x00004455, 0x00004500, 0x00004501, 0x00004504, 0x00004505,
      0x00004510, 0x00004511, 0x00004514, 0x00004515, 0x00004540, 0x00004541,
      0x00004544, 0x00004545, 0x00004550, 0x00004551, 0x00004554, 0x00004555,
      0x00005000, 0x00005001, 0x00005004, 0x00005005, 0x00005010, 0x00005011,
      0x00005014, 0x00005015, 0x00005040, 0x00005041, 0x00005044, 0x00005045,
      0x00005050, 0x00005051, 0x00005054, 0x00005055, 0x00005100, 0x00005101,
      0x00005104, 0x00005105, 0x00005110, 0x00005111, 0x00005114, 0x00005115,
      0x00005140, 0x00005141, 0x00005144, 0x00005145, 0x00005150, 0x00005151,
      0x00005154, 0x00005155, 0x00005400, 0x00005401, 0x00005404, 0x00005405,
      0x00005410, 0x00005411, 0x00005414, 0x00005415, 0x00005440, 0x00005441,
      0x00005444, 0x00005445, 0x00005450, 0x00005451, 0x00005454, 0x00005455,
      0x00005500, 0x00005501, 0x00005504, 0x00005505, 0x00005510, 0x00005511,
      0x00005514, 0x00005515, 0x00005540, 0x00005541, 0x00005544, 0x00005545,
      0x00005550, 0x00005551, 0x00005554, 0x00005555};
      //三维莫顿码查询表
      const uint32_t pcc::kMortonCode256_threeDimensions[256] = {
      0x00000000, 0x00000001, 0x00000008, 0x00000009, 0x00000040, 0x00000041,
      0x00000048, 0x00000049, 0x00000200, 0x00000201, 0x00000208, 0x00000209,
      0x00000240, 0x00000241, 0x00000248, 0x00000249, 0x00001000, 0x00001001,
      0x00001008, 0x00001009, 0x00001040, 0x00001041, 0x00001048, 0x00001049,
      0x00001200, 0x00001201, 0x00001208, 0x00001209, 0x00001240, 0x00001241,
      0x00001248, 0x00001249, 0x00008000, 0x00008001, 0x00008008, 0x00008009,
      0x00008040, 0x00008041, 0x00008048, 0x00008049, 0x00008200, 0x00008201,
      0x00008208, 0x00008209, 0x00008240, 0x00008241, 0x00008248, 0x00008249,
      0x00009000, 0x00009001, 0x00009008, 0x00009009, 0x00009040, 0x00009041,
      0x00009048, 0x00009049, 0x00009200, 0x00009201, 0x00009208, 0x00009209,
      0x00009240, 0x00009241, 0x00009248, 0x00009249, 0x00040000, 0x00040001,
      0x00040008, 0x00040009, 0x00040040, 0x00040041, 0x00040048, 0x00040049,
      0x00040200, 0x00040201, 0x00040208, 0x00040209, 0x00040240, 0x00040241,
      0x00040248, 0x00040249, 0x00041000, 0x00041001, 0x00041008, 0x00041009,
      0x00041040, 0x00041041, 0x00041048, 0x00041049, 0x00041200, 0x00041201,
      0x00041208, 0x00041209, 0x00041240, 0x00041241, 0x00041248, 0x00041249,
      0x00048000, 0x00048001, 0x00048008, 0x00048009, 0x00048040, 0x00048041,
      0x00048048, 0x00048049, 0x00048200, 0x00048201, 0x00048208, 0x00048209,
      0x00048240, 0x00048241, 0x00048248, 0x00048249, 0x00049000, 0x00049001,
      0x00049008, 0x00049009, 0x00049040, 0x00049041, 0x00049048, 0x00049049,
      0x00049200, 0x00049201, 0x00049208, 0x00049209, 0x00049240, 0x00049241,
      0x00049248, 0x00049249, 0x00200000, 0x00200001, 0x00200008, 0x00200009,
      0x00200040, 0x00200041, 0x00200048, 0x00200049, 0x00200200, 0x00200201,
      0x00200208, 0x00200209, 0x00200240, 0x00200241, 0x00200248, 0x00200249,
      0x00201000, 0x00201001, 0x00201008, 0x00201009, 0x00201040, 0x00201041,
      0x00201048, 0x00201049, 0x00201200, 0x00201201, 0x00201208, 0x00201209,
      0x00201240, 0x00201241, 0x00201248, 0x00201249, 0x00208000, 0x00208001,
      0x00208008, 0x00208009, 0x00208040, 0x00208041, 0x00208048, 0x00208049,
      0x00208200, 0x00208201, 0x00208208, 0x00208209, 0x00208240, 0x00208241,
      0x00208248, 0x00208249, 0x00209000, 0x00209001, 0x00209008, 0x00209009,
      0x00209040, 0x00209041, 0x00209048, 0x00209049, 0x00209200, 0x00209201,
      0x00209208, 0x00209209, 0x00209240, 0x00209241, 0x00209248, 0x00209249,
      0x00240000, 0x00240001, 0x00240008, 0x00240009, 0x00240040, 0x00240041,
      0x00240048, 0x00240049, 0x00240200, 0x00240201, 0x00240208, 0x00240209,
      0x00240240, 0x00240241, 0x00240248, 0x00240249, 0x00241000, 0x00241001,
      0x00241008, 0x00241009, 0x00241040, 0x00241041, 0x00241048, 0x00241049,
      0x00241200, 0x00241201, 0x00241208, 0x00241209, 0x00241240, 0x00241241,
      0x00241248, 0x00241249, 0x00248000, 0x00248001, 0x00248008, 0x00248009,
      0x00248040, 0x00248041, 0x00248048, 0x00248049, 0x00248200, 0x00248201,
      0x00248208, 0x00248209, 0x00248240, 0x00248241, 0x00248248, 0x00248249,
      0x00249000, 0x00249001, 0x00249008, 0x00249009, 0x00249040, 0x00249041,
      0x00249048, 0x00249049, 0x00249200, 0x00249201, 0x00249208, 0x00249209,
      0x00249240, 0x00249241, 0x00249248, 0x00249249};
    

    我们的计算会基于这个kMortonCode256【256】的这个查询表来计算对应的莫顿码,其基本原理是每次只处理一个数值的8位,也就是最大为256,后续依次进行按照该查询表中的内容进行计算。
    二维莫顿码的计算(在这里我们的几何坐标最大数值为24bit):

    //注意:在这里我们将x放在莫顿码的高位,y放在莫顿码的低位
    for (int n = 0; n < voxelCount; n++) {
          const auto position = inputPointCloud[n];
          int x = int(position[0]);
          int y = int(position[1]);
          int z = int(position[2]);
          long long mortonCode = 0;
          mortonCode =kMortonCode256_twoDimensions[(x >> 16) & 0xFF]<<1 |
                      kMortonCode256_twoDimensions[(y >> 16) & 0xFF];
          mortonCode = mortonCode << 16 |
                       kMortonCode256_twoDimensions[(x >> 8) & 0xFF]<<1|
                       kMortonCode256_twoDimensions[(y >> 8) & 0xFF];
          mortonCode =mortonCode << 16 |
                      kMortonCode256_twoDimensions[x & 0xFF]<<1|
                      kMortonCode256_twoDimensions[y & 0xFF];
    }
    

    三维莫顿码的查询表计算过程

    //注意在这里我们按照xyz由高到低的顺序进行莫顿编码
    for (int n = 0; n < voxelCount; n++) {
          const auto position = inputPointCloud[n];
          int x = int(position[0]);
          int y = int(position[1]);
          int z = int(position[2]);
          long long mortonCode = 0;
          mortonCode = kMortonCode256_threeDimensions[(x >> 16) & 0xFF]<<2|
                       kMortonCode256_threeDimensions[(y >> 16) & 0xFF]<<1|
                       kMortonCode256_threeDimensions[(z >> 16) & 0xFF];
          mortonCode =mortonCode<< 24 |
                       kMortonCode256_threeDimensions[(x >> 8) & 0xFF]<<2|
                       kMortonCode256_threeDimensions[(y >> 8) & 0xFF]<<1| 
                       kMortonCode256_threeDimensions[(z >> 8) & 0xFF];
          mortonCode = mortonCode << 24 |
                       kMortonCode256_threeDimensions[x & 0xFF]<<2|
                       kMortonCode256_threeDimensions[y & 0xFF]|<<1
                       kMortonCode256_threeDimensions[z & 0xFF];
    }
    

    上面就是我们在分别计算二维坐标的莫顿码或者三维坐标的莫顿码时,两种不同计算的方式,依次进行迭代的计算过程相对容易理解,但是计算复杂度相对较高,而莫顿码查询表的计算方式相对较快,但是莫顿码查询表必须知道坐标的最大值,也就是所有坐标的最大几何精度,否则其计算的结果是有问题的。
    比如我们上面计算的最大几何坐标的精度为24bit,一旦有超过24bit精度的数值,那么基于查询表计算得到的莫顿码就会出错。

    展开全文
  • JPEG图像编码过程简介

    千次阅读 2015-04-18 20:45:46
    原文地址:... ...本文介绍JPEG压缩技术的原理,对于DCT变换、Zig-Zag扫描和Huffman编码,给出一个较为清晰的框架。...1. JPEG压缩的编解码互逆过程编码 解码

    原文地址:http://blog.csdn.net/abcjennifer/article/details/8074492  向原作者致敬!


    本文介绍JPEG压缩技术的原理,对于DCT变换、Zig-Zag扫描和Huffman编码,给出一个较为清晰的框架。


    1. JPEG压缩的编解码互逆过程:

    • 编码


    • 解码






    2. 具体过程:(这里仅以编码为例,解码过程为其逆过程)

           

      A. 将原始图像分为8*8的小块, 每个block里有64pixels:




         



        B. 将图像中每个8*8的block进行DCT变换:

    数据压缩中有很多变换,比如KLT(Karhunen-Loeve Transform),这里我们用的是DCT离散余弦变换。和FFT一样,DCT也是将信号从时域到频域的变换,不同的是DCT中变换结果没有复数,全是实数。每8*8个original pixels都变成了另外8*8个数字,变换后的每一个数都是由original 64 data通过basis function组合而得的,如下图所示为DCT谱中6个元素的由来。


    低频部分集中在每个8*8块的左上角,高频部分在右下角所谓JPEG的有损压缩,损的是量化过程中的高频部分。为什么呢?因为有这样一个前提:低频部分比高频部分要重要得多,romove 50%的高频信息可能对于编码信息只损失了5%。




        



        C. 量化:

    所谓量化就是用像素值÷量化表对应值所得的结果。由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。JPEG使用的颜色是YUV格式。我们提到过,Y分量代表了亮度信息,UV分量代表了色差信息。相比而言,Y分量更重要一些。我们可以对Y采用细量化,对UV采用粗量化,可进一步提高压缩比。所以上面所说的量化表通常有两张,一张是针对Y的;一张是针对UV的。

    通过量化可以reducing the number of bits and eliminating some of the components,达到通低频减高频的效果,如下图所示就是两张量化表的例子. 


    比如左边那个量化表,最右下角的高频÷16,这样原先DCT后[-127,127]的范围就变成了[-7,7],固然减少了码字(从8位减至4位)。



        


        D. 编码分类:

    编码信息分两类,一类是每个8*8格子F中的[0,0]位置上元素,这是DC(直流分量),代表8*8个子块的平均值,JPEG中对F[0,0]单独编码,由于两个相邻的8×8子块的DC系数相差很小,所以对它们采用差分编码DPCM,可以提高压缩比,也就是说对相邻的子块DC系数的差值进行编码。

    另一类是8×8块的其它63个子块,即交流(AC)系数,采用行程编码(游程编码Run-length encode,RLE)。这里出现一个问题:这63个系数应该按照怎么样的顺序排列?为了保证低频分量先出现,高频分量后出现,以增加行程中连续“0”的个数,这63个元素采用了“之”字型(Zig-Zag)的排列方法,如下图所示。






        E. 编码格式:

    上面,我们得到了DC码字和 AC行程码字。为了进一步提高压缩比,需要对RLE编码结果再进行熵编码,这里选用Huffman编码。Huffman编码具体不讲啦,详细地看我以前的这篇Huffman编码——原理与实现吧

    展开全文
  • cabac编码过程的解读

    千次阅读 2014-12-08 15:13:48
    cabac编码过程的解读  CABAC是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。它很好地利用了语法元素数值之间的高阶信息,使得熵编码的效率

    源地址:http://blog.163.com/laorenyuhai126%40126/blog/static/193507792010813822759/

    cabac编码过程的解读  
            CABAC是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。它很好地利用了语法元素数值之间的高阶信息,使得熵编码的效率得到了进一步提高。它的主要特点有:利用每个语法元素的上下文关系,根据已编码元素为待编码元素选择概率模型,即上下文建模;根据当前的统计特性自适应地进行概率估计;使用算术编码。[5]
            在CABAC中编码一个单独的句法元素的通用方框图。这个编码过程主要由三个基本步骤组成:
    1、二值化;
    2、上下文建模;
    3、基于表格的二进制算术编码。
            在第一步,一个给出的非二进制值的句法元素唯一地对应到一个二进制序列,叫二进制串。当给出一个二进制值的句法元素时,这一初始步骤将被跳过,如图1所示。对于每个元素的二进制串或每个二进制值的句法元素,后面会根据编码模式有一两个子步骤。
            接下来就是对二元数据进行编码,标准中有两种编码模式可供选择。在常规编码模式(regular coding mode)中,一个句法元素的每一个二进值(bin)按其判决产生的顺序进入上下文模型器,在这里,模型器根据已经编码过的句法元素或二进值为每一个输入的二进值分配一个概率模型,这就是上下文模型化。然后该二进值和分配给它的概率模型一起被送进常规算术编码器进行编码,此外编码器还要根据该二元位的值反馈一个信息给上下文模型器,用以更新上下文模型,这就是编码中的自适应;另一种模式是旁路编码模式(bypass coding mode),在该模式中,没有模型器为每个二进值分配一个特定的概率模型,输入的二元数据是直接用一个简单的旁路编码器进行编码的,这样做是为了加快整个编码(以及另一端解码)的速度,当然,该模式只用于某些特殊的二进值。
    后面将更加详细地讨论二值化,上下文建模与基于表格的二进制算术编码这三个主要步骤以及它们之间的相互联系。
    2.2二值化
            CABAC的二值化方案有四种基本类型:一元码,截断一元码,k阶指数哥伦布编码,与定长编码。此外,还有基于这些基本类型的联合的二值化方案与基于查表的二值化方案。

    2.2.1 一元码(Unary)
            对于一个非二进制的无符号整数值符号x≥0,在CABAC中的一元码码字由x个“1”位外加一个结尾的“0”位组成。例如,输入的句法元素值为4,其二值化结果为11110。

    2.2.2 截断一元码(Truncated Unary, TU)
            已知截断值S。对于一个非二进制的无符号整数值符号0≤x<S,使用一元码进行二值化。对于等于一个非二进制的无符号整数值符号x=S,其二值化结果全部由1组成,长度为S。例如,当截断值S=4时,句法元素值为3的二值化结果为1110,而句法元素值为4的二值化结果为1111。

    2.2.3 k阶指数哥伦布编码(kth order Exp-Golomb, EGk)
             指数哥伦布编码是由一个前缀和一个后缀的码字连接组成的。EGk码字的前缀部分由l(x)=[log2x(x/2k+1)]的值所对应的一元码组成。EGk码字的后缀部分可以通过使用长度为k+l(x)位的x+2k(1-2l(x))的二进值来计算。另外,EGk码字也可以通过下面的伪C代码推得。
    while(1)
    {
      if (x>=(1<<k))
      {
          put(1);
          x=x-(1<<k);
          k++;
       }//EGk的一元码前缀
      else
      {
        put(0);//前缀的截止位“0”
        while(k--)
        put((x>>k)&0x01); //EGk的后缀
      }
      break;
    }

    2.2.4 定长编码(Fixed-Length, FL)
            对用到定长编码二进化的句法元素值假设了一个有限的字母表 [0,1,2,…,Cmax],编码的二进制长度为  。其中,二进制1对应其中重要性最低的符号,随着重要性的增加,二进制数也会跟着增加。

    2.2.5  4位FL与截断值为2的TU联合二值化方案
             前缀使用长度为4位(Cmax=15)的定长编码,后缀使用截断值S=2的一元截断码。 

    2.2.6  TU与EGk的联合二值化方案(Unary/kth order Exp-Golomb, UEGk)
             前缀使用一元截断码,后缀使用k阶哥伦布编码。对于不同的句法元素值,有不同的截断值与阶数。 

    2.2.7 各种句法元素值的二值化
            宏块跳过标记mb_skip_flag、4*4亮度块的帧内预测模式标记prev_intra4x4_pred_mode_ flag、8*8亮度块的帧内预测模式标记prev_intra8x8_pred_mode_ flag、当前宏块的帧/场模式标记mb_field_decoding_flag、已编码块标记coded_block_flag、重要系数标记significant_ coeff_flag、最后一个重要系数标记last_significant_coeff_flag、系数符号位标记coeff_sign_ flag、片结束标记end_of_slice_flag、8*8转换系数块标记transform_size_8x8_flag均使用1位的定长编码。
            运动矢量差的绝对值使用截断值为9的UEG3二值化。
            色度帧内预测模式intra_chroma_pred_mode使用截断值为3的TU二值化。
            转换系数的绝对值减1一coeff_abs_level_minus1使用截断值为14的UEG0二值化。
            块编码模式coded_block_pattern使用4位FL与截断值为2的TU联合二值化方案。该句法元素指定了6个块,其中4个用于亮度,2个用于色度,表示其中是否含有非零系数。coded_block_pattern=coded_block_patternY+16*nc,首先,亮度部分的coded_block_patternY使用的是4位FL变换,而色度部分nc用的是截止值为2的TU二进制变换。
            宏块类型mb_type与子宏块类型sub_mb_type的二值化通过查表获得,详情参见标准。
            各句法元素的二值化方案可以参见标准中的表9-25。

    2.2.8 联合二值化方案编码实例
           输入的句法元素值为幅度的绝对值abs_level=20。则coeff_abs_level_minus1=19,对此使用截断值S=14,阶数k=0的UEG0二值化方案。
    先编码前缀部分,按照编码规则易得二进制序列为11 1111 1111 1111(14个1)。再编码后缀部分,下面分别按照伪C代码与编码规则进行编码:
    1、按照伪C代码进行编码
    x = 19 – S = 5。
    进行第一次循环:5>1(即1<<0),因此put(1), x=5-1=4, k+1=1;
    进行第二次循环:4>2(即1<<1),因此put(1), x=4-2=2, k+1=2;
    进行第三次循环:2<4(即1<<2),因此put(0);
    至此得到EG0的前缀一元码与截断位0。
    进行第一次循环:k-1=1,因为(x>>k)&0x01=(2>>1)&0x01=1,所以put(1);
    进行第二次循环:k-1=0,因为(x>>k)&0x01=(2>>0)&0x01=0,所以put(0);
    至此得到EG0的后缀序列10。
    2、按照编码规则进行编码
           由x=5得l(x)=[log2x(x/2k+1)]=2,对应的一元码110即为EG0前缀。又因为x+2k(1-2l(x))=5-3=2=(10)2,其中后缀码字长度为k+l(x)=2,则EG0后缀为10。
    可见,两种方法得到的联合二值化后缀码字相同,均为11010,则最终输出的二进制序列为11 1111 1111 1111 11010。
    2.3上下文建模
            CABAC将片(Slice)作为算术编码的生命期。但对具体句法元素的编码却是发生在宏块级。实际上,在同一个宏块中,不同的句法元素是独立编码。但在不同的宏块中,相邻宏块的句法元素的上下文信息(包括概率状态state与最大概率符号MPS的值)可用于编码当前宏块的同一句法元素。

    2.3.1 上下文的初始化(包括m,n,pre_state,state,mps)
             在开始编码一个新的片时,都会对每个上下文模型指定相应的一对变量(m, n),并根据m, n的值计算出每个上下文模型对应的初始概率状态state与最大概率符号MPS的值。该初始化的过程有以下三个步骤:
    1、计算 pre_state=((m*(QP-12))>>4)+n;//qp由下面的式子产生
    PS:slice_qp_delta表示用于条带中的所有宏块的的QPy的初始值,该值在宏块层将被mb_qp_delta的值修改,该条带初始QPy量化参数按下面的公式计算:SliceQPy=26+pic_init_qp_minus26+slice_qp_delta
    slice_qp_delta应该受限,这样SliceQPy的值将在-QpBdOffsetY到+51之间;
    2、对于P和B帧图像限制pre_state在[0,101]内,对于I帧图像,限制pre_state在[27,74]内,即pre_state= min(101, max(0, pre_state))(对P 和B帧),pre_state=min (74,max(27, pre_state))(对I帧);
    3、将pre_state按以下规则映射到数组{state, MPS}:如果pre_state<=50,{state=50- pre_state, MPS=0},否则{state= pre_state-51, MPS=1}
    对于不同上下文模型的(m, n)分配参看标准。

    2.3.2 上下文模型的分类
           上下文模型大概可以分成4种。
           第一种上下文模型包含当前要编码的句法元素的 两个相邻块的已编码句法元素 的信息,其中相邻块的具体位置就要看句法元素了,一般是根据左边与上边的相邻块。
           第二种上下文模型只对mb_type与sub_mb_type的句法元素有定义。对于这种上下文模型,之前已编码的二进串的值(b0, b1, b2,…, bi-1)是用来为一个索引为i的二进制句法元素值选择模型的。
           第三与第四种上下文模型都是只应用在残差数据上。与其它上下文模型不同,这两种类型都是依赖于不同块种类的上下文范围,如下文所示。
    其中,第三种类型并不依赖于已编码数据,而是待编码数据在扫描路径上的位置。对于第四种类型,首先在前面已编码(已解码)的变换系数幅度中,统计出具有某个特定值的变换系数幅度出现的总次数,然后根据这个数值来为当前变换系数中的二进值确定上下文模型。
    除了这些基于条件概率的上下文模型,还有固定的概率模型映射到为那些已在常规模式被编码的所有二进串的,以及先前没有指定范围的的上下文模型可以用到的二进值索引。
    2.3.3 上下文模型的分配与确定
           通常,每个句法元素的上下文模型根据上下文索引偏移量与上下文增量来确定。其中,上下文索引偏移量对于特定类型片中的特定句法元素是唯一确定的,可以在标准中通过查表获得。而上下文增量,则是根据相邻块的编码情况(也就是上下文信息)得出。
           对于不同的句法元素,所需相邻块的信息不同,但一般包括可用性(如当前块在片的边缘上,则相邻快可能由于不是在同一片中而不可用)与同一句法元素的编码值。
    通常用于计算上下文增量的上下文建模函数为ctx_var_spat=cond_term(A,B),A和B表示当前块的相邻块。其中cond_term()表示的是一种函数关系,有以下3种具体情况:
    ctx_var_spat1=cond_term(A) + cond_term(B);
    ctx_var_spat2=cond_term(A) + 2*cond_term(B);
    ctx_var_spat3=cond_term(A)
           另外,对于利用先前bin值(已编码值)的上下文建模函数为ctx_var_bin[k] = cond_term (b1, …, bk-1)
           各句法元素的上下文增量的具体推导过程参见标准。
    2.4二进制算术编码
           算术编码是基于区间划分的,CABAC的算术编码有以下3个明显性质:
    1、概率估计是对小概率符号LPS(Plps<0.5)的概率而言的,是通过基于表格中64个不同概率状态{Pk|0≤k<64}之间的相互转换而实现的。
    2、区间长度R通过一组预先量化的值{Q1,Q2,Q3,Q4}进行量化以计算新的间隔区间。通过储存一个二维表格TabRangeLPS来决定LPS的新的子间隔范围Rlps,表格包含所有64*4预计算值Qi * Pk,通过快速查表这样就可以免除算术编码中的乘法运算了。
    3、对近似均匀分布(Plps=0.5)的句法元素,在编码和译码时选择旁路方式,可以免除上下文建模,提高编码速度。
    2.4.1 概率估计
           在H.264/AVC中的免除乘法的二进制编码基本思想依赖于一个假设:每一个上下文模型估计的概率可以用一个有效的有限的特征值集合来表征。对于CABAC,对LPS有64个特征概率值 。
           伸缩因子 ,N=64
           一方面想要获得快速的自适应 N要小;另一方面,如果想获得更加稳定更加精确的估计,则需要更大的N。注意在MQ编码中,在CABAC方法中,不需要对LPS的概率值进行表格化。在算术编码中,每一个概率仅仅用其相关的索引作为地址。
           这样设计的结果导致,CABAC中的每一个上下文模型可以有两个参数完全决定:LPS概率当前估计值()和MPS的值 (0或者1)。这样,在CABAC的概率估计中有128个不同的状态,每一个状态用一个7位整型数来表达。
           实际上,有一个状态的索引()对应着LPS的最小概率值,但它并没有被纳入CABAC的概率估计和更新的范围,这个值被用作特殊的场合,传达特殊的信息。比如,当解码器检测到当前区间的划分依据是这个概率值时,认为这表示当前流的结束。因此只有126个有效概率状态。另外,有一个状态的索引()对应LPS的最小概率值,它对应的更新值是它自身,当MPS连续出现,LPS的概率持续减小,直到保持不变。
           概率估计指的是上下文的更新,因此只发生在编码不同块中同一句法元素或者其它上下文发生改变的时候,它是通过在LPS的64个概率状态之间互相转移而实现的。
    对于一个给定概率状态,概率的更新取决于状态索引和已经编码的符号值(MPS or LPS)。更新过程导致一个新的概率状态,潜在的LPS概率修正,如果有必要需要修改MPS的值。如果当state=0时,也就是LPS的概率已经达到了最大值0.5,输入的是一个小概率符号LPS,那么MPS和LPS就要互换,因为state=0时,Plps=0.5。
    在I片中,有:
               if(decision==MPS)
                                state<-next_state_MPS_intra(state)
               else              

                                 state<-next_state_LPS(state)
    在其他片中,有:
              if(decision==MPS)
                                state<-next_state_MPS (state)
              else               

                                state<-next_state_LPS(state)
      
    2.4.2 算术编码器的总体描述
           CABAC编码器由两个子编码器组成,一个用于常规编码模式,另一个称为旁路编码器用于符号的快速编码。下面对常规编码器具体的编码过程进行描述,编码过程必须与后面介绍的译码过程相匹配(H.264标准文件中给出了译码流程,没给出具体的编码流程,下面给出的是可参考的编码流程,必须与译码流程匹配)
    1、首先是编码器的初始化
           该过程是发生在编码片的第一个宏块之前,在编码I_PCM宏块的数据元素pcm_alignment_zero_bit和所有pcm_byte数据之后的。此过程中,输出的是算术编码器中的相关参数,区间下限codILow设置为0,区间长度codIRange设置为0x01FE,另外的firstBitFlag设置为1,计数器(用于防止相关寄存器溢出)bitsOutstangding和symCnt都被设置为0。
    2、编码决定
           此过程输入的是Binval(语法元素经过二进制化后的值),context_id(上下文模型)和编码器的环境codirange,codilow和symCnt,输出的值是codirange,codilow和symCnt。如图2.2所示。
    该过程可以分为4个步骤
    (1)通过当前编码器区间范围codiRange计算Qi的索引值i,然后利用状态索引(由上下文模型得到)和i进行查表得出Rlps的概率。
    (2)根据要编码的符号是否MPS来更新算术编码中的概率区间下限和概率区间范围。
    (3)上下文模型概率状态的更新(参考前文)
    (4)重整化处理,具体操作在后文给出。 
    3、重整化处理
           在区间划分结束后,如果新的区间范围R不在合法范围[28   29]之内,那么就需要进行重整化操作,输出1位或多位。其中用到的PutBit程序。
    4、旁路编码模式
            首先,概率估计和更新过程的旁路被建立;
           其次,间隔细分被执行 
           最后,编码完片内所有宏块的句法元素后,写入end_of_slice_flag的标志,然后进行字节压缩,在编码完一幅图像的所有元素后,所有输出的二进制位都会进行封装,成为适合NAL层的传输单位。

    展开全文
  • 文章以akiyo_qcif.yuv为例,描述了HM-16.0的编码过程,将YUV文件编码成了HEVC格式的码流(*.bin)。
  • cudaEncode编码详细过程

    千次阅读 2011-08-05 15:40:41
    cudaEncode编码详细过程如下: 一,ParseInputParams(argc, argv,&sEncoderParams) //配置参数:输入、输出文件,配置文件,基本的参数   二,pCudaEncoder = new VideoEncoder (&sEnc
  • 以下资料来自:网络+最后的整合 ...一、什么是one-hot编码 One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独...
  • java编码解码过程

    千次阅读 2015-12-26 12:35:15
     所以总的来说,编码的原因可以总结为:计算机中存储信息的最小单元是一个字节,即8个bit,所以能表示的字符范围是0-255个;人类要表示的符号太多,无法用一个字节来完全表示。 要解决这个矛盾必须要有一个新的...
  • 哈夫曼编码及其解码全过程

    万次阅读 2018-07-20 10:59:29
    今年的小学期我选了做哈夫曼编码,老师的要求是这样的: 编—译码系统的设计   内容: (1) 读入待编码的文字,统计各字符出现的频率 (2) 构造哈夫曼树 (3) 得到各字符的哈夫曼编码 (4) 对原文...
  • 白话——海明校验码及编码过程

    千次阅读 多人点赞 2019-01-15 10:20:35
    想着做一个总结过程,希望像我这样的小白能免幸遇难。本文适合对海明校验码不清楚的小白,大神请绕路。有不全面的地方,麻烦大家指正,毕竟我也还只是个大学生,下面直接进入正题。 相信大家肯定之前也肯定看了很多...
  • 信息分类编码

    千次阅读 2013-03-05 09:16:28
    信息分类编码  信息分类编码(Information Classifying and Coding)是标准化的一个领域,已发展成了一门学科,有自身的研究对象、研究内容和研究方法。在现代社会中,信息分类和编码是提高劳动生产率和科学...
  • 前后端交互过程中的编码

    千次阅读 2016-07-25 13:32:51
    前后端交互过程中涉及的编码 Browser cilent: 首先,浏览器的设置里有设置编码格式,一般设置为UTF-8。 AJAX request: AJAX异步请求的过程中可以设置编码,contentType:"application/x-www-form-urlencoded
  • LTE物理层之信道编码--数据信息编码:turbo编码

    万次阅读 多人点赞 2015-03-09 15:29:24
    Turbo编码巧妙地将两个简单分量码通过伪随机交织器并行级联来构造具有伪随机特性的长码,并通过在两个软入/软出(SISO)译码器之间进行多次迭代实现了伪随机译码。他的性能远远超过了其他的编码方式,得到了广泛的关注...
  • 模块作用:对控制信息和广播信道进行信道编码,增强鲁棒性。 咬尾卷积码优缺点:克服了码率损失的问题,并且适合迭代译码,但是译码复杂度增加了。 通常卷积码编码器开始工作时都要进行初始化,常常将编码器的所有...
  • 信息论实验-信源编码2(Lz编码和算数编码的C++实现)

    万次阅读 多人点赞 2017-08-13 17:21:36
    上一篇文章给出了Huffman编码和Shannon Fano编码编码原理以及C++的程序,程序可以用来实现给任意类型的文件进行无损压缩,缺点是比较耗时,不能作为正常的通用压缩软件来使用,但是作为算法理解,算法思路是没有...
  • asn1编码格式的解析过程

    万次阅读 2010-05-02 15:09:00
    x509证书的解析实际上是asn1格式的解析,这里着重说的是asn1的ber编码的解析,总的来讲,asn1格式的解析过程有三个重要的元素,一个是asn1数据本身,一个是openssl的内部数据结构,比如X509_st,还有一个指导asn1...
  • 哈夫曼编码原理解析及算法构造过程 一.哈夫曼编码 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现...
  • TensorFlow实战之实现自编码过程

    千次阅读 2018-02-24 22:00:10
    本文根据最近学习TensorFlow书籍网络文章的情况,特将...1、稀疏性(Sparsity)及稀疏编码(Sparse Coding)  Sparsity 是当今机器学习领域中的一个重要话题。  Sparsity 的最重要的“客户”大概要属 high dim...
  • 信息论与编码之课设-哈夫曼编码

    千次阅读 2016-11-26 19:45:41
    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,  夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之...
  • 浅谈浏览器的编码与解码过程

    千次阅读 2017-09-13 11:10:50
    浏览器是如何解码的 无论是作为开发,还是作为黑客,企图从Web 端注入...下面我们要做的,是去了解浏览器到底如何解码,该如何在解码过程中避免漏洞的产生。在此之上,我更愿意揭开整个浏览器的工作流程,了解其本质。
  • java 解决接口调用过程中的编码问题

    千次阅读 2017-07-19 11:31:46
    在网络传输中,信息都是以字节序列的方式传输的。所以,发送方的String要按照某种编码方式(如UTF-8,GBK)编码为字节序列,在网络中传输后,接收方取得这个字节序列,按照相同的编码方式将字节序列解码为String。...
  • 信息论之哈夫曼编码

    千次阅读 2018-11-06 19:01:06
    先将信源符号的概率按...码字W1是按照对应一行的信源符号ai的概率p(ai)在编码过程中担任了0or1,先标记的数字在后面,后标记的在前面。 码长Ki为二进制码字的位数。 将表5-5和5-6中编码过程横向看即可发现,...
  • 实现压缩编码算法——Huffman编码 2. 实现压缩编码算法——Shannon Fano编码 3. 实现压缩编码算法——LZ编码 4. 实现压缩编码算法——算数编码 5. 利用上述压缩算法压缩图像、音频、视频文件,分析压缩算法的性能。...
  • 一个和最优编码长度差距在常数倍之内的方法是γ 编码。γ 编码将间距G表示成长度(length)和偏移(offset)两个部分进行变长编码。G的偏移实际上是G的二进制编码,但是前端的1 被去掉①。比如,对13(二进制为1101...
  • JSP页面请求响应过程中的编码解码

    千次阅读 2017-02-19 17:35:51
    该编简要讲述:JSP页面传输过程中,浏览器与服务器的编码解码以及HTTP协议对URL进行的编码解码。无意间在网络上看到这样一个问题,让我不得其解。查询了诸多资料,稍有眉目。问题如下:所有的JSP页面的编码都是UTF-8...
  • 出现这种问题,有可能你开了“Power save mode”,模式,关闭即可! 设置路径:“File/Power save mode” 原创,不经本人同意,不得转发! ...还有个原因估计是:有可能是因为你在“setting/file type/”添加过滤...
  • 信息论与编码之算术编码

    千次阅读 2014-04-23 08:55:17
    其中,源数据出现的频率决定该算法的压缩效果,同时也决定编码过程中源数据对应的区间范围,而编码区间则决定算术压缩算法的最终输出数据。 对“a,b,d,a”进行算术编码的步骤如下: 1)初始化时,被分割范围的...
  • ByteArray to String过程中的编码问题

    千次阅读 2017-04-20 16:00:07
    最近因为工作需要,有一个不太常见的需求,中间遇到了一些不太常见的编码的坑,特此记录。因为环境限制,开发语言为Java。需求可以概括为: 发送端将数据序列化后得到的二进制byte数组转为String 接收端接收String后...
  • 信源编码与信道编码

    千次阅读 2018-04-20 19:14:18
    信源编码:对输入信息进行编码,优化信息和压缩信息,并打包成符合标准的数据包。信源编码的主要作用是:1. 将模拟信号转化为数字信号;2. 对数据进行压缩。在保证通信质量的前提下,尽可能的通过对信源的压缩,提高...
  • cudaEncode编码详细过程 H.264

    千次阅读 2015-11-16 14:56:46
    一,ParseInputParams(argc, argv,&sEncoderParams) //配置参数:输入、输出文件,配置文件,基本的参数   ... 执行的详细过程: 1,fpIn= fopen(m_pEncoderParams->inputFile,"rb")输入文件 2

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 627,419
精华内容 250,967
关键字:

信息的编码过程