线性分组码的编码译码

线性分组码是通信原理中已经学到的一个概念,为了更好的编写代码,我又重新回顾了一次线性分组码的概念,网上的概念大多很乱,下面我进行一个梳理。
以(7,4)汉明码为例:
(7,4)汉明码的来历:在信息位后面增加监督码元,可以指示错误码元的位置。(7,4)汉明码信息位为4位,监督位为3位,监督位有2^3=8种组合。如果只错一位,则可用其中一种表示无错,其余7种表示错码可能的7个位置,见下表。线性分组码的编码译码_第1张图片
根据码元错误与校正子的关系可以列出监督方程,例如S1与a6 a5 a3 a2有关。线性分组码的编码译码_第2张图片
将监督方程变形,将校正位左移,可以得出生成矩阵。
线性分组码的编码译码_第3张图片
线性分组码的编码译码_第4张图片
错误图样是接收端为了指示错码的位置,它可与校正子对应S=EH^T。发送码为A,接收码为B,错误图样E=B-A。

根据以上,对编码解码的重要概念已经有了基本的了解,下面是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 错一位是 01 10 
resnew=resall(:,1:2);%renew取前两列为译码的最终结果
disp('校正子');S
disp('差错图样');E
disp('译码结果');resnew

以下是运行结果:
线性分组码的编码译码_第5张图片
线性分组码的编码译码_第6张图片
通过结果可以看出监督矩阵,生成矩阵,校正子,错误图样的特点和它们之间的关系;可以检验译码的正确性;可以通过控制错码位数来观察线性分组码编码译码的性能,当发生一位错码时,可以通过错误图样进行纠正。

你可能感兴趣的:(矩阵,线性代数,算法)