线性分组码的编码译码 | 您所在的位置:网站首页 › 编码t338165 › 线性分组码的编码译码 |
线性分组码是通信原理中已经学到的一个概念,为了更好的编写代码,我又重新回顾了一次线性分组码的概念,网上的概念大多很乱,下面我进行一个梳理。 以(7,4)汉明码为例: (7,4)汉明码的来历:在信息位后面增加监督码元,可以指示错误码元的位置。(7,4)汉明码信息位为4位,监督位为3位,监督位有2^3=8种组合。如果只错一位,则可用其中一种表示无错,其余7种表示错码可能的7个位置,见下表。 根据以上,对编码解码的重要概念已经有了基本的了解,下面是MATLAB代码及其解析。 clc;clear %编码过程 G=[1 0 1 1 1;0 1 1 0 1]%input('请输入生成矩阵G=') [k,n]=size(G);%生成矩阵的行数是信息位数 列数是编码位数 r=n-k; %判断传送信息的有效性 m=[0 0 0 1 1 0 1 1]%input('请输入需传送的信息m='); l=length(m); if(mod(l,k)) disp('输入的信息有误')%一组信息长度为k 总信息位l 必须为k的整数倍 else num=l/k;%num表示总共传递的信息组数 end %将输入信号的行向量转化为矩阵,矩阵每一行为一组信息 m_col=[]; for i=1:num m_col(i,:)=m(k*(i-1)+1:i*k); end m=m_col; %求监督矩阵H A=mod(m*G,2);%出现2要取余变0 编码矩阵A=m*G Q=G(:,k+1:n);%生成矩阵G=[Ik|Q] H=[Q',eye(r)];%H=[P|Tr]其中P=Q' disp('编码矩阵');A disp('监督矩阵');H %译码过程 B=[1 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 1 0];%input('请输入接收序列B=') %将接收信号的行向量转化为矩阵,矩阵每一行为一组信息 B_col=[]; for i=1:num B_col(i,:)=B(n*(i-1)+1:i*n); end B=B_col; %得出错误图样 S=mod(B*H',2);%S为校正子 E=S*pinv(H');%S=EH' E为错误图样 %以0.5为界,绝对值小于视为未出错 大于视为出错 for i=1:num for j=1:n if(E(i,j)>0.5-eps) E(i,j)=1; else E(i,j)=0; end end end resall=mod(B+E,2);%recall 为纠正后的结果 只有 0 1 错一位是 0变1 1变0 resnew=resall(:,1:2);%renew取前两列为译码的最终结果 disp('校正子');S disp('差错图样');E disp('译码结果');resnew以下是运行结果: |
CopyRight 2018-2019 实验室设备网 版权所有 |