matlab二进制数字基带传输系统仿真实践——信息论篇——线性分组码的编码和译码

二进制数据在基带中传输的时候,通常为了能够加大信息传输的准确度,我们都会进行编码和译码,在这个实验中我们采用(5,2)线性分组码来进行编码和译码。

一个[n,k]线性分组码,是把信息划成k个码元为一段(称为信息组),通过编码器变成长度为n个码元的一组,作为[n,k]线性分组码的一个码字。若每位码元的取值有q种(q为素数幂,q进制),则共有q的k次方个码字

这个编码过程我们采用生成矩阵来实现:

1.首先确定生成矩阵

G=[1,0,1,1,1;

   0,1,1,0,1];%生成矩阵

2.由C=m*G获得(n列)码字矩阵

R=mod(m*G2;

 

          接下来是解码过程:信息论书上讲到,线性分组码的解码过程是通过接收矩阵(k,n)和校验矩阵(n,(n-k))的转置相乘,得到的伴随式S是否为0矩阵来判断是否由差错。这里我们要明白,因为校验矩阵本身就是码字矩阵的对偶空间生成的矩阵,因此如果为正确的码字,两者相乘必定为0矩阵。若是差错,则R=E+C(因为是2进制编码,故为两者码字相加),此时R*H'=E*H'。

即译码过程为:

  1.首先通过生成矩阵确定校验矩阵

H=[1,1,1,0,0;

   1,0,0,1,0;

   1,1,0,0,1];%校验矩阵

  2.由S=R*H'是否为0矩阵来判断是否存在差错

S=mod(R*H',2);

3.第三步即是通过已经发生的差错来纠正码字,这里有两种思路:

①通过接收到的矩阵R映射到标准译码阵列表,即书上对应的阵列表(这个部分推荐进行计算,便于进一步了解纠正错误码字的原理),第一行即为正确码字。

②通过S来确定差错图样,即若S=[001],则E=[00001],由C=E+R可以唯一确定原来的码字,进行纠错。

本实验中我们采用第②种,具体实现为:

S=4.*S(:,1)+2.*S(:,2)+S(:,3);  (1)

row=find(S~=0);

[a,b]=size(row);

for i=1:a

    switch(S(row(i)))

        case{1}

            R(row(i),:)=mod(R(row(i),:)+[0,0,0,0,1],2);

        case{2}

            R(row(i),:)=mod(R(row(i),:)+[0,0,0,1,0],2);

        case{3}

            R(row(i),:)=mod(R(row(i),:)+[0,0,0,1,1],2);

        case{4}

            R(row(i),:)=mod(R(row(i),:)+[0,0,1,0,0],2);

        case{5}

            R(row(i),:)=mod(R(row(i),:)+[0,1,0,0,0],2);

        case{6}

            R(row(i),:)=mod(R(row(i),:)+[0,0,1,1,0],2);

        case{7}

            R(row(i),:)=mod(R(row(i),:)+[1,0,0,0,0],2);

    end

end

C=R;

这里我们在式(1)中采用了将二进制码字转化为10进制的方式,通过这样,能够使用find函数唯一确定S矩阵是否出现了差错以及出现差错的位置,而不用for循环一步一步地去对比矩阵,利用了matlab的矩阵计算特性,大大简化了运算数。

你可能感兴趣的:(matlab二进制数字基带传输系统仿真实践——信息论篇——线性分组码的编码和译码)