线性分组码matlab仿真

目录

一、前言

二、matlab代码

三、总结



 

一、前言

理论直接网上找几篇结合看即可。

二、matlab代码

%%

%对于(n,k,d)线性分组码:
%①检测 l 个随机错误,则要求码的最小距离 d ≥ l+1。
%②纠正 t 个随机错误,则要求码的最小距离 d ≥ 2t+1。
%③纠正 t 个同时检测 e 个随机错误(e ≥ t),则要求码的最小距离 d ≥ t+l+1。

                        

clear all;close all;clc;

%2^r必须>=(n+1);
k=2;r=3;n=k+r;

%信息码m,1*k的向量。共2^k种可能。
%注意m是所有可能的信息码的集合,一行代表一种信息码。
m=[
    0 0
    0 1
    1 0
    1 1
   ];

%生成矩阵g:k行k列单位阵i_k 拼上 k行r列的冗余信息p_kr =k*n矩阵
i_k=eye(k);
p_kr=[
        0 1 1 
        1 1 0 
     ];%任意定好
g=[i_k,p_kr];

%校验矩阵h:k行r列的冗余信息转置为r行k列 拼上 r行r列的单位阵 =r*n矩阵
i_r=eye(r);
q_rk=p_kr.';
h=[q_rk,i_r];
h1=gen2par(g);%自带函数

%验证g*ht或h*gt为0
h_t=h.';
g_t=g.';
gh_t=g*h_t;
hg_t=h*g_t;
gh_t_t=gh_t.';
hg_t_t=hg_t.';

%信息码m编码后得到的码字c,即可用码组
c=m*g;
c=rem(c,2);
%自带函数对比
c1=encode(m,n,k,'linear/binary',g);
%打印
for i=1:1:4
    msg=m(i,:);
    c2=encode(msg,n,k,'linear/binary',g);
    disp(['The code of ' num2str(msg) ' is ' num2str(c2)]);
end
%每两个码字相加之后得到的向量其实还是另外一个码字,
%而两个码字相加后新码字中"1”的个数其实就是它们之间的汉明距离,
%所以最小码距dmin就是所有码中1最少的个数。

                        
%伴随式s
s0_val=0:2^r-1;
str0=dec2bin(s0_val);
[x,y]=size(str0);
s0=zeros(x,y);
for i=1:x
    for j=1:y
    s0(i,j)=str2num(str0(i,j));    
    end
end
%错误图样,即陪集首e_vector
e_s=mod(round(s0/h_t),2);
%从e_s里挑陪集首而不是直接用e_s,因为有很多错好几bit的,不是集'首'
%存疑,是否直接按eye然后11,101,1001顺序来就行了而不需要在e_s找这一步?
%或者说,把e_s全部转到集'首'来
e_vector=zeros(2^r,n);
e_vector(1,:)=[0 0 0 0 0];%其实是c1,e1没错
%e_vector(2:n+1,:)=eye(n);
e_vector(2,:)=[1 0 0 0 0];
e_vector(3,:)=[0 1 0 0 0];
e_vector(4,:)=[0 0 1 0 0];
e_vector(5,:)=[0 0 0 1 0];
e_vector(6,:)=[0 0 0 0 1];
e_vector(7,:)=[1 1 0 0 0];
e_vector(8,:)=[1 0 1 0 0];
%伴随式s
s=mod(e_vector*h_t,2);

%不可用码组vector_other
vector_other0=zeros(2^n-2^k,5);
vector_all=[c;vector_other0];
for i=2:8
    %异或 或者 相加再mod2
vector_all(i*4-3,:)=e_vector(i,:); 
vector_all(i*4-2,:)=bitxor(e_vector(i,:),c(2,:));
vector_all(i*4-1,:)=bitxor(e_vector(i,:),c(3,:));
vector_all(i*4-0,:)=bitxor(e_vector(i,:),c(4,:));
end
vector_other(:,:)=vector_all(5:end,:);
%验证每组可用码、禁用码伴随式都相同
s_all=mod(vector_all*h_t,2);

%校验
%无污染校验结果为0
check=rem(c*h_t,2);
%有污染校验结果
e=[
    0 1 0 0 0
    0 0 1 0 0
    0 0 0 1 0
    0 0 0 0 1   
   ];
r=rem(c+e,2);
check_error0=rem(r*h_t,2);
check_error1=rem(e*h_t,2);
%n种1bit错误
e_2=eye(n);
check_error2=rem(e_2*h_t,2);
%所有可能的错误共2^n种,验证纠错能力
e_val=0:2^n-1;
str=dec2bin(e_val);
[x,y]=size(str);
e_3=zeros(x,y);
for i=1:x
    for j=1:y
    e_3(i,j)=str2num(str(i,j));    
    end
end
check_error3=rem(e_3*h_t,2);




%%
%其他博主的代码
clear all;close all;clc;

% 给出生成矩阵G和接收到的码组R
G=[1 0 0 1 0 1;
   0 1 0 1 1 0;
   0 0 1 0 1 1];
