精华内容
下载资源
问答
  • Content:视频编码常用编码方法介绍 1、熵编码 编码过程中按照熵原理不丢失任何信息的编码,即编码过程中不丢失信息量,保存信息熵。 熵编码是无损压缩的编码方法。 常见的熵编码方法:香农编码(shannon)...

    Date: 2017/10/21

    Content:视频编码中常用熵编码方法介绍


    1、熵编码

      编码过程中按照熵原理不丢失任何信息的编码,即编码过程中不丢失信息量,保存信息熵。

      熵编码是无损压缩的编码方法。

      常见的熵编码方法:香农编码(shannon)、哈夫曼编码(huffman)、算术编码(arithmetic coding)、哥伦布编码(Golomb Codes)、游程编码等。

    2、可变长编码(Variable Length Coding,VLC)

      可变长编码通过给出现概率大的符号赋予较短的码字,改变码字长度达到压缩信息冗余的目的,编码和解码过程完全可逆,又称为统计编码和无失真的压缩编码方法。最常用的可变长编码为Huffman、哥伦布编码、游程长度编码。

    3、算术编码(Arithmetic coding)

       算术编码的本质是对输入流分配一个码字,而不是为每个符号分配一个码字。算术编码对整条信息(无论多长),其输出仅仅是一个小数,而且是介于0和1之间(半开区间[0,1))的二进制小数。如果算术编码对某条信息的输出为1010001111,那么表示的是小数0.1010001111,换算成十进制即为0.64。

        3.1 编码

       算术编码不是单独对一个码字进行编码,而是对整条信息进行编码。

    编码举例:

         考虑某条信息中可能出现的字符仅有a,b,c三种,我们要编码的字符串为bccb。

    (1) 假设三者出现概率一样,即p(a) = p(b) = p(c) = 1/3,将0~1区间按照概率的比例分配给三个字符a b c;

    (2) 第一个b在(0.3333, 0.6667),此时三个字符的概率调整后为p(a) = 1/4,p(b) = 2/4,p(c) = 1/4,将(0.3333, 0.6667)区间分配给三个字符。

    (3) 输入第二个字符c,c的区间为(0.5834,0.6667);

    (4) 此时概率重新更新为p(a) = 1/5,p(b) = 2/5,p(c) = 2/5,用这个概率分布划分区间(0.5834,0.6667);

    (5) 输入第三个字符c,c的区间为(0.6334,0.6667);

    (6) 更新三个字符的概率分布为p(a) = 1/6,p(b)=2/6,p(c)=3/6,用这个概率分布划分区间(0.6334,0.6667);

    (7) 最后一个字符b,得到b的区间为(0.6390,0.6501);因此只需要在这个区间中随便选择一个容易变成二进制的小数即可,比如0.64,将它变成二进制位0.1010001111,去掉没有太多意义的0和小数点,可以输出1010001111,编码结束。

     

    3.2 解码

      解码过程与编码大致相同,描述如下:

    (1) 解码之前假定三个字符的概率相同,并得到上面的第一幅分布图。解码时获取的二进制流为1010001111,先变成小数即为0.64;

    (2) 0.64落在字符b区间,立即输出字符b,并得到三个字符新的概率分布;

    (3) 采用新的概率分布划分b的区间,在新的划分中0.64落在字符c的区间,输出字符c,得到三个字符新的概率分布;

    (4) 采用新的概率分布划分c的区间,在新的划分中0.64落在字符c的区间,输出字符c,得到三个字符新的概率分布;

    (5) 采用新的概率分布划分c的区间,在新的划分中0.64落在字符b的区间,输出字符b;

    (6) 完成消息长度的解码,不再继续划分。

        编码器和解码器都知道信息的长度,因此解码器的解码过程不会无限制的运行下去。实际上在解码器中需要添加一个专门的终止符,当解码器看到终止符时就停止解码。

     

    3.3 多阶算术编码

       编码时考虑符号之间的相关性,把多个符号按照不同的上下文结构组合在一起,当作一个编码单元进行自适应算术编码,可以进一步提高编码效率。可以用“阶”表示上下文相关符号序列的长度,1阶上下文自适应统计的就是符号在某个特定的符号后面出现的概率,同样2阶、3阶上下文自适应统计的是符号在某两个、三个特定符号后出现的概率,使用多阶算术编码,使地同一符号可以在多个动态统计的上下文概率表中取得概率值较大的进行编码。

    4、Huffman编码原理

    参考:http://blog.csdn.net/abcjennifer/article/details/8020695

    5、Shannon-Fano编码

         参考:http://blog.csdn.net/abcjennifer/article/details/8022445

                 Wikipedia:https://en.wikipedia.org/wiki/Shannon%E2%80%93Fano_coding

    6、指数哥伦布编码

      参见我的blog: http://blog.csdn.net/soaringlee_fighting/article/details/78178405

    7、CABAC编码

      参见我的blog:http://blog.csdn.net/soaringlee_fighting/article/details/78217525

    8、CAVLC编码

      参见我的blog:http://blog.csdn.net/soaringlee_fighting/article/details/78240878

    9、几种熵编码方法的Matlab实现

    香农编码:

    %% 1.香农编码实现MATLAB
    %界面输入的信源分布
    %举个栗子:[0.01,0.02,0.07,0.04,0.06,0.8] [0.2,0.18,0.17,0.15,0.19,0.1,0.01]
    I = imread('lena.bmp');
    figure,imshow(I);title('原始图像');
    [M,N,dim] = size(I);
    if(dim ~= 1)
       I = rgb2gray(I); 
    end
    
    I1 = I(:);
    P = zeros(1,256);
     %获取各符号的概率;
     for i = 0:255
         P(i+1) = length(find(I1 == i))/(M*N);
     end
    
    pa = P; 
    k = length(pa);
    y=0;%给y赋初值,用来求概率和
    f=0;%给f赋初值,用来得到子程序最大循环次数
    s=zeros(k,1);   %对求和结果进行矩阵初始化
    b=zeros(k,1);   %对编码位数矩阵初始化
    w=zeros(k,1);  %对二进制矩阵初始化
    
    %进行香农编码
    disp('----------香农编码中------------');
    for m=1:k; 
      s(m)=y;
      y=y+pa(m);
      b(m)=ceil(-log2(pa(m)));%求得的自信息量向上取整,得到码字长度
      z=zeros(b(m),1); %对码字矩阵初始化
      f=max(b(m)); %把码字最大长度赋给f,用于进行十进制转二进制
      w=dtob(s(m),f); %调用子程序将十进制转换为二进制
       for r=1:b(m)
            z(r)=w(r);
       end
    end
    
    
    L=0;
    H=0;
    for i=1:k     %使用for循环进行信息熵、平均码长求解
    	a(i)=-log2(pa(i));	%a(i)表示单个信源的自信息量
    	 K(i)=ceil(a(i));	%K(i)表示对自信息量向上取整
    	 R(i)=pa(i)*K(i);
    	 L=L+R(i);	%求平均码长
    	 c(i)=a(i)*pa(i);
    	H=H+c(i); 	%信息熵
    end
    Y=H/L;	%用Y来表示编码效率(压缩比)
    disp(['信息熵H(X)=',num2str(H),'(bit/sign)']);
    disp(['平均码长K=',num2str(L),'(bit/sign)']);
    disp(['香农编码压缩比=',num2str(Y)]); 
    disp('------------------------------');

    费诺编码:

    function y=fano_code(A)
    B=fliplr(A);
    [m,n]=size(B);
    M=1;
    N=n;
    Z=ones(1,n).*n;
    
    for j=1:n
        C(j)={''};
    end
    
    for i=1:n
        while(Z(i)>2)
            a=sum(B(1,M:N),2)/2;
            for K=M:N
                if sum(B(1,M:K),2)>=a
                    if i<=K
                        char=cell2mat(C(i));
                        char=[char '0'];
                        C(i)={char};
                        N=K;
                        Z(i)=N-M+1;
                        break;
                    else
                        char=cell2mat(C(i));
                        char=[char '1'];
                        C(i)={char};
                        M=K+1;
                        Z(i)=N-M+1;
                        break;
                    end
                end
            end
        end
        
        if Z(i)==2
            if i==M
                char=cell2mat(C(i));
                char=[char '0'];
                C(i)={char};
            else
                char=cell2mat(C(i));
                char=[char '1'];
                C(i)={char};
            end
        end
        M=1;
        N=n;
    end
    
    celldisp(C);
    y = C;
    end

    算术编码:

    function code = ACBAenco(seq)
    % Check the incoming orientation and adjust if necessary
    [row_s, col_s] = size(seq);
    if (row_s > 1),
        seq = seq.';
    end
    counts = [1,1];
    cum_counts = [0, cumsum(counts)];
    total_count = cum_counts(end);
    N = 16;
    dec_low = 0;
    dec_up = 2^N-1;
    E3_count = 0;
    % Obtain an over estimate for the length of CODE and initialize CODE
    code_len = length(seq) * ( ceil(log2(length(counts))) + 2 ) + N;
    code = zeros(1, code_len);
    code_index = 1;
    
    % Loop for each symbol in SEQ
    for k = 1:length(seq)
    
        symbol = seq(k);
        % Compute the new lower bound
        dec_low_new = dec_low + floor( (dec_up-dec_low+1)*cum_counts(symbol+2-1)/total_count );
    
        % Compute the new upper bound
        dec_up = dec_low + floor( (dec_up-dec_low+1)*cum_counts(symbol+1)/total_count )-1;
    
        % Update the lower bound
        dec_low = dec_low_new;
        
        % Check for E1, E2 or E3 conditions and keep looping as long as they occur.
        while( isequal(bitget(dec_low, N), bitget(dec_up, N)) || ...
            (isequal(bitget(dec_low, N-1), 1) && isequal(bitget(dec_up, N-1), 0) ) ),
            
            % If it is an E1 or E2 condition,
            if isequal(bitget(dec_low, N), bitget(dec_up, N)),
    
                % Get the MSB
                b = bitget(dec_low, N);
                code(code_index) = b;
                code_index = code_index + 1;
            
                % Left shifts
                dec_low = bitshift(dec_low, 1) + 0;
                dec_up  = bitshift(dec_up, 1) + 1;
                
                % Check if E3_count is non-zero and transmit appropriate bits
                if (E3_count > 0),
                    % Have to transmit complement of b, E3_count times.
                    code(code_index:code_index+E3_count-1) = bitcmp(b, 1).*ones(1, E3_count);
                    code_index = code_index + E3_count;
                    E3_count = 0;
                end
    
                % Reduce to N for next loop
                dec_low = bitset(dec_low, N+1, 0);
                dec_up  = bitset(dec_up, N+1, 0);
                
            % Else if it is an E3 condition    
            elseif ( (isequal(bitget(dec_low, N-1), 1) && ...
                isequal(bitget(dec_up, N-1), 0) ) ),
                
                % Left shifts
                dec_low = bitshift(dec_low, 1) + 0;
                dec_up  = bitshift(dec_up, 1) + 1;
    
                % Reduce to N for next loop
                dec_low = bitset(dec_low, N+1, 0);
                dec_up  = bitset(dec_up, N+1, 0);
                
                % Complement the new MSB of dec_low and dec_up
                dec_low = bitxor(dec_low, 2^(N-1) );
                dec_up  = bitxor(dec_up, 2^(N-1) );
                
                % Increment E3_count to keep track of number of times E3 condition is hit.
                E3_count = E3_count+1;
            end
        end
        counts(symbol) = counts(symbol)+1;
        cum_counts = [0, cumsum(counts)];
    
        % Compute the Word Length required.
        total_count = cum_counts(end);
    end
     
    % Terminate encoding
    bin_low = de2bi(dec_low, N, 'left-msb');
    if E3_count==0,
        % Just transmit the final value of the lower bound bin_low       
        code(code_index:code_index + N - 1) = bin_low;
        code_index = code_index + N;
    else
       % Transmit the MSB of bin_low. 
       b = bin_low(1);
       code(code_index) = b;
       code_index = code_index + 1;
       
       % Then transmit complement of b (MSB of bin_low), E3_count times. 
       code(code_index:code_index+E3_count-1) = bitcmp(b, 1).*ones(1, E3_count);
       code_index = code_index + E3_count;
    
       % Then transmit the remaining bits of bin_low
       code(code_index:code_index+N-2) = bin_low(2:N);
       code_index = code_index + N - 1;
    end          
    
    % Output only the filled values
    code = code(1:code_index-1);
    % Set the same output orientation as seq
    if (row_s > 1)
        code = code.';
    end
    
    

    哈夫曼编码:

    %% 3.霍(哈)夫曼编码实现MATLAB
    I = imread('lena.bmp');
    
    [M,N,dim] = size(I);
    if(dim ~= 1)
       I = rgb2gray(I); 
    end
     I1 = I(:);
     P = zeros(1,256);
     %获取各符号的概率;
     for i = 0:255
         P(i+1) = length(find(I1 == i))/(M*N);
     end
    disp('----------哈夫曼编码中------------');
     k = 0:255;
     dict = huffmandict(k,P); %生成字典
     enco = huffmanenco(I1,dict); %编码
     [M1,N1] = size(enco);
     ratio = M*N/(M1*N1);
    
     deco = huffmandeco(enco,dict); %解码
     Ide = col2im(deco,[M,N],[M,N],'distinct'); %把向量重新转换成图像块;
    
     subplot(1,2,1);imshow(I);title('original image');
     subplot(1,2,2);imshow(uint8(Ide));title('decoded image');
    
     disp(['霍夫曼编码压缩率:',num2str(ratio)]);
    disp('------------------------------');

    游程编码:

    %% 5.游程(行程)编码RLE的matlab实现
    I1  = imread('lena.bmp');
    I1=rgb2gray(I1);
    
    I2=I1(:);  								%将原始图像写成一维的数据并设为 I2
    I2length=length(I2); 						%计算I2的长度
    I3=im2bw(I1,0.5);						%将原图转换为二值图像,阈值为0.5
    disp('----------游程编码中------------');
    %以下程序为对原图像进行行程编码,压缩
    X=I3(:);  								%令X为新建的二值图像的一维数据组
    L=length(X);
    j=1;
    I4(1)=1;
    for z=1:1:(length(X)-1)  					%行程编码程序段
    if  X(z)==X(z+1)
    I4(j)=I4(j)+1;
    else
    data(j)=X(z);  							% data(j)代表相应的像素数据
    j=j+1;
    I4(j)=1;
    end
    end
    data(j)=X(length(X)); 					%最后一个像素数据赋给data
    I4length=length(I4);  					%计算行程编码后的所占字节数,记为I4length
    CR=I4length/I2length; 					%比较压缩后与压缩前的大小
    %下面程序是行程编码解压
    l=1;
    for m=1:I4length
        for n=1:1:I4(m);
            decode_image1(l)=data(m);
            l=l+1;
        end
    end
    decode_image=reshape(decode_image1,256,256); %重建二维图像数组 						
    figure,
    x=1:1:length(X); 
    subplot(131),plot(x,X(x));%显示行程编码之前的图像数据
    y=1:1:I4length ;          				
    subplot(132),plot(y,I4(y));%显示编码后数据信息
    u=1:1:length(decode_image1);       			
    subplot(133),plot(u,decode_image1(u));%查看解压后的图像数据
    subplot(121);imshow(I3);%显示原图的二值图像
    subplot(122),imshow(decode_image); 			%显示解压恢复后的图像
    
    disp('原图像数据的长度:')
    disp(L);
    disp('压缩后图像数据的长度:')
    disp(I4length);
    disp('解压后图像数据的长度:')
    disp(length(decode_image1));
    disp('游程编码压缩率:  ')
    disp(CR);
    disp('------------END--------------');

    THE END!

    在这里插入图片描述

    展开全文
  • 视频编码常用编码介绍

    千次阅读 2018-04-13 23:35:11
    原文:https://blog.csdn.net/SoaringLee_fighting/article/details/78303747熵编码数据压缩编码的概念:编码是用一些简单的字符来表达一定的信息,例如,如果明天是晴天用1来表示,阴天就是0压缩是消除数据间的...

    原文:https://blog.csdn.net/SoaringLee_fighting/article/details/78303747

    熵编码

    数据压缩编码的概念:

    编码是用一些简单的字符来表达一定的信息,例如,如果明天是晴天用1来表示,阴天就是0

    压缩是消除数据间的相关性,一定的信息量尽量用较少的字符来表示

    压缩编码的必要性

    电子计算机的出现使信息话社会有了数字化的特点,电脑中的信息要以数字量表示出来,但我们可以简单的看一下数字话了的信息数量大小:

    一片CD-ROM 650M

    cif格式视频大小352*288 彩色,4:2:0格式存储的话

    每帧大小352*288*1.5=228096B

    播放速度30帧每秒228096*30=6842880B=6.526MB

    650/6.526=99.6s

    这个问题是多媒体技术发展中的一个非常棘手的瓶颈问题,单纯靠扩大存储器容量,增加通信干线的传输率的办法是不现实的

    通过数据压缩手段把信息的数据量压下来,以压缩形式存储和传输,既紧缩节约了存储空间,又提高了通信干线的传输效率,同时也使计算机实时处理音频视频信息,保证播出高质量的视频,音频节目成为可能

    可行性:

    多媒体文本 声音 静态图像 视频图像等信源数据有极强的相关性,也就是说有大量的冗余信息,数据压缩的目的就是消除数据间的相关性,保留相互独立的信息分量

    (以视频图像为例,空间相关性、时间相关性)

    数据压缩编码的理论基础:

    信息论,从信息论的角度来看,压缩就是去掉信息中的冗余,即保留不确定的东西,去掉确定的东西(即可以推知的东西),使用一种更接近信息本质的描述来代替原有的冗余的描述,这个本质的东西就是信息量(即不确定因素)

    信息论中的信源编码理论解决的主要问题:

    (1)数据压缩的理论极限

    (2)数据压缩的基本途径。

    根据信息论的原理,可以找到最佳数据压缩编码的方法,数据压缩的理论极限是信息熵。如果要求编码过程中不丢失信息量,即要求保存信息熵,这种信息保持编码叫熵编码,是根据消息出现概率的分布特性而进行的,属于统计编码中的一类,是无损数据压缩编码。

    熵编码的基本原理;

    熵编码立在随机过程的统计基础之上的是建

    熵的概念:

    在信息论中,有这样的信息量:

    是信号 在X中出现的概率

    信源X发出的信号 ,求n个随机时间的自信息统计平均(求数学期望),即

    H(X)在信息论中称为信源X的熵,它的含义是信源X发出任意一个随机变量的平均信息量

    数学上可以证明,等概率时间的熵最大

    以n=8为例

    熵的范围:

    在编码中用熵值衡量是否为最佳编码

    若以 表示编码器输出码字的平均码长,则

    当 有冗余,不是最佳

    当 不可能

    当 最佳编码( 稍大于 )

    熵值是平均码字 的下限

    熵编码又叫熵保存编码 信息保持编码 无失真压缩编码,要求编码输出码字的平均码长,只能大于等于信源熵,若不满足这个条件,在信源编码的过程中就要丢失信息,所以信源熵是无失真信源编码,输出码字平均码长的下限

      常见的熵编码方法:香农编码(shannon)、哈夫曼编码(huffman)、算术编码(arithmetic coding)、哥伦布编码(Golomb Codes)等。

    2、可变长编码(Variable Length Coding,VLC)

      可变长编码通过给出现概率大的符号赋予较短的码字,改变码字长度达到压缩信息冗余的目的,编码和解码过程完全可逆,又称为统计编码和无失真的压缩编码方法。最常用的可变长编码为Huffman、哥伦布编码、游程长度编码。

    3、算术编码(Arithmetic coding)

       算术编码的本质是对输入流分配一个码字,而不是为每个符号分配一个码字。算术编码对整条信息(无论多长),其输出仅仅是一个小数,而且是介于0和1之间(半开区间[0,1))的二进制小数。如果算术编码对某条信息的输出为1010001111,那么表示的是小数0.1010001111,换算成十进制即为0.64。

        3.1 编码

       算术编码不是单独对一个码字进行编码,而是对整条信息进行编码。

    编码举例:

         考虑某条信息中可能出现的字符仅有a,b,c三种,我们要编码的字符串为bccb。

    (1) 假设三者出现概率一样,即p(a) = p(b) = p(c) = 1/3,将0~1区间按照概率的比例分配给三个字符a b c;

    (2) 第一个b在(0.3333, 0.6667),此时三个字符的概率调整后为p(a) = 1/4,p(b) = 2/4,p(c) = 1/4,将(0.3333, 0.6667)区间分配给三个字符。

    (3) 输入第二个字符c,c的区间为(0.5834,0.6667);

    (4) 此时概率重新更新为p(a) = 1/5,p(b) = 2/5,p(c) = 2/5,用这个概率分布划分区间(0.5834,0.6667);

    (5) 输入第三个字符c,c的区间为(0.6334,0.6667);

    (6) 更新三个字符的概率分布为p(a) = 1/6,p(b)=2/6,p(c)=3/6,用这个概率分布划分区间(0.6334,0.6667);

    (7) 最后一个字符b,得到b的区间为(0.6390,0.6501);因此只需要在这个区间中随便选择一个容易变成二进制的小数即可,比如0.64,将它变成二进制位0.1010001111,去掉没有太多意义的0和小数点,可以输出1010001111,编码结束。


    3.2 解码

      解码过程与编码大致相同,描述如下:

    (1) 解码之前假定三个字符的概率相同,并得到上面的第一幅分布图。解码时获取的二进制流为1010001111,先变成小数即为0.64;

    (2) 0.64落在字符b区间,立即输出字符b,并得到三个字符新的概率分布;

    (3) 采用新的概率分布划分b的区间,在新的划分中0.64落在字符c的区间,输出字符c,得到三个字符新的概率分布;

    (4) 采用新的概率分布划分c的区间,在新的划分中0.64落在字符c的区间,输出字符c,得到三个字符新的概率分布;

    (5) 采用新的概率分布划分c的区间,在新的划分中0.64落在字符b的区间,输出字符b;

    (6) 完成消息长度的解码,不再继续划分。

        编码器和解码器都知道信息的长度,因此解码器的解码过程不会无限制的运行下去。实际上在解码器中需要添加一个专门的终止符,当解码器看到终止符时就停止解码。


    3.3 多阶算术编码

       编码时考虑符号之间的相关性,把多个符号按照不同的上下文结构组合在一起,当作一个编码单元进行自适应算术编码,可以进一步提高编码效率。可以用“阶”表示上下文相关符号序列的长度,1阶上下文自适应统计的就是符号在某个特定的符号后面出现的概率,同样2阶、3阶上下文自适应统计的是符号在某两个、三个特定符号后出现的概率,使用多阶算术编码,使地同一符号可以在多个动态统计的上下文概率表中取得概率值较大的进行编码。

    4、Huffman编码原理

    参考:http://blog.csdn.net/abcjennifer/article/details/8020695

    5、Shannon-Fano编码

         参考:http://blog.csdn.net/abcjennifer/article/details/8022445
                 Wikipedia:https://en.wikipedia.org/wiki/Shannon%E2%80%93Fano_coding

    6、指数哥伦布编码

      参见我的blog: http://blog.csdn.net/soaringlee_fighting/article/details/78178405

    7、CABAC编码

      参见我的blog:http://blog.csdn.net/soaringlee_fighting/article/details/78217525

    8、CAVLC编码

      参见我的blog:http://blog.csdn.net/soaringlee_fighting/article/details/7824087
    8

    展开全文
  • 常用的线路编码

    千次阅读 2020-04-16 23:27:22
    常用的线路编码 由于传输距离较近, 通常我们不进行频谱搬移而是直接在信道上传输基带信号。那么,二进制比特对应的符号序列{}选择什么样的码型,才能够使得数字基带信号适合在线路上传输? 一、线路码型的设计...

                                          常用的线路编码

           由于传输距离较近, 通常我们不进行频谱搬移而是直接在信道上传输基带信号。那么,二进制比特对应的符号序列{a_{n}}选择什么样的码型,才能够使得数字基带信号适合在线路上传输?

    一、线路码型的设计遵循的原则

          1.线路编码获得的数字基带信号应该不含有直流分量,低频分量和高频分量都不丰富功率谱较集中于中频部分。对线路码功率谱的要求是为了使其功率谱密度特性匹配于基带信道的频率特性。
     

    2.信号中应含有丰富的定时信息,以便于从接收码流中提取定时信号。

             Explanation:位定时是任何数字通信系统都不可缺少的重要环节,单极性归零码的功率谱就有位定时分量。
     

    3.不受信息源统计特性的影响,即能适应于信息源的变化。

             信源的统计特性是指信源产生各种数字信息的概率分布。适应信源的变化 要求无论信源产生的 进制比特序列 即要求无论信源产生的二进制比特序列是0, 1随机分布的,还是存在长连0,或长连1的情况,均能正常传输。

    4.具有内在的检错能力,即线路编码采用的码型具有一定的规律性, 接收端可以通过这种规律性来监测码元在信道上传输是否出现错码。

    5.误码增殖越小越好

    误码增殖:对于某些线路码型 信道中产生的单个错码会扰乱一段译码过程,从而导致译码输出信息中出现多个错误。

    6.编译码过程尽量简单 从而降低通信延时和成本。

    7.尽量提高码型的编码效率(冗余的问题)。

    二、AMI码(信号交替反转码)

    1.{a_{n}}咋来的?----基本思想

     将二进制bit序列{b_{n}}的1码映射成交替变化的+1与-1电平,0码映射成0电平。如图所示:

                      

    2.AMI码的优点

    1)无直流成分,功率谱中低频部分和高频部分都不丰富。

    2)通过对AMI码波形进行非线性变换,可以容易地提取定时信号(想方设法变成单极性归零码)。

    方法:将不含定时分量的AMI码全波整流成单极性归零码。

    3)编译码电路简单,提供了一定的检错能力(正负1交替出现)。

    3.AMI码的缺点

    当信源输出符号中出现长串连“0” 码时,由于AMI码长时间处于零电平,相当于无信号波形过来,因而时钟提取困难。如下图所示:

                   

    改进:对AMI的改进码型:HDB3。

    三、HDB_{3}码(高密度双极性码)

    1.基本思想

            以码组替换的方式改变AMI码长连0的状况,即若没有遇到4个以上连0,则仍按AMI码进行变换;若遇到4个连0, 则用取代节0001或1001去替换它。

    如何告诉接收端这一信息(就是这个4个0的信息):人为破坏传号码(也就是bit1)极性交替的规则。

    将0001--->000V,其中V要破坏正负相间,那么就得让V与前面相邻的传号码极性相同。

    将1001--->B00V,要求B和前面相邻的传号码极性相反。

    那么啥时候用B00V,啥时候用000V?

    2.B00V与000V的选取

    选取要求:

                1) V码破坏极性正负交替的规则,
                2) B码不破坏该规则;
                3) V码本身要正负交替。
    例如:

                         

       这里解释HDB_{3}码咋来的:

    ① 第一个+1是由于前面有-V,为保证正负交替,故为+1。

    ② 第一个连着的四个bit0:不管选择哪个,后三位都是000V,由于V本身要正负交替(和前面的-V正负交替),故填+V;又由于V要破坏正负相间,前面已经有个+1了,已经破坏了,故第一位填0。

    ③ 第二个连着的四个bit0:同样线确定后三位,由于前面有个+V,故为00-V,这时V已经满足正负交替的,故填个不破坏正负交替的,故是:-B00-V

    ④ .............

    3HDB_{3}码的译码

    只要看到两个传号码极性相同,则译为0000,其他的是几就译为几。

    4.HDB_{3}码特点

    HDB_{3}码V码正负交替,从而保证所有传号码中“+1”的个 与 数与“-1”的个数相同, 使得其功率谱没有直流分量。

    HDB_{3}码具有与AMI码相同的优点, 而且因为其克服了长连0问题,使得接收端定时提取电路在信息序列出现长连0后仍然能够正常工作。

     与AMI码相比, HDB_{3}码的缺点是存在误码增殖。

                                                              AMI码不存在误码增殖

                                                                        HDB_{3}码存在误码增殖

     

    四、双相码与CMI码

    AMI码与HDB_{3}码是:,B是Binary的首字母,T是Ternary(三进制)首字母。

    而双相码和CMI码是:

    1.双相码

    1)编码规则:bit1->1 0,bit0->0 1

    这里可以看出,T_{s} = T_{b}/2

    用由正到负的跳变表示bit1,用由负到正的跳变表示bit0,。

    2)双相码的特点:

    ① 直流分量为0。
    ② 位定时提取方便(在T_{b}/2处存在电平跳变,故含有丰富的位定时信息)。

    3)差分双向码

    由于双相码跳变频繁容易引起译码错误,就有了差分双相码。

    译码规则为:有跳变则表示比特“0”,无跳变则表示比特“1。(stm32中pwm波的方式中就有个这个配置)

    2.CMI码

    bit0->0 1,bit1->交替编为1 1和 0 0。对于CMI码序列,分别用幅度为+A和-A的不归零脉冲表 “1” 码和“0” 码。CMI码的波形:

    可以看出符号周期T_{s} = T_{b}/2。在相同的信息传输速率R_b下,码元传输速率R_B = 1/T_s,故双相码和CMI码的R_B加倍,即功率谱的主瓣带宽加倍。

    结论:双相码和CMI码位定时信号提取方便的优点是以牺牲系统带宽为代价的。
     

    五、块编码
     

    1)nBmB码

          1B2B码在信息传输速率较低的低次群光纤数字通信系统使用较多,但是在速率较高的高次群中就不再使用,原因是其频带利用率太低。所以我们必须寻找频带用率更高的块编码

    nBmB码,顾名思义,就是用n个bit序列当成成一组映射成m为二进制码。显然m>=n,这里为了更好地编码性能,要求m>n。即

    实际应用中,常取m = n + 1。

    2)nBmT码

    用n个二进制bit位当成一组映射成m位3进制码,为提高频带利用率,要满足以下条件:

    六、频带利用率比较

    设信息传输速率为R_b,不管是nBmB码还是nBmT码,每秒可组成\frac{R_b}{n}个组,所以每秒编成的码元数为

    假设成形波形g_T(t)为非归零矩形波形,即并假设信道带宽为功率谱的第一过零点带宽:

    则频带利用率为

    若采用半归零矩形波形,则其P_s(f)为:此时频带利用率为

    从频带利用率的表达式,可以得出:

      不归零码bit/s/Hz 归零码
    AMI码,HDB_3码(1B1T) 1 0.5
    双相码,CMI码(1B2B) 0.5 0.25
    nBmB(n<m) 小于1 小于0.5
    nBmT码(n>m) 大于1 大于0.5

    对于nBmT码,由于有三个电平需要区分,故误码率高。故在获取有效性的同时,往往牺牲了准确性。

     

     

    展开全文
  •  3) 获取统计值的方法用count做前缀。  4) 插入的方法用save(推荐)或insert做前缀。  5) 删除的方法用remove(推荐)或delete做前缀。  6) 修改的方法用update做前缀。  B) 领域模型命名规约  1) ...

    1、抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
    2、中括号是数组类型的一部分,数组定义如下:String[] args;
    3、POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
    4、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
    5、如果使用到了设计模式,建议在类名中体现出具体模式。
    6、接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
    7、对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。
    8、枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。
    9、各层命名规约:
       A) Service/DAO层方法命名规约
         1) 获取单个对象的方法用get做前缀。
         2) 获取多个对象的方法用list做前缀。
         3) 获取统计值的方法用count做前缀。
         4) 插入的方法用save(推荐)或insert做前缀。
         5) 删除的方法用remove(推荐)或delete做前缀。
         6) 修改的方法用update做前缀。
       B) 领域模型命名规约
         1) 数据对象:xxxDO,xxx即为数据表名。
         2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
         3) 展示对象:xxxVO,xxx一般为网页名称。
         4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

    10、long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
    11、常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
         1) 跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。
         2) 应用内共享常量:放置在一方库的modules中的constant目录下。

    12、if/for/while/switch/do等保留字与左右括号之间都必须加空格。
    13、任何运算符左右必须加一个空格。
    14、缩进采用4个空格,禁止使用tab字符。
    15、单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:
         1)第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进,参考示例。
         2) 运算符与下文一起换行。
         3) 方法调用的点符号与下文一起换行。
         4) 在多个参数超长,逗号后进行换行。
         5) 在括号前不要换行,

    16、方法参数在定义和传入时,多个参数逗号后边必须加空格。
         method(“a”, “b”, “c”);
    17、IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用windows格式。
    18、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
    19、所有的覆写方法,必须加@Override注解。
    20、不能使用过时的类或方法。
    21、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。 正例: “test”.equals(object);
    22、所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较
    23、关于基本数据类型与包装数据类型的使用标准如下:
         1) 【强制】所有的POJO类属性必须使用包装数据类型。
         2) 【强制】RPC方法的返回值和参数必须使用包装数据类型。
         3) 【推荐】所有的局部变量使用基本数据类型。

    24、定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。
    25、序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
    26、构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
    27、POJO类必须写toString方法。使用IDE的中工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
    28、使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。
    29、 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
    30、下列情况,声明成final会更有提示性:
         1) 不需要重新赋值的变量,包括类属性、局部变量。
         2) 对象参数前加final,表示不允许修改引用的指向。
         3) 类方法确定不允许被重写。

    31、类成员与方法访问控制从严:
         1) 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
         2) 工具类不允许有public或default构造方法。
         3) 类非static成员变量并且与子类共享,必须是protected。
         4) 类非static成员变量并且仅在本类使用,必须是private。
         5) 类static成员变量如果仅在本类使用,必须是private。
         6) 若是static成员变量,必须考虑是否为final。
         7) 类成员方法只供类内部调用,必须是private。
         8) 类成员方法只对继承类公开,那么限制为protected。

    32、关于hashCode和equals的处理,遵循如下规则:
         1) 只要重写equals,就必须重写hashCode。
         2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
         3) 如果自定义对象做为Map的键,那么必须重写hashCode和equals。
    33、不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

    推荐使用IntelliJ IDEA插件:
    在这里插入图片描述

    展开全文
  • x265常用编码参数

    千次阅读 2018-07-31 15:30:01
    1. -I 0 编码全I帧; 2. --crf 22 设置crf值,crf码控模式; -q 为cqp码控模式; 3.--input-res 540x960 设置分辨率; 4. --input xx.yuv 输入编码yuv; 4.--fps 29 设置帧率; 5.-o xx.265 输出编码码流; ...
  • 在Kaggle上看到了一个专门训练特征编码的竞赛,其中一个Kernel讲了常用的几种特征编码的手段,基于这篇教程做了些扩展学习。 用于数据分析的特征可能有多种形式,需要将其合理转化成模型能够处理的形式,特别是对非...
  • 问卷设计与统计分析——常用的量表 李克特量表是美国社会心理学家李克特(R.A.Likert)提出,是对某事物的态度或看法的陈述组成,回答分为五类:非常同意、同意、不知道、不同意、非常不同意、或者赞成、比较赞成、...
  • 统计常用字的一种方法

    千次阅读 2013-11-03 18:46:01
    统计常用字最难的地方就是数据收集这块,想到后台一直在网上爬东西,觉得可以利用一下,这样最难的问题就解决了。 废话少说,整体流程如下: 1.使用爬虫从网上抓取海量网页数据,采用utf-16格式保存成文件。 2....
  • 大数据统计:最常用的60个Java包

    千次阅读 2018-02-26 06:36:19
    下面是来自programcreek.com统计的最常用的60个Java包。点进去的每一个链接会显示常用的类和代码示例。统计是基于2015-2017年GitHub上的的开源项目。1.java.util 2.java.io 3.android.widget 4.android.view 5.java...
  • 1 常用Lua开发库-JSON库、编码转换、字符串处理文章原地址 http://jinnianshilongnian.iteye.com/blog/2187643 前言 对于开发来说需要有好的生态开发库来辅助我们快速开发,而Lua中也有大多数我们需要的第三方...
  • PyCharm常用配置和常用插件

    千次阅读 多人点赞 2021-01-09 22:51:26
    文章目录常用配置配置Python解释器文件编码文件和代码模板修改主题修改字体快捷键风格显示行数和方法线代码自动提示快捷键鼠标悬停显示文档说明关闭自动更新安装 autopep8 工具启动不打开上一个项目导出导入配置常用...
  • 聊聊字典编码

    千次阅读 2018-12-28 22:56:36
    许多场合,开始时不知道要编码数据的统计特性,也不一定允许你事先知道它们的统计特性。因此,人们提出了许许多多的数据压缩方法,企图用来对这些数据进行压缩编码,在实际编码过程中以尽可能获得最大的压缩比。这些...
  • Pandas统计分析基础: 1.文本文件读取与存储。 2.Excel文件读取与储存。 3.DataFrame常用操作。 4.描述分析DataFrame数据
  • 编码

    千次阅读 2013-09-26 09:58:33
    可 变长编码是一种统计编码技术,也就是通常所说的嫡编码281。它为被编 码的数值分配相应码字,出现频率高的值分配低码字,频率低的则分配长码字. 平均而言,短码字占大多数,因而编码后的码流长度可以比原始数据...
  • 信源编码与信道编码

    万次阅读 多人点赞 2017-03-26 17:02:44
    但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。...
  • 最近做了一个网站统计分析系统,特别在搜索引擎分析那一部分费了不少时间,从已编码的URL中提取搜索关键词再进行解码。主流的搜索引擎中,URL所使用的字符编码都不同,比如,baidu默认是gb2312,google默认是utf-8。...
  • 视频压缩编码和音频压缩编码的基本原理

    万次阅读 多人点赞 2014-06-03 00:01:20
    本文介绍一下视频压缩编码和音频压缩编码的基本原理。其实有关视频和音频编码的原理的资料非常的多,但是自己一直也没有去归纳和总结一下,在这里简单总结一下,以作备忘。
  • 信源编码和信道编码

    千次阅读 2018-12-06 15:14:59
    但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。...
  • 游程编码

    千次阅读 2014-03-04 22:40:47
     游程编码又称“运行长度编码”或“行程长度编码”,是一种统计编码,该编码属于无损压缩编码。对于二值图有效。  RLE行程长度编码概述  目前, 压缩技术已经广泛应用于各种软件、声音、影像格式等领域。总的来说...
  • 图像编码与压缩

    2010-12-16 17:20:00
    当前常用统计编码有:行程编码、哈夫曼编码、和算术编码。 (2)预测编码 根据数据的统计特性得到预测值,然后传输图像像素与其预测值的差值信号,使传输的码率降低,达到压缩的目的。典型的预测编码
  • 哈夫曼编码原理

    千次阅读 2016-06-28 13:51:48
    哈夫曼(Huffman)编码是一种常用的压缩编码方法,是Huffman于1952年为压缩文本文件建立的。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二...
  • CSS字体unicode编码

    千次阅读 2016-09-08 00:42:50
    说明为了避免在CSS中使用 font 或 font-family 设置中文字体时乱码,可以使用 Unicode 编码来表示字体。/* 示例:使用Unicode字体编码...常用中文字体 Unicode 编码 字体名称 英文名称 Unicode 编码 2016-09-08 统计
  • Huffman编码

    千次阅读 2019-08-11 02:00:25
    第一步,统计编码的字符出现的频率,将每个字符构建成的只有一个节点的树,然后组成一个森林,并放入优先级队列中,如图2: 自底向上根据频率构造这棵编码的单词查找树,找到两个频率最小的节点 ! 和节点 C,并...
  • AV1编码技术详解

    千次阅读 2020-12-18 20:18:23
    AV1,目前业界最新的开源视频编码格式,对标专利费昂贵的H.265。它由思科、谷歌、网飞、亚马逊、苹果、Facebook、英特尔、微软、Mozilla等组成的开放媒体联盟(Alliance for Open Media,简称AOMedia)开发。而当前...
  • 语音编码算法

    千次阅读 2015-11-25 14:34:30
    4.语音编码算法原理与应用   4.1 波形编码算法基本原理 语音编码主要有波形编码和参数编码两大类。波形编码就是根据语音信号波形导出相应的数字编码形式。最早的波形编码就是PCM,即ITU-T G.711A和ITU-T G.711...
  • 视频编码中CBR编码和VBR编码的区别

    万次阅读 2012-03-31 11:35:15
    用Premiere Pro 2.0输出DVD时,系统中有个选项,即输出采用CBR编码还是VBR编码,那么,CBR编码和VBR编码的区别是什么呢?两种编码适用于什么情况呢?  VBR就是可变比特率,它与恒定比特率CBR有一些区别,关于CBR...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,713
精华内容 38,685
关键字:

常用的统计编码