157循环码的编译码方法解析Word文件下载.docx
《157循环码的编译码方法解析Word文件下载.docx》由会员分享,可在线阅读,更多相关《157循环码的编译码方法解析Word文件下载.docx(26页珍藏版)》请在冰点文库上搜索。
![157循环码的编译码方法解析Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/a05451c8-a09b-464f-99a5-ae5820109a0c/a05451c8-a09b-464f-99a5-ae5820109a0c1.gif)
附录16
致谢21
前言
随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。
随着经济文化水平的显著提高,人们对生活质量及工作软件的要求也越来越高。
在计算机通信信息码中循环码是线性分组码的一个重要子集,是目前研究得最成熟的一类码。
它有许多特殊的代数性质,它使计算机通信以一种以数据通信形式出现,实现了在计算机与计算机之间或计算机与终端设备之间进行有效的与正确地信息传递,它使得现代通信的可靠性与有效性实现了质的飞跃。
它是现代计算机技术与通信技术飞速发展的产物,在日常生活通信领域、武器控制系统等领域都被广泛应用。
数字信号在传输中往往由于各种原因,使得在传送的数据流中产生误码,从而使接收端产生图象跳跃、不连续、出现马赛克等现象。
所以通过信道编码这一环节,对数码流进行相应的处理,使系统具有一定的纠错能力和抗干扰能力,可极大地避免码流传送中误码的发生。
误码的处理技术有纠错、交织、线性内插等。
提高数据传输效率,降低误码率是信道编码的任务。
信道编码的本质是增加通信的可靠性。
此次课程设计题目是(15,7)循环码的编译码方法,首先学习掌握了线性分组码的编译码原理;
其次在matlab平台下,完成了任意码的编码和译码,并可求出该码的最小码距以及其纠错能力;
一基本原理
1.1循环码的定义
循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。
循环码的编码和解码设备都不太复杂,且检(纠)错能力强。
它不但可以检测随机的错误,还可以检错突发的错误。
(n,k)循环码可以检测长为n-k或更短的任何突发错误,包括首尾相接突发错误。
循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。
符合这个特点的有多种方案,但循环码只能是表中的那种。
循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。
这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。
循环码就是这样一种编码,它可以在卡诺图中依次循环得到。
循环码又称格雷码。
循环码最大的特点就是码字的循环特性,所谓循环特性是指:
循环码中任一许用码组经过循环移位后,所得到的码组仍然是许用码组。
若(
)为一循环码组,则(
)、(
)……还是许用码组。
也就是说,不论是左移还是右移,也不论移多少位,仍然是许用的循环码组。
1.1.1循环码的多项式表示
设码长为n的循环码表示为(
),其中
为二进制数,通常把码组中各码元当做二进制的系数,即把上式中长为n的各个分量看做多项式(1-1)的各项系数。
(1-1)
其中,各码字与码多项式一一对应,这种多项式中,x仅表示码元位置的标记,因此我们并不关心x的取值,这种多项式称为码多项式。
1.1.2(n,k)循环码的生成多项式
(n,k)循环码的生成多项式写为g(x),它是(n,k)循环码码集中唯一的,幂次为n-k的码多项式,则
是一个幂次为n的码多项式。
按模(
)运算,此时:
(1-2)
即
(1-3)
且因
g(x)也是n阶幂,故Q(x)=1。
由于它是循环码,故
)运算后的“余式”也是循环码的一个码字,它必能被g(x)整除,即:
(1-4)
由以上两式可以得到:
(1-5)
和
(1-6)
从上式中可以看出,生成多项式g(x)应该是
的一个因式,即循环码多项式应该是
的一个n-k次因式。
本课程设计要求完成任意(15,7)循环码的编码和译码,其中给出的生成多项式为:
g(x)=x8+x7+x6+x4+1则生成矩阵G为:
(1-7)
对式(1-7)作线性变换,整理成典型形式的系统生成矩阵:
(1-8)
若信息码元与式(1-8)相乘,得到的就是系统循环码。
1.1.3循环码的生成矩阵和一致校验矩阵
对所有的i=0,1,2,……k-1,用生成多项式g(x)除
,有:
(1-9)
式中
是余式,表示为:
(1-10)
因此,
是g(x)的倍式,即
是码多项式,由此得到系统形式的生成矩阵为:
(1-11)
它是一个k
n阶的矩阵。
同样,由G
=0可以得到系统形式的一致校验矩阵为:
(1-12)
由于在本课程设计中,由于生成多项式为:
g(x)=x8+x7+x6+x4+1,校验多项式为h(x)=xn+1/g(x),因此可由长除法求得校验多项式为h(x)=x7+x6+x4+1,所以校验矩阵H为:
(1-13)
对式(1-13)作线性变换,整理成典型形式的系统生成矩阵:
(1-14)
1.2循环码编码原理
有信息码构成信息多项式
,其中最高幂次为k-1;
用
乘以信息多项式m(x),得到的
,最高幂次为n-1,该过程相当于把信息码(
,
,……,
)移位到了码字德前k个信息位,其后是r个全为零的监督位;
用g(x)除
得到余式r(x),其次数必小于g(x)的次数,即小于(n-k),将此r(x)加于信息位后做监督位,即将r(x)于
相加,得到的多项式必为一码多项式。
1.3循环码的纠错原理
纠错码的译码是该编码能否得到实际应用的关键所在。
译码器往往比编码较难实现,对于纠错能力强的纠错码更复杂。
根据不同的纠错或检错目的,循环码译码器可分为用于纠错目的和用于检错目的的循环码译码器。
通常,将接收到的循环码组进行除法运算,如果除尽,则说明正确传输;
如果未除尽,则在寄存器中的内容就是错误图样,根据错误图样可以确定一种逻辑,来确定差错的位置,从而达到纠错的目的。
用于纠错目的的循环码的译码算法比较复杂,感兴趣的话可以参考一些参考书。
而用于检错目的循环码,一般使用ARQ通信方式。
检测过程也是将接受到的码组进行除法运算,如果除尽,则说明传输无误;
如果未除尽,则表明传输出现差错,要求发送端重发。
用于这种目的的循环码经常被成为循环冗余校验码,即CRC校验码。
CRC校验码由于编码电路、检错电路简单且易于实现,因此得到广泛的应用。
在通过MODEM传输文件的协议如ZMODEM、XMODEM协议中均用到了CRC校验技术。
在磁盘、光盘介质存储技术中也使用该方法。
当码字c通过噪声信道传送时,会受到干扰而产生错误。
如果信道产生的错误图样是e,译码器收到的n重接受矢量是y,则表示为:
(1-15)
上式也可以写成多项式形式:
(1-16)
译码器的任务就是从y(x)中得到
,然后求的估值码字
(1-17)
并从中得到信息组
。
循环码译码可按以下三个步骤进行:
(1)有接收到的y(x)计算伴随式s(x);
(2)根据伴随式s(x)找出对应的估值错误图样
;
(3)计算
,得到估计码字
若
则译码正确,否则,若
,则译码错误。
本课程设计中采用(15,7)循环码由生成矩阵可得其最小码距dmin为5;
由最小码距可得其纠检错能力可知其最多可检4位错,可纠2位错。
其伴随式如表1所示:
表1(15,7)循环码错误图样表
错误图样
伴随式
纠错
e=[000000000000000]
S=[00000000]
无错
e=[000000000000001]
S=[10000000]
第一位错
e=[000000000000010]
S=[0,1,0,0,0,0,0,0]
第二位错
e=[000000000000100]
S=[0,0,1,0,0,0,0,0]
第三位错
e=[000000000001000]
S=[0,0,0,1,0,0,0,0]
第四位错
e=[000000000010000]
S=[1,0,0,0,1,0,0,0]
第五位错
e=[000000000100000]
S=[0,1,0,0,0,1,0,0]
第六位错
e=[000000001000000]
S=[1,0,1,0,0,0,1,0]
第七位错
e=[000000010000000]
S=[1,1,0,1,0,0,0,1]
第八位错
e=[000000100000000]
S=[0,1,1,0,1,0,0,0]
第九位错
e=[000001000000000]
S=[0,0,1,1,0,1,0,0]
第十位错
e=[000010000000000]
S=[0,0,0,1,1,0,1,0]
第十一位错
e=[000100000000000]
S=[0,0,0,0,1,1,0,1]
第十二位错
e=[001000000000000]
S=[0,0,0,0,0,1,1,0]
第十三位错
e=[010000000000000]
S=[0,0,0,0,0,0,1,1]
第十四位错
e=[100000000000000]
S=[0,0,0,0,0,0,0,1]
第十五位错
以上指出了系统循环码的译码方法:
将收到的码字R(x)用g(x)去除,如果除尽则无错;
否则有错。
如果有错,可由余式S(x)一一找出对应图样,然后将错误图样E(x)与R(x)模2和,即为所求码字C(x),从而实现纠错目的。
二系统分析
本次课题是(15,7)循环码的编译码方法,包括求出该码的最小码距以及其纠错能力,并分析出该码在高斯信道下的误码性能,则
循环码的编译码过程如下:
编码过程:
第一步:
将信息码字表示为
,其最高次幂为
第二步:
将
与
求模得出相应的余式
第三步:
编码结果为
3.1循环码的编码流程
循环码编码的程序框图如下图2-1所示:
存储c(x)
图2-1编码程序框图
3.2循环码的译码流程
译码过程:
由接收码字
与监督矩阵相乘得出错误图样
判断
是否为零。
若不为零,则出错。
在假定至多只有一位错的情况下,可以有效地译了相应的信息码字;
在出错的情况下,将
与标准监督矩阵对比,得出错误的比特位并进行更正得出前四位为信息码字。
循环码译码的程序框图如图下图2-2所示:
图2-2译码程序框图
否
三系统设计及调试
3.1循环码的编码
任意输入一组7位二进制循环码序列,可对该二进制序列进行编码,其实现结果如下图3-1所示:
图3-1(15,7)循环码的编码程序仿真结果图
由图3-1可得,本程序实现了对任意输入消息进行(15,7)循环码的编码。
如图所示输入码字a=[1110101],编码输出b=[100100011110101]。
3.2(15,7)循环码的译码
对上述图3-1中所输入循环码字a=[1110101]的编码结果b=[100100011110101]进行译码,其结果如下图3-2所示:
图3-2(15,7)循环码的译码程序仿真结果图
由上图3-2可得,用编出的码字译码,没有错误,正确译出原码。
3.3(15,7)循环码的纠检错
将上图3-2中所编出的码字任意改变一位输入译码程序,其纠检错图如下图3-3所示:
图3-3(15,7)循环码纠检错一位码字的仿真图
3.4(15,7)循环码在高斯信道下的误码性能
图3-4信源产生的序列及无噪输出序列
图3-5循环码在高斯信道下的误码率
总结
但由于所学知识有限,在设计过程中困难有很多,其主要表现在不熟练软件编程。
总之,通过此次课程设计,我的收获有以下几点:
首先,我掌握了(15,7)循环码的编译码方法,并学会了如何求出该码的最小码距及纠检错能力,同时通过观察该码通过高斯信道后的仿真结果,可发现循环码纠检错能力强;
其次,通过此次课程设计不仅加深了我对课程理论的了解,并更加熟悉了MATLAB语言,而且它让我了解了学习知识不仅在课本上,可以是网络、图书馆,甚至是老师同学。
参考文献
[1]樊昌信,曹丽娜.通信原理(第六版).北京:
国防工业出版社.2007
[2]徐明远,邵玉斌.MATLAB仿真在通信与电子工程中的应用.西安:
西安电子科技大学学出版社.2005
[3]唐向宏,岳恒立,郑雪峰等.MATLAB及在电子信息类课程中的应用(第二版).北京:
电子工业出版社,2009
[4]沈保锁等.《现代通信原理》.天津科学技术出版社.2000
[5]李乐民等.《数字通信传输系统》.人民邮电出版社.2006
[6]惠高潮,王辉.论文《基于单片机(7,4)循环码编码与译码的研究》.南京
工业大学.2005
附录
源程序代码如下
1.(15,7)循环码的编码
clear;
clc;
a=input('
请输入消息矢量:
'
);
%高次项系数在前的生成多项式
Gx=[100010111];
%将数组a的高位依次放在数组Data的低位
Data=zeros(1,15);
Data
(1)=a(7);
Data
(2)=a(6);
Data(3)=a(5);
Data(4)=a(4);
Data(5)=a(3);
Data(6)=a
(2);
Data(7)=a
(1);
%Data除以Gx得到余数Rx
[Qx,Rx]=deconv(Data,Gx);
b=Rx+Data;
%将数组b的高位放在后面
c=b
(1);
b
(1)=b(15);
b(15)=c;
c=b
(2);
b
(2)=b(14);
b(14)=c;
c=b(3);
b(3)=b(13);
b(13)=c;
c=b(4);
b(4)=b(12);
b(12)=c;
c=b(5);
b(5)=b(11);
b(11)=c;
c=b(6);
b(6)=b(10);
b(10)=c;
c=b(7);
b(7)=b(9);
b(9)=c;
%将数组b校正
fori=1:
15
ifrem(abs(b(i)),2)==0
b(i)=0;
end
end
ifrem(abs(b(i)),2)==1
b(i)=1;
disp('
输入序列:
a
编码输出序列:
b
2.(15,7)循环码的编码
r=[101001001110000];
h=[1,0,0,0,0,0,0,0;
1,1,0,0,0,0,0,0;
0,1,1,0,0,0,0,0;
1,0,1,1,0,0,0,0;
0,1,0,1,1,0,0,0;
0,0,1,0,1,1,0,0;
0,0,0,1,0,1,1,0;
1,0,0,0,1,0,1,1;
0,1,0,0,0,1,0,1;
0,0,1,0,0,0,1,0;
0,0,0,1,0,0,0,1;
0,0,0,0,1,0,0,0;
0,0,0,0,0,1,0,0;
0,0,0,0,0,0,1,0;
0,0,0,0,0,0,0,1];
b=flipud(h);
s=r*b;
8
ifrem(abs(s(i)),2)==0
s(i)=0;
ifrem(abs(s(i)),2)==1
s(i)=1;
ifs==[00000000]
e=[000000000000000];
elseifs==[10000000]
e=[000000000000001];
elseifs==[1,1,0,0,0,0,0,0]
e=[000000000000010];
elseifs==[0,1,1,0,0,0,0,0]
e=[000000000000100];
elseifs==[1,0,1,1,0,0,0,0]
e=[000000000001000];
elseifs==[0,1,0,1,1,0,0,0]
e=[000000000010000];
elseifs==[0,0,1,0,1,1,0,0]
e=[000000000100000];
elseifs==[0,0,0,1,0,1,1,0]
e=[000000001000000];
elseifs==[1,0,0,0,1,0,1,1]
e=[000000010000000];
elseifs==[0,1,0,0,0,1,0,1]
e=[000000100000000];
elseifs==[0,0,1,0,0,0,1,0]
e=[000001000000000];
elseifs==[0,0,0,1,0,0,0,1]
e=[000010000000000];
elseifs==[0,0,0,0,1,0,0,0]
e=[000100000000000];
elseifs==[0,0,0,0,0,1,0,0]
e=[001000000000000];
elseifs==[0,0,0,0,0,0,1,0]
e=[010000000000000];
elses==[0,0,0,0,0,0,0,1]
e=[100000000000000];
u=r+e;
ifrem(abs(u(i)),2)==0
u(i)=0;
ifrem(abs(u(i)),2)==1
u(i)=1;
Data=zeros(1,7);
Data
(1)=u(9);
Data
(2)=u(10);
Data(3)=u(11);
Data(4)=u(12);
Data(5)=u(13);
Data(6)=u(14);
Data(7)=u(15);
ife==[000000000000000]
没有错误:
)
k=0,else
第几位错误:
k=find(e)
;
接收码字'
r
译码输出序列:
Data
3.循环码编码与解码Matlab源程序(实验以(7,4)循环码进行分析)
n=15;
%定义码长
k=7;
%信息位长
msg=randint(k*4,1,2);
%随机提取信号,引起一致地分布的任意整数矩阵
subplot(2,2,1)
stem(msg)
title('
编码器输入信号'
p=cyclpoly(n,k)%循环码生成多项式,n=7,k=4
code=encode(msg,n,k,'
cyclic'
p);
%编码函数,对信号进行差错编码
subplot(2,2,2)
stem(code)
编码器输出信号'
recode=decode(code,n,k,'
p)%对信号进行译码,对接收到的码字进行译码,恢复出原始的信息,译码参数和方式必须和编码时采用的严格相同
subplot(2,2,3)
stem(recode)
译码器输出信号'
t=-1:
0.01:
1;
x=recode;
%将recode赋值给x,并进行长度与fft设定
N=length(x);
fx=fft(x);
df=100/N;
n=0:
N/2;
f=n*df;
subplot(2,2,4);
plot(f,abs(fx(n+1))*2/N);
grid;
频谱图'
2、误码率与信噪比之间的关系程序(以(3,2)循环码进行测试)
Fs=40;
%系统采样频率
Fd=1;
%码速率
N=Fs/Fd;
M=2;
%进制数
forSNRpBit=1:
100;
%信噪比
SNR=SNRpBit/log2(M);
%制造100个信息组,每组k位
msg=randint(100,k,[0,1]);
cycl