循环码的编码和译码

7,4)循环码的编码译码编码的实验原理:根据循环码的代数性质建立系统编码的过程 可以把消息矢量用如下多项式表示:m(x) = m xk-i + m xk-2 +... + m x + mk-1 k - 2 1 0要编码成系统循环码形式,把消息比特移入码字寄存器的最右边 k位,而把监督比特加在最左边的n-k个中,则要用xn 一 k乘以m(x)得到x n - kxn-km(x)= mxn-i + mxn-2 + ... + m xn-k+1 + m x»-km(x)= q(X)1 g(x)+ p(x),其中 p(x)可以表示为,则 p(x)+ xn-k m(x)p(x)= p xn-k-1 +... + p x + pn-k-1 1 0= m xn-1 +m xn-2+...+m xn-k+1+m xn-k+ p xn-k-1 +...+ p x+ pk -1 k - 2 1 0 n - k -1 1 0m,…,1另 U(x)= p(x)+ xn-k m(x),贝U U= ( p , p , p,…,p , m0 1 2 n-k -1 0)本实验根据以上原理,用matlab实现书上例6.8系统形式的循环码,生成多项式为 g(x)= 1+ x+ x3(7,4)循环码的编码的程序如下:clear;clc;a=[1 0 1 1];%高次项系数在前的生成多项式Gx=[1 0 1 1];%将数组a的高位依次放在数组Data的低位Data=zeros(1,7);Data(1)=a(4);Data(2)=a(3);Data(3)=a(2);Data(4)=a(1);%Data 除以 Gx 得到余数 Rx[Qx,Rx]=deconv(Data,Gx);b=Rx+Data;%将数组 b 的高位放在后面c=b(1);b(1)=b(7);b(7)=c;c=b(2);b(2)=b(6);b(6)=c;c=b(3);b(3)=b(5);b(5)=c;%将数组 b 校正for i=1:7if rem(abs(b(i)),2)==0b(i)=0;endendfor i=1:7if rem(abs(b(i)),2)==1b(i)=1;endenddisp('输入序列:’);disp(编码输出序列:’);b程序运彳丁结果为:输入序列:a =1100编码输出序列:b =1011100改变输入序列a=[1 0 1 1],运行结果:输入序列:a =1 0 1 1编码输出序列:b =1 0 0 1 0 1 1运行结果的编码如下:序号输入序列输出序列序号输入序列输出序列10000000 000091000110 100020001101 0001101001011 100130010111 0010111010001 101040011010 0011121011100 101150100011 0100131100101 110060101110 0101141101000 110170110100 0110151110010 111080111001 0111161111111 1111译码的实验原理g(x)= 1 + x + x3 ,在(n, k)循环码中,由于g(x)能除尽,因此xn +1可分解成g(x)和其他因式的乘积,记为Xn + 1 = g (X)h(x)即可写成h (x) = Xn即 h (x) = x 4 + x 2 + x +1贝U h *(x) = x 4 + x 3 + x +1 , 其中h*(x)式h(x)的逆多项式。
监督矩阵多项式可表示为x2h*(x) xh*(x)h*(x)相对应的译码和纠错(一位)程序如下:clear;clc;r=[1 0 0 1 1 1 1];h=[1,0,0;1,1,0;1,1,1;0,1,1;1,0,1;0,1,0;0,0,1];b=flipud(h);s=r*b;for i=1:3if rem(abs(s(i)),2)==0s(i)=0;endendfor i=1:3if rem(abs(s(i)),2)==1s(i)=1;endendif s==[0 0 0]e=[0 0 0 0 0 0 0 ] elseif s==[1 0 0]e=[0 0 0 0 0 0 1] elseif s==[1 1 0]e=[0 0 0 0 0 1 0] elseif s==[1 1 1]e=[0 0 0 0 1 0 0] elseif s==[0 1 1]e=[0 0 0 1 0 0 0] elseif s==[1 0 1]e=[0 0 1 0 0 0 0] elseif s==[0 1 0]e=[0 1 0 0 0 0 0] else s==[0 0 1]e=[1 0 0 0 0 0 0] endu=r+e;for i=1:7if rem(abs(u(i)),2)==0u(i)=0;endend for i=1:7if rem(abs(u(i)),2)==1u(i)=1;endendData=zeros(1,4);Data(1)=u(4);Data(2)=u(5);Data(3)=u(6);Data(4)=u(7);if e==[0 0 0 0 0 0 0]disp('第几位错误:’)k=0,elsedisp('第几位错误:’)k=find(e);enddisp('接受码字')rdisp(编码输出序列:’)Data运行程序结果如下: e = 0 0 0 0 1 0 0第几位错误:k = 5接受码r = 1 0 0 1 1 1 1 编码输出序列:4 位)进行编码,4 的倍数的消息矢Data =1 0 1 1 以上编码有个缺点,就是它只能对一个消息矢量 我又在这个基础上编写了一个可以同时对位数是 量进行编码,多位循环码的编码程序如下: clear; clc;a=[1 1 0 0 1 0 1 1];[X,N]=size(a);%将信息码分为 M 帧,1 帧 4 个信息码M=ceil(N/4);d=zeros(1,4);b=zeros(1,7*M);Data=zeros(1,7);for k=1:Mfor j=1:4d(j)=a(j+(k-1)*4);end%生成多项式Gx=[1 0 1 1];Data(1)=d(4);Data(2)=d(3);Data(3)=d(2);Data(4)=d(1);%Data除以Gx得到余数Rx[Qx,Rx]=deconv(Data,Gx); e=Rx+Data;b(7*k-6:7*k)=e(1:7); c=b(1+(k-1)*7); b(1+(k-1)*7)=b(7+(k-1)*7); b(7+(k-1)*7)=c; c=b(2+(k-1)*7);b(2+(k-1)*7)=b(6+(k-1)*7);b(6+(k-1)*7)=c;c=b(3+(k-1)*7); b(3+(k-1)*7)=b(5+(k-1)*7); b(5+(k-1)*7)=c;endfor i=1:M*7if rem(abs(b(i)),2)==0b(i)=0;endend for i=1:M*7if rem(abs(b(i)),2)==1b(i)=1;endenddisp('输入序列:');adisp(编码输出序列:’);b程序运行结果如下:输入序列: a =11001011编码输出序列: b =Columns 1 through 131011100100101Column 141相应的多位译码纠错程序如下: clear;clc;r=[1 0 0 1 1 0 0 1 0 0 1 0 0 1 ];[X,N]=size(r);%将接收到的码分为M帧,1帧7个信息位M=ceil(N/7); h=[1,0,0;1,1,0;1,1,1;0,1,1;1,0,1;0,1,0;0,0,1]; b=flipud(h);d=zeros(1,7);U=zeros(1,4*M);Data=zeros(1,7*M);for i=1:Mfor j=1:7d(j)=r(j+(i-1)*7);ends=d*b;for k=1:3if rem(abs(s(k)),2)==0s(k)=0;endendfor k=1:3endif s==[0 0 0]e=[0 0 0 0 0 0 0 ]elseif s==[1 0 0]e=[0 0 0 0 0 0 1]elseif s==[1 1 0]e=[0 0 0 0 0 1 0] elseif s==[1 1 1]e=[0 0 0 0 1 0 0] elseif s==[0 1 1]e=[0 0 0 1 0 0 0] elseif s==[1 0 1]e=[0 0 1 0 0 0 0] elseif s==[0 1 0]e=[0 1 0 0 0 0 0] else s==[0 0 1]e=[1 0 0 0 0 0 0] endu=d+e;for k=1:7end for k=1:7if rem(abs(u(k)),2)==1 u(k)=1;endendData(1+7*(i-1))=e(1);Data(2+7*(i-1))=e(2);Data(3+7*(i-1))=e(3);Data(4+7*(i-1))=e(4);Data(5+7*(i-1))=e(5);Data(6+7*(i-1))=e(6);Data(7+7*(i-1))=e(7);U(1+(i-1)*4)=u(4);U(2+(i-1)*4)=u(5);U(3+(i-1)*4)=u(6);U(4+(i-1)*4)=u(7);endif Data==zeros(1,7*M);m=0,else[j,m]=find(Data);enddisp('第几位错误:’);mdisp('接收到的码字:’);rdisp(编码输出序列:’);U运行结果如下: e = 0 0 1 0 0 0 0e =0 0 0 0 0 1 0第几位错误: m =3 13接收到的码字: r =Columns 1 through 131001100100100Column 141编码输出序列:U = 1 1 0 0 1 0 1 1 分析:这两组实验基本上完成了循环码的编码和译码,但是该实验的 缺点就是不能同时对7 位信息码进行两位的纠错,即只能完成一位信 息码的纠错。