二进制数据在基带中传输的时候,通常为了能够加大信息传输的准确度,我们都会进行编码和译码,在这个实验中我们采用(5,2)线性分组码来进行编码和译码。
一个[n,k]线性分组码,是把信息划成k个码元为一段(称为信息组),通过编码器变成长度为n个码元的一组,作为[n,k]线性分组码的一个码字。若每位码元的取值有q种(q为素数幂,q进制),则共有q的k次方个码字。
这个编码过程我们采用生成矩阵来实现:
G=[1,0,1,1,1;
0,1,1,0,1];%生成矩阵
R=mod(m*G,2);
接下来是解码过程:信息论书上讲到,线性分组码的解码过程是通过接收矩阵(k,n)和校验矩阵(n,(n-k))的转置相乘,得到的伴随式S是否为0矩阵来判断是否由差错。这里我们要明白,因为校验矩阵本身就是码字矩阵的对偶空间生成的矩阵,因此如果为正确的码字,两者相乘必定为0矩阵。若是差错,则R=E+C(因为是2进制编码,故为两者码字相加),此时R*H'=E*H'。
即译码过程为:
H=[1,1,1,0,0;
1,0,0,1,0;
1,1,0,0,1];%校验矩阵
S=mod(R*H',2);
①通过接收到的矩阵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的矩阵计算特性,大大简化了运算数。