传统编码技术对比汉明码,RS,卷积码三种编码技术的对比

Posted fpga&matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传统编码技术对比汉明码,RS,卷积码三种编码技术的对比相关的知识,希望对你有一定的参考价值。

1.软件版本

matlab2013b

2.核心程序

clc;
clear;
close all;
warning off;

%% 参数初始化
sel = 0;

if sel == 1;
   trel   = poly2trellis(7,[171 133]);%多项式
   tblen  = 9;                    %回溯深度
else
   trel   = poly2trellis(3,[6 7]);%多项式
   tblen  = 9;                    %回溯深度
end

Step         = 10;%仿真时间间隔
Simu_Len     = 10000;  %仿真的时间长度
Simu_time    = 1000;
Pf           = 1e-3  :  (10e-3-1e-3)/Step  :  10e-3-(10e-3-1e-3)/Step;         %信道差错概率
Simu_speed   = 3*10^10/Step : 3*10^Step/10 : 3*10^10;
msg          = (double(rand(1,Simu_Len)>0.5))';
 
%% 主体代码
for i = 1:length(Pf)

    Err   = zeros(1,Simu_time);
    
    for j = 1:Simu_time
        i
        j
        %编码
        Msg_Enc = convenc(msg,trel);
 
        
        Msg_Enc2 = Msg_Enc;
        %将数据通过信道
        idx                     = round(length(Msg_Enc)*Pf(i));
        idx2                    = round(length(Msg_Enc)*rand(1,idx));
        idx2(find(idx2 == 0))   = 1;
        
        for ii = 1:length(idx2)
            if Msg_Enc(idx2(ii)) == 1
               Msg_Enc2(idx2(ii)) = 0;
            else
               Msg_Enc2(idx2(ii)) = 1;
            end
        end


        %译码
        Msg_Dec = vitdec(Msg_Enc2,trel,tblen,'cont','hard'); 
        
        %计算误码率 
        [n2,r2] = biterr(Msg_Dec(tblen+1:end),msg(1:end-tblen));
        Err(j)  = n2;
    end
    
    Err2(i) = sum(Err)/(Simu_time*Simu_Len);
    
end

%% 曲线仿真
figure;
plot(Pf,Err2,'b-*');
xlabel('channel error rate');
ylabel('BER');