I=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1];
C=rem(I*G,2);
% R=input('请输入接收到的码组R:');
R=[1 1 0 1 1 1];
[a,b]=size(R);
% 构造8个错误向量E,生成监督矩阵H
E=[0 0 0 0 0 0;1 0 0 0 0 0;
   0 1 0 0 0 0;0 0 1 0 0 0;
   0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1];
H=gen2par(G);
% 计算伴随式S
S=rem(R*H',2);
% 输出伴随式S
disp('所得伴随式为:S=');
disp(S);
% 根据伴随式S计算每个码字的错误位置
i=1;
for i=1:1:a
    M(i,1)=S(i,1).*4+S(i,2).*2+S(i,3);
end
% 根据错误位置修改码字,纠正错误
for i=1:1:a
    switch(M(i,1))
        case 0
            A(i,:)=R(i,:)+E(1,:);
        case 5
            A(i,:)=R(i,:)+E(2,:);
        case 6
            A(i,:)=R(i,:)+E(3,:);
        case 3
            A(i,:)=R(i,:)+E(4,:);
        case 4
            A(i,:)=R(i,:)+E(5,:);
        case 2
            A(i,:)=R(i,:)+E(6,:);
        case 1
            A(i,:)=R(i,:)+E(7,:);
    end
end
% 根据错误位置提示纠错结果
for i=1:1:a
    switch(M(i,1))
        case 0
            disp('没有出现错误!');
        case 1
            disp('注意:第1位出现一个错误!请纠正!');
        case 2
            disp('注意:第2位出现一个错误!请纠正!');
        case 4
            disp('注意:第3位出现一个错误!请纠正!');
        case 3
            disp('注意:第4位出现一个错误!请纠正!');
        case 6
            disp('注意:第5位出现一个错误!请纠正!');
        case 5
            disp('注意:第6位出现一个错误!请纠正!');
    end
end
% 对纠错后的码字A进行检验
A=rem(A,2);
% 输出检纠错后的码字A
disp('检纠错后的码组A=');
disp(A);
% 对码字进行译码,得到信息序列I
j=1;
while j<=3
    I(:,j)=A(:,j);
    j=j+1;
end
% 输出译出的信息序列I
disp('译出的信息序列I=');
disp(I);


三、总结

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字通信系统是采用数字信号来传递信息的系统,比模拟通信,更能满足通信技术在现代社会越来越高的要求,它的特点是:抗干扰能力强;差错可控;容易和各种数字终端连接,用现代计算技术来对信号进行一些处理,然后加工变换再存储,这样就形成智能网;易于集成化,这样就能实现通信设备的微型化;容易加密,而且机密强度高。 现在的各种公用和专用通信系统都在追求具有更大的通信容量、更远的通信距离以及更高的功率效率,尤其是目前广泛应用的移动通信、卫星通信以及航天器的测量、跟踪与控制等系统中,这方面的需求和要求更加紧迫。由于通信系统的容量与系统所占的频带和可以利用的频段有着直接的关系,而该频段可以被利用的是不可再生的,并且频带的资源还是具有一定的限度的,所以一定要寻找具有更高频谱效率的、高效的数字调制技术,来改善系统的能力。 调制技术最初是从模拟信号的调制与解调技术开始发展的,这是因为当时的通信系统为模拟系统。后来,随着数字通信技术的发展,数字调制技术也得到了迅猛的发展和广泛应用。随着各种各样的通信系统数量的日益增加,为了能更充分地利用有限的频谱资源,大多数通信研究者比较倾向于研究具有更高频谱效率的数字调制技术[2]。显然,调制技术是通信系统中很重要的技术之一,尤其是对数字通信系统来说,数字调制技术更是关系到系统性能的好坏[3]。对于数字调制技术的主要要求是:已调制的信号所占的频带要窄,即已调信号要有更高的频谱效率,而对于已调信号,要方便采用相干或非相干的方法解调,且调制的信号要具有较强的抗噪声和抗干扰的能力,并适宜衰落信道传输。 现在很多新型数字带通调制技术都有运用到相移键控,比如QAM(正交振幅调制),它是为了改善在MPSK体制中,M大时的噪声容限而发展出来的。QAM是一种振幅和相位联合键控[4]。在16QAM信号的产生方法中,就有运用到相移键控,它利用两路独立的4PSK信号叠加,形成16QAM。还有,OFDM(正交频分复用技术),它是一种特殊的多载波传输方案。因为其不同的子载波之间是相互正交的,所以扩频调制以后的频谱是可以相互重叠,这样不仅仅减小了子载波之间的相互干扰,而且还很大程度上提高了频谱效率[5]。像OFDM这么先进的调制技术,在它的每个子载波调制中,也要用到相移键控或者正交幅度调制。而且,在CDMA移动通信中,它的载波调制也是采用4PSK,或者是4PSK的变化形式。所以它们都是基于4PSK,或者说都是基于2PSK,因为它们的调制与解调最终都可以化为不同BPSK调制、解调的组合。由此可见,研究M进制相移键控调制技术在实际中具有很重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值