【传统编码技术对比】汉明码,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

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值