%% 3D图
figure;
[X,Y]  = meshgrid(Simu_speed,Pf); 
Error  = [Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' ];
mesh(X,Y,Error);
xlabel('信道差错概率');
ylabel('仿真速度');
zlabel('误码率');

if sel == 1;
   save JJ7.mat   X Y Error Pf Err2 
else
   save JJ5_4.mat X Y Error Pf Err2 
end
clc;
clear;
close all;
warning off;

%% 参数初始化
sel = 0;

if sel == 1;
   k         = 5;        %15
   n         = 7;        %31
else
   k         = 15;       %15
   n         = 31;       %31
end

Step         = 10;%仿真时间间隔
Simu_Len     = 1000*k;  %仿真的时间长度
Simu_time    = 500;
Pf           = 1e-3  :  (10e-3-1e-3)/Step  :  10e-3-(10e-3-1e-3)/Step;         %信道差错概率
Simu_speed   = 3*10^10/Step : 3*10^Step/10 : 3*10^10;
msg          = (double(rand(1,Simu_Len)>0.5))';
Rs_Encoder   = fec.rsenc(n,k);
Rs_Decoder   = fec.rsdec(Rs_Encoder);

%% 主体代码
for i = 1:length(Pf)

    Err   = zeros(1,Simu_time);
    
    for j = 1:Simu_time
        i
        j
        %编码
        Msg_Enc  = encode(Rs_Encoder,msg);

        Msg_Enc2 = Msg_Enc;
        %将数据通过信道
        idx                     = round(length(Msg_Enc)*Pf(i));
        idx2                    = round(length(Msg_Enc)*rand(1,idx));
        idx2(find(idx2 == 0))   = 1;
        Msg_Enc2(idx2)          = floor(rand(1,1)*Msg_Enc(idx2));%设置出错值

        
        %译码
        [Msg_Dec,cnumerr,ccode] = decode(Rs_Decoder,Msg_Enc2);
        
        %计算误码率
        Err(j)                  = biterr(Msg_Dec,msg);   
    end
    
    Err2(i) = sum(Err)/(Simu_time*Simu_Len);
    
end

%% 曲线仿真
figure;
plot(Pf,Err2,'b-*');
xlabel('channel error rate');
ylabel('BER');

%% 3D图
figure;
[X,Y]  = meshgrid(Simu_speed,Pf); 
Error  = [Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' ];
mesh(X,Y,Error);
xlabel('信道差错概率');
ylabel('仿真速度');
zlabel('误码率');


if sel == 1;
   save RS5_7.mat   X Y Error Pf Err2 
else
   save RS15_31.mat X Y Error Pf Err2 
end





clc;
clear;
close all;
warning off;

%% 参数初始化
sel = 0;

if sel == 1;
   k         = 4;        %15
   n         = 7;        %31
else
   k         = 11;        %15
   n         = 15;       %31
end

Step         = 10;%仿真时间间隔
Simu_Len     = 100*k;  %仿真的时间长度
Simu_time    = 500;
Pf           = 1e-3  :  (10e-3-1e-3)/Step  :  10e-3-(10e-3-1e-3)/Step;         %信道差错概率
Simu_speed   = 3*10^10/Step : 3*10^Step/10 : 3*10^10;
% msg          = (double(rand(1,Simu_Len)>0.5))';
msg          = randint(Simu_Len,1,[0,2^k-1]);
%% 主体代码
for i = 1:length(Pf)

    Err   = zeros(1,Simu_time);
    
    for j = 1:Simu_time
        i
        j
        %编码
        Msg_Enc  = encode(msg,n,k,'hamming/decimal');

        Msg_Enc2 = Msg_Enc;
        %将数据通过信道
        idx                     = round(length(Msg_Enc)*Pf(i));
        idx2                    = round(length(Msg_Enc)*rand(1,idx));
        idx2(find(idx2 == 0))   = 1;
        Msg_Enc2(idx2)          = floor(rand(1,1)*Msg_Enc(idx2));%设置出错值

        
        %译码
        Msg_Dec = decode(Msg_Enc2,n,k,'hamming/decimal');
        %计算误码率
        Err(j)                  = biterr(Msg_Dec,msg);   
    end
    
    Err2(i) = sum(Err)/(Simu_time*Simu_Len);
    
end

%% 曲线仿真
figure;
plot(Pf,Err2,'b-*');
xlabel('channel error rate');
ylabel('BER');

%% 3D图
figure;
[X,Y]  = meshgrid(Simu_speed,Pf); 
Error  = [Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' Err2' ];
mesh(X,Y,Error);
xlabel('信道差错概率');
ylabel('仿真速度');
zlabel('误码率');


if sel == 1;
   save hmm5_7.mat   X Y Error Pf Err2 
else
   save hmm15_31.mat X Y Error Pf Err2 
end





3.仿真分析

汉明编码:

仿真结果如下所示:

汉明编码的误码率和信道误码率呈线性变化,上图中蓝色部分是由于仿真点数少,所以其误码率略有抖动,当仿真点数时间长的时候,其仿真波形可线性变化。

RS编码:

仿真结果如下所示:

由于RS编码的特点就是针对突发错误,所以在RS编码的时候,对于性能较好的RS3115编码效果较好,其误码率曲线的值为0,而RS75,其纠错能力较差,所以上面的仿真结果中红色部分仿真结果为零。

卷积编码:

仿真结果如下所示:

由于卷积编码的性能并不是针对突发中断,所以卷积编码在效果较好的情况下,仍然存在一定的误码率。

5.参考文献

[1]陈卉卉. 卫星光通信信道编码技术研究[D]. 哈尔滨工业大学, 2009.A14-09

以上是关于传统编码技术对比汉明码,RS,卷积码三种编码技术的对比的主要内容,如果未能解决你的问题,请参考以下文章

m基于信道差错概率模型仿真对比RS,汉明码以及卷积编译码性能,仿真输出信道差错概率与误码率和仿真速度三维关系图

AR专用汉明码

汉明码(Hamming)编码与纠错原理

汉明校验码

汉明码(海明码)计算方法

V3学院带你学习-缩短汉明码Hamming(12,8)的FPGA实现