计算机通信课设(15,7)循环码的编码与译码
- 格式:doc
- 大小:461.50 KB
- 文档页数:29
信息编码技术实验艮告三题目:循环码的编码和译码院系:计算机科学与工程学院班级:姓名:学号:【实验目的】1. 通过实验了解循环码的工作原理。
2. 了解生成多项式g(x)与编码、译码的关系。
3. 了解码距d 与纠、检错能力之间的关系。
【实验条件】仪器设备:PC 机,应用软件:Matlab 。
【实验内容]1、编程实现(7,4)系统循环码的编、译码。
已知(7, 4)循环码的生成多项式和校验多项式分别为:£(/)=疋+兀+ 1, h(x) = x 4+x 2+x + U 其生成矩阵和校验矩阵分别为:2、计算出所有的码字集合,可纠错误图样E (X 〉表和对应的错误伴随式表。
【程序代码】% (7,4)系统循环码编码.译码 clc;clear all;close all;n=7;k=4;r=n-k;mx=input ('请输入信息码字:m=\n' ) ; %输入信息码字 gx=[l Oil];x_nk=[l, zeros (1, r)];messg=conv(x.nk> mx); [qx, rxO] =deconv(messg, gx); %模 gx> qx 为所得除式,rxO 为余式 rx=mod (rxO, 2); %将余式rxO 转换为二进制cx=me ssg+rx;%编码码字多项式 c=cx瀚出编码码字 %=====绘图======== fs=1000;ts=l/fs;%fs 为一个单位内的样点 for i=l :n%以方波形式输出编码码字,一个单位内一个码字for j=l :fscx.wave ((i-1) *fs+j) =c (i);end endt=O :ts :n-ts;1 0 1 1000 0 10 1 1 00 G= 00101 1 0000 10 11 1110100 H = 0 1110 10 0011001%循环码生成多项式 %x* (n-k)> %x*(n-k)*mxplot (t, cx_wave); %以方波形式输出编码码字xlabel ('时间');ylabel C 幅度');title C (7,4)循环码编码输出波形');axis([0 7 0 1. 2]);%==^ 码===============S=zeros (1, r); 颂始化校验子gx=[l Oil]; %循环码生成多项式Rx=input (*请输入接收码字:R=\n ) ;%接收码字多项式% Rx=[l 0 1 0 1 1 1];R=Rx;繊收码字[nx, SxO]=deconv(Rx, gx); %接收码字多项式除以gx, SxO为余式(十进制) Sx=mod(SxO, 2); %将SxO转换为G (2)域下多项式S=Sx(5:7); %SxO最后3位为检验子if S=[0 0 0] 燈验子二0disp('There is no wrong!'); % 显示接收码字无错E=[0 0 0 0 0 0 0]; %査表得出错误图样为0C=R; %译码输出为接收码字elseif S=[0 0 1] %接收码字第一位r0错dispC1 r0 is wrong!'); % 显示rO 错E=[0 0 0 0 0 0 1]; %査表得出错误图样C=xor (R, E); %译码输出C=R+Eelseif S=[0 1 0] %rl 错disp('rl is wrong!');E=[0 0 0 0 0 1 0];C=xor (R, E);elseif S=[l 0 0] 紐2 错disp('ir2 is wrong!');E=[0 0 0 0 1 0 0];C=xor(R, E);elseif S=[0 1 1] %r3 错dispC1 r3 is wrong!');E=[0 0 0 1 0 0 0];C=xor (R, E);elseif S=[l 1 0] %r4 错disp('r4 is wrong!');E=[0 0 1 0 0 0 0];C=xor (R, E);elseif S=[l 1 1] %r5 错dispC r5 is wrong!');E=[0 1 0 0 0 0 0];C=xor (R, E);elseif S=[l 0 1] %r6 错dispC* r6 is wrong!1);E=[l 0 0 0 0 0 0]; C=xor (R, E);endC %输出译码码字【实验结果】请输入信息码字:[10 110 10]10 110 1 0 1 1请输入接收码字:R 二 [10 11010 110] There is no wrong!C =10 11 0 1 0 1 1 0【实验心得】通过本次实验,我加深了对循环码的1:作原理的理解,也了解了生成多项式 g(x)与编码、译码的关系和码距d 与纠、检错的关系,在动手实验过程中,对知 识点的印象更加清晰,让我的理解更加深刻了。
(7,4)循环码的编码和译码(7,4)循环码的编码译码编码的实验原理: 根据循环码的代数性质建立系统编码的过程,可以把消息矢量用如下多项式表示:要编码成系统循环码形式,把消息比特移入码字寄存器的最右边k 位,而把监督比特加在最左边的n-k 个中,则要用kn x-乘以m(x)得到k n x - m(x)= kn x - m(x)= q(x) g(x)+ p(x),其中p(x)可以表示为p(x)= ,则p(x)+ kn x - m(x)= + 另U(x)= p(x)+ kn x- m(x),则U=(0p ,1p ,2p ,···,1--k n p ,0m ,1m ,···,1-k m )。
本实验根据以上原理,用matlab 实现书上例6.8系统形式的循环码,生成多项式为g(x)= (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 得到余数Rx12211...)(m x m x m x m x m k k k k ++++=----kn k n n k n k x m x m x m x m -+-----++++0112211 (011)1...p x p xp k n k n +++----0111...p x p x p k n k n +++----k n k n n k n k x m x m x m x m -+-----++++0112211 (3)1xx ++[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('输入序列:');adisp('编码输出序列:'); b程序运行结果为:输入序列:a = 1 1 0 0编码输出序列:b =1 0 1 1 1 0 0改变输入序列a=[1 0 1 1],运行结果:输入序列:a = 1 0 1 1 编码输出序列:b = 1 0 0 1 0 1 1 运行结果的编码如下:译码的实验原理 g(x)= ,在(n ,k )循环码中,由于g(x)能除尽,因此1+nx 可分解成g(x)和其他因式的乘积,记为)()(1x h x g x n=+31x x ++即可写成)(1)(x g x x h n +=即h (x) =则 )(*x h = ,其中)(*x h 式h(x)的逆多项式。
******************实践教学******************兰州理工大学计算机与通信学院2013年秋季学期《计算机通信》课程设计题目:(15,7)循环码的编译码方法专业班级:通信工程(1)班姓名:学号:指导教师:成绩:摘要本课程设计主要是通过分析查阅(n,k)循环码的编码方法,在MATLAB环境下设计了对(15,7)循环码编译码方法的仿真,首先设计了对任意(15,7)循环码的编译码,然后使一个经过(15,7)循环码编码的信号序列通过高斯信道,再对译码后的序列进行误码分析,加深对循环码的了解。
关键词:(15,7)循环码;高斯噪声;matlab目录前言 (1)一、循环码编码 (2)1.1信道编码理论 (2)1.1.1信道编码的目的 (2)1.1.2信道编码的实质 (2)1.1.3 信道编码公式 (2)1.1.4线性分组码的编译码原理 (3)1.2 循环码介绍 (4)1.2.1 循环码定义 (4)1.2.2 循环码的特点 (4)1.2.3 (n.k)循环码的码多项式表示 (5)1.2.4 (n,k)循环码的生成多项式与生成矩阵 (5)1.2.5 (n,k)循环码的校验多项式与一致校验矩阵 (7)1.3 循环码编码原理 (9)1.4 循环码的最小码距 (9)1.5 循环码的纠检错能力 (10)1.6 循环码的纠错译码原理 (11)二、(15,7)循环码程序设计 (13)2.1(15,7)循环码仿真模块 (13)2.2(15,7)循环码译码仿真模块 (14)2.3(15,7)循环码在高斯信道下的误码性能仿真模块 (14)三、设计与仿真 (15)3.1仿真设备 (15)3.2 (15,7)循环码的编码 (15)3.3 (15,7)循环码的译码 (15)3.4 (15,7)循环码在高斯信道下的误码性能 (17)总结 (18)参考文献 (19)附录 (20)致谢 (26)前言随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。
通信原理课程设计循环码循环码是一种在通信原理中广泛应用的编码技术,用于在数字通信中实现错误检测和纠正。
循环码通过在发送数据中添加冗余位来检测和纠正传输中的错误。
在本文中,我将详细介绍通信原理课程设计中循环码的标准格式以及相关内容。
一、引言循环码是一种线性块码,它通过在数据中添加冗余位来实现错误检测和纠正。
循环码的特点是具有循环性质,即码字中的位可以通过移位运算循环生成。
循环码的设计和分析是通信原理课程中的重要内容之一。
二、循环码的定义循环码可以用生成多项式来定义。
生成多项式是一个二进制多项式,它确定了循环码的结构和性能。
循环码的生成多项式可以用多项式系数表示,例如G(x) = g0 + g1x + g2x^2 + ... + gkx^k。
三、循环码的编码过程循环码的编码过程可以分为以下几个步骤:1. 将待发送的数据按照信息位和冗余位的顺序排列。
2. 使用生成多项式进行除法运算,得到校验位。
3. 将校验位添加到数据中,形成循环码。
四、循环码的解码过程循环码的解码过程可以分为以下几个步骤:1. 接收到循环码后,使用接收到的码字和生成多项式进行除法运算。
2. 如果除法运算的余数为0,则认为接收到的码字没有错误。
3. 如果除法运算的余数不为0,则认为接收到的码字存在错误,并进行纠正。
五、循环码的性能分析循环码的性能可以通过误码率和纠错能力来评估。
误码率是指接收到的码字中错误位的比例,纠错能力是指循环码能够纠正的最大错误位数。
六、循环码的应用循环码在通信原理中有广泛的应用。
它可以用于数据传输中的错误检测和纠正,提高通信系统的可靠性和稳定性。
循环码也可以用于存储介质中的数据纠错,例如光盘和硬盘等。
七、循环码的改进为了提高循环码的性能,可以采用一些改进技术。
例如,可以使用更复杂的生成多项式来增加纠错能力;可以采用交织技术来减小错误传播的影响;可以使用迭代译码算法来提高解码的准确性。
八、总结循环码是通信原理中重要的编码技术,用于实现错误检测和纠正。
循环码的编译码方法..***************** 实践教学****************** 兰州理工大学计算机与通信学院2013年秋季学期《计算机通信》课程设计题目:(15,7)循环码的编译码方法专业班级:通信工程一班姓名:学号:指导教师:成绩:摘要本次课程设计研究的是循环码的编译码方法,在设计过程中,首先要介绍了线性分组码的编码和译码原理,并介绍了循环码的定义及其相关内容;其次给定的生成多项式g?x?求解出了生成矩阵和监督矩阵,并且利用MATLAB编写循环码的编码器和译码器代,实现编码及译码功能;求出该码的最小码距,并分析讨论该码的纠错能力以及在高斯信道下的误码性能。
关键词: 循环码;编码;译码;MATLAB 目录一前言............................................................... ..................................................................... .................................. 1 二循环码编译码的基本原理............................................................... ...................................................................2 循环码的简介............................................................... ..................................................................... ......... 2 循环码的定义............................................................... ....................................................................2 线性分组码与循环码的区别............................................................... ............................................3 循环码的最小码距............................................................... ............................................................ 3 循环码的检纠错能力...............................................................环码编译码原理及过程............................................................... (4)循环码的编译码原理............................................................... ........................................................ 4 循环码编译码的............................................................... (5)三系统分析............................................................... ..................................................................... .......................... 7 循环码编译码方法的实现框图............................................................... ................................................. 7 循环码编译码实现过程............................................................... . (8)四系统设计....................................................................................... 10 生成矩阵和监督矩阵............................................................... . (10)循环码的编码............................................................... ..................................................................... ....... 10 循环码的的译码............................................................... ..................................................................... ... 11 循环码在高斯信道下的误码性能............................................................... ............................................ 13 总结............................................................... ..................................................................... .. (14)线性分组码与循环码的区别线性分组码是同时具有分组特性和线性特性的纠错码。
循环码是线性分组码中一个重要的子类,具有检错纠错能力强,实现方便等特点.它具有严密的代数学理论,封闭性与循环性.(n,k)循环码表示信息位为k位,监督位为(n-k)位.本次设计实验首先分析了(7,4)循环码的编码与译码原理,然后,用C语言实现其编码与译码功能。
通过C语言平台运行所编写的程序,观察了在输入信息码情况下输出对应的编码结果以及相反的译码功能。
通过多组的对比验证了该(7,4)循环码的编译码程序的正确性。
最后,在程序运行的过程中进一步分析循环码的编译码原理,并通过比较仿真模型与理论计算的性能,证明了仿真模型的可行性。
关键词:循环码,编码与译码,C程序。
现代通信的发展趋势为数字化,随着现代通信技术的不断开发,差错控制技术已日趋成熟,在各个领域都得到了广泛的应用和认同。
本文就(7,4)循环码的编码与译码原理进行C语言的编程及运行仿真。
现代社会发展要求通信系统功能越来越强,可靠性越来越高,构成也越来越复杂;这就要借助于功能强大的计算机辅助分析设计技术和工具才能实现。
现代计算机科学技术快速发展,已经研发出了新一代的可视化的仿真软件。
这些功能强大的仿真软件,使得通信系统仿真的设计和分析过程变得相对直观和便捷,由此也使得通信系统仿真技术得到了更快的发展。
本文使用的是功能强大的C语言软件。
C语言是一种使用简便的、特别适用于科学研究和工程计算的高级语言,与其他计算机语言相比,它的特点是简洁和智能化,具有极高的编程和调试效率.通过使用C工具箱函数对数字调制进行仿真,更能直观彻底的掌握循环码的编码与译码原理。
有助于我们的学习和研究,加深对知识的理解和运用. C的便利性还体现在它的仿真结果还可以存放到的工作空间里做事后处理。
方便我们修改参数对不同情况下的输出结果进行对比。
目录第1章概述 (1)第2章计算机通信与纠错码 (2)2。
1 计算机通信技术 (2)2.1.1 通信的概念 (2)2。
1。
2 通信的发展史简介 (2)2。
汕头大学工学院三级项目报告课程名称:信息论与编码课程题目:循环码的编码和译码程序设计指导教师:唐雅娟系别:电子工程系专业:电子信息工程学生姓名:曾煌冠学号: 09141014完成时间: 2012 年 5月4日至 5月14日成绩:评阅人:唐雅娟循环码的编码和译码程序设计一. 循环码编码和译码原理简介: 1. RS 循环码编码原理与特点:首先令22112211()...t t n t t n m x c x c x c x ----=+++和210121()...t t r x c c x c x --=+++分别表示信息多项式与校验多项式,则一个RS 码的多项式表达式为:()()()c x m x r x =+如果()c x 为一个码字,则它必须为生成多项式()g x 的位数,即:()()()c x q x g x =编码的过程就是从()m x 和()g x 中寻找()p x ,它可通过除法算法来完成。
即用()m x 除以()g x 得到:()()()()m x q x g x p x =+(1式)同时令()r x =-()p x ,则有()()()()()q x g x m x r x C x =+=。
2. RS 循环码译码原理与特点:(1) 能纠正t 个符号差错的(n ,k )RS 码,数据段中包含k 个信息符号和2t个校验符号。
设存贮器系统数据输出的多项式(妈接收字多项式)可以表达为11()n n i n i i R x r x ---==∑,差错图样多项式为11()n n i n i i E x e x ---==∑,纠错后的码多项式为11()n n i n i i C x c x ---==∑,伴随式多项式为()S x ,差错定位多项式为()x σ。
3.RS循环码的基本步骤及实现循环码的程序流程图:Array4.主要源程序:/*输入的信息元:m(x)*/void information_element(unsigned char mx[K]) {unsigned char tem;srand((unsigned)time(0));for (unsigned int i=0;i<K;i++) {tem = rand()%6+1;if (tem == 1) mx[i] = 'a';else mx[i] = tem + 48;}}/*确定被除数:x^(n-k)m(x)*/void count_dividend(unsigned char dividend[],unsigned char mx[]) { for (int i=0;i<N;i++) {if (i>=K) { dividend[i] = '0';continue; }dividend[i] = mx[i];}}/*gx各项乘以被除数的第一项系数;注意:符号'0'的ASCII码为48*/ void for_mod2(unsigned char tem[],unsigned char c){ unsigned int i;switch (c){ case '1':for (i=0;i<5;i++) tem[i] = gx[i];break;case 'a':for(i=0;i<5;i++){if (gx[i] == '1') tem[i] = 'a';else if (gx[i] == 'a') tem[i] = '2';else tem[i] = gx[i] + 1;}break;default:for(i=0;i<5;i++){ if (gx[i] == '1') tem[i] = c;else if (gx[i] == 'a') tem[i] = (int)c + 1;else tem[i] = (int)gx[i] + (int)c - 48;}break;}/*应用课本第153页的表6-7的关系式转换*/for (i=0;i<5;i++){ if (tem[i] == '8') tem[i] = 'a';if (tem[i]>'8'&& tem[i]!='a') tem[i] -= 7;if (tem[i]=='7') tem[i] = '1';}}/*与GF(2^3)扩域(课本153页)匹配*/unsigned char math(unsigned char ctem[]){unsigned char c = '0';//当两系数相同时(即a^i+a^i=0)为0if (ctem[0]=='0'&&ctem[1]=='0'&&ctem[2]=='1') c = '1';if (ctem[0]=='0'&&ctem[1]=='1'&&ctem[2]=='0') c = 'a';if (ctem[0]=='1'&&ctem[1]=='0'&&ctem[2]=='0') c = '2';if (ctem[0]=='0'&&ctem[1]=='1'&&ctem[2]=='1') c = '3';if (ctem[0]=='1'&&ctem[1]=='1'&&ctem[2]=='0') c = '4';if (ctem[0]=='1'&&ctem[1]=='1'&&ctem[2]=='1') c = '5';if (ctem[0]=='1'&&ctem[1]=='0'&&ctem[2]=='1') c = '6';return c;}/*mod2加*/void mod2(unsigned char dividend[],unsigned char tem[],unsigned char remainder[]){ unsigned int k;for (unsigned int j=1;j<5;j++){ unsigned char tem1[3]; unsigned char tem2[3];/*被除数对应到GF(2^3)扩域,增加三位都是'0'的情况*/switch (dividend[j]){case '1':for (k=0;k<3;k++) tem1[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++) tem1[k] = GF[1][k];break;case '0':for (k=0;k<3;k++) tem1[k] = '0';break;default:unsigned int n = dividend[j] - 48;for (k=0;k<3;k++) tem1[k] = GF[n][k];}/*gx各项乘以被除数的第一项系数后对应到GF(2^3)扩域,增加三位都是'0'的情况*/switch (tem[j]){case '1':for (k=0;k<3;k++) tem2[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++) tem2[k] = GF[1][k];break;case '0':for (k=0;k<3;k++) tem1[k] = '0';break;default:unsigned int m = tem[j] - 48;for (k=0;k<3;k++) tem2[k] = GF[m][k];}/*异或运算*/unsigned char ctem[3];for (k=0;k<K;k++){ if (tem1[k] == tem2[k]) ctem[k] = '0';else ctem[k] = '1';}remainder[j-1] = math(ctem);/*匹配*/}}/*多项式相除*/void polynomial_division(unsigned char dividend[],unsigned char remainder[],int flag){unsigned char tem[5];unsigned int i,n=5;for (i=0;i<flag;i++){for_mod2(tem,dividend[0]);mod2(dividend,tem,remainder);/*准备下次除法的被除数,如果被除数的第一项为0则被除数数组左移一位,第一,二项都为0则停止*/for (unsigned int j=0;j<R;j++)dividend[j] = remainder[j];dividend[4] = dividend[n++];if (dividend[0] == '0'){if (dividend[1] == '0')break;for (unsigned int k=0;k<K;k++)dividend[k] = dividend[k+1];i ++;n ++;dividend[3] = '0'; }}}/*求余式*/void count_remainder(unsigned char remainder[R]){information_element(mx);unsigned char dividend[N];count_dividend(dividend,mx);polynomial_division(dividend,remainder,K);}/*RS码映射成7个二进制3bit组,对应GF表*/void create_rsc(unsigned char rsc[],unsigned char remainder[],unsigned char rsc_GF[N][K]){unsigned int i,k;for (i=0;i<3;i++){rsc[i] = mx[i]; }for (i=3;i<N;i++){rsc[i] = remainder[i-3]; }for (i=0;i<N;i++){ switch (rsc[i]){ case '1':for (k=0;k<3;k++)rsc_GF[i][k] = GF[0][k];break;case 'a':for (k=0;k<3;k++)rsc_GF[i][k] = GF[1][k];break;case '0':for (k=0;k<3;k++)rsc_GF[i][k] = '0';break;default:unsigned int m = rsc[i] - 48;for (k=0;k<3;k++)rsc_GF[i][k] = GF[m][k];}}}/*BPSK映射:符号‘1’映射成‘1’,符号‘0’映射成‘-’;注意:符号‘-’输出为‘-1’*/void BPSK_mapping(unsigned char rsc_GF[N][K],unsigned char rsc_BPSK[N][K]){ unsigned int i,j;for (i=0;i<N;i++){for (j=0;j<K;j++){if (rsc_GF[i][j] == '1')rsc_BPSK[i][j] = '1';else rsc_BPSK[i][j] = '-';if (rsc_BPSK[i][j] == '-') }}}/*加噪声干扰*/void add_noise(unsigned char rsc_BPSK[N][K]){ srand(unsigned(time(0)));unsigned int n1=1,n2=2;unsigned int m1=1,m2=1;while (1){n1 = rand()%7;n2 = rand()%7;m1 = rand()%3;m2 = rand()%3;if (n1!=n2)break;}//*//*对应的位置取反*/if (rsc_BPSK[n1][m1] == '-') rsc_BPSK[n1][m1] = '1';else rsc_BPSK[n1][m1] = '-';if (rsc_BPSK[n2][m2] == '-') rsc_BPSK[n2][m2] = '1';else rsc_BPSK[n2][m2] = '-';}/*解映射*/void de_mapping(unsigned char rsc_BPSK[N][K],unsigned char de_rsc[N]) { unsigned int i,j;for (i=0;i<N;i++){ for (j=0;j<K;j++){if (rsc_BPSK[i][j] == '-')rsc_BPSK[i][j] = '0';} de_rsc[i] = math(rsc_BPSK[i]); }}/*匹配GF扩域*/void math_GF(unsigned char c,unsigned char c_tem[K]){ unsigned int k;while(1){if (c == '8')c = 'a';if (c>'8'&& c!='a')c -= 7;if (c=='7')c = '1';if (c < '7'|| c=='a')break;}switch (c){ case '1':for (k=0;k<3;k++)c_tem[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++)c_tem[k] = GF[1][k];break;case '0':for (k=0;k<3;k++)c_tem[k] = '0';break;default:unsigned int m = c - 48;for (k=0;k<3;k++)c_tem[k] = GF[m][k];}}/*求伴随多项式*/unsigned char count_sx(unsigned char de_rsc[N],unsigned int f){ unsigned char tem = '0' ,result = '0';unsigned char c_tem1[K];unsigned char c_tem2[K];unsigned char c_tem[K];for (unsigned int i=0;i<N;i++){if (de_rsc[i] == '0')continue;else if (de_rsc[i] == 'a')tem = '1' + (6 - i)*f;else if (de_rsc[i] == '1'){if ((6-i)!=0)tem = '0' + (6 - i)*f;else tem = '1';}elsetem = de_rsc[i] + (6 - i)*f;math_GF(tem,c_tem1);math_GF(result,c_tem2);for (unsigned int k=0;k<K;k++){if (c_tem1[k] == c_tem2[k])c_tem[k] = '0';else c_tem[k] = '1';}result = math(c_tem);}return result;}/*求错误多项式count_ex()的子程序,实现异或运算*/void nor(unsigned char temp1[K],unsigned char temp2[K],unsigned char result[K]){for (unsigned int i=0;i<K;i++){if (temp1[i] == temp2[i])result[i] = '0';else result[i] = '1';}}/*求错误多项式count_ex()的子程序,返回两个行列式相减的结果*/int fun(unsigned char c1,unsigned char c2){ unsigned char temp1[K],temp2[K],result[K];if (c1 == '0')c1 = '1';else if (c1 == '1') c1 = 'a';if (c2 == '0') c2 = '1';else if (c2 == '1') c2 = 'a';math_GF(c1,temp1);math_GF(c2,temp2);nor(temp1,temp2,result);unsigned char c = math(result);if (c == '1') return 0;else if (c == 'a') return 1;else return c-48;}/*求错误多项式*/void count_ex(unsigned char s[R],unsigned char qx[K-1],int n) { unsigned char tem1,tem2; u nsigned char sx[R]; int tem;for (unsigned int i=0;i<n;i++) {if (s[i] == '1') sx[i] = '0';else if (s[i] == 'a') sx[i] = '1';else sx[i] = s[i]; }/*采用行列式法*/if (s[0]!='0'&&s[2]!='0') tem1 = sx[0]+sx[2]-48;else tem1 = '0';if (s[1]!='0') tem2 = sx[1]+sx[1]-48;else tem2 = '0';tem = fun(tem1,tem2);/*Q2=(s3s3-s2s4)/(s1s3-s2s2)*/if (s[2]!='0') tem1 = sx[2]+sx[2]-48;else tem1 = '0';if (s[1]!='0'&&s[3]!='0') tem2 = sx[1]+sx[3]-48;else tem2 = '0';int a = fun(tem1,tem2);qx[0] = a-tem+48;if (qx[0] < '0') qx[0] = qx[0] + 7;/*Q1=(s1s4-s2s3)/(s1s3-s2s2)*/if (s[0]!='0'&&s[3]!='0') tem1 = sx[0]+sx[3]-48;else tem1 = '0';if (s[1]!='0'&&s[2]!='0') tem2 = sx[1]+sx[2]-48;else tem2 = '0';int b = fun(tem1,tem2);qx[1] = b-tem+48;if (qx[1] < '0') qx[1] = qx[1] + 7;}/*搜索错误位置*/void wrong_position(unsigned char tem[2]){ unsigned char qx[K]; unsigned int i,j; unsigned char tem1[K],tem2[K],tem3[K]; unsignedchar temp='0',result;for (i=0;i<N;i++){for (unsigned int j=0;j<K-1;j++) qx[j] = tem[j];/*确保下次循环时错误位置不变*/int n=2; result = '0';for (j=0;j<K;j++){ if (qx[j]=='1') qx[j] = '0';else if (qx[j]=='a') qx[j] = '1';qx[K-1] = '1';/*错误多项式的最后一位是‘1’*/temp = qx[j]+i*n;/*实现x^i*a^i*/n -= 1;math_GF(temp,tem1);math_GF(result,tem2);for (unsigned int k=0;k<K;k++)/*异或运算*/{ if (tem1[k] == tem2[k]) tem3[k] = '0';else tem3[k] = '1';}result = math(tem3); }}}/*译码与纠错*/void decode_rsc(unsigned char de_rsc[N],unsigned char sx[R]){ for (unsigned int i=0;i<R;i++) { sx[i] = count_sx(de_rsc,i+1);}unsigned char qx[K-1];count_ex(sx,qx,R);for (unsigned int j=0;j<K-1;j++){ if (qx[j] == '8') qx[j] = 'a';else if (qx[j]>'8'&& qx[j]!='a') qx[j] -= 7;else if (qx[j]=='7') qx[j] = '1';else if (qx[j] < '0') qx[j] = qx[j] + 7;}wrong_position(qx);}void main(){char GX[R+1];void count_gx(char GX[R+1]);count_gx(GX);unsigned char rsc[N];unsigned char rsc_GF[N][K];unsigned char remainder[R];count_remainder(remainder);create_rsc(rsc,remainder,rsc_GF);unsigned char rsc_BPSK[N][K];BPSK_mapping(rsc_GF,rsc_BPSK);add_noise(rsc_BPSK);unsigned char de_rsc[N];de_mapping(rsc_BPSK,de_rsc);unsigned char sx[R];decode_rsc(de_rsc,sx);cout << endl;system("pause");}5.实验测试结果:二.心得体会:通过这次的实验,让我对循环码有了更深刻的理解。
******************实践教学******************兰州理工大学计算机与通信学院2013年秋季学期《计算机通信》课程设计题目:(15,7)循环码的编译码方法专业班级:通信工程(1)班姓名:学号:指导教师:成绩:摘要本课程设计主要是通过分析查阅(n,k)循环码的编码方法,在MATLAB环境下设计了对(15,7)循环码编译码方法的仿真,首先设计了对任意(15,7)循环码的编译码,然后使一个经过(15,7)循环码编码的信号序列通过高斯信道,再对译码后的序列进行误码分析,加深对循环码的了解。
关键词:(15,7)循环码;高斯噪声;matlab目录前言 (1)一、循环码编码 (2)1.1信道编码理论 (2)1.1.1信道编码的目的 (2)1.1.2信道编码的实质 (2)1.1.3 信道编码公式 (2)1.1.4线性分组码的编译码原理 (3)1.2 循环码介绍 (4)1.2.1 循环码定义 (4)1.2.2 循环码的特点 (4)1.2.3 (n.k)循环码的码多项式表示 (5)1.2.4 (n,k)循环码的生成多项式与生成矩阵 (5)1.2.5 (n,k)循环码的校验多项式与一致校验矩阵 (7)1.3 循环码编码原理 (9)1.4 循环码的最小码距 (9)1.5 循环码的纠检错能力 (10)1.6 循环码的纠错译码原理 (11)二、(15,7)循环码程序设计 (13)2.1(15,7)循环码仿真模块 (13)2.2(15,7)循环码译码仿真模块 (14)2.3(15,7)循环码在高斯信道下的误码性能仿真模块 (14)三、设计与仿真 (15)3.1仿真设备 (15)3.2 (15,7)循环码的编码 (15)3.3 (15,7)循环码的译码 (15)3.4 (15,7)循环码在高斯信道下的误码性能 (17)总结 (18)参考文献 (19)附录 (20)致谢 (26)前言随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。
随着经济文化水平的显著提高,人们对生活质量及工作软件的要求也越来越高。
在计算机通信信息码中循环码是线性分组码的一个重要子集,是目前研究得最成熟的一类码。
它有许多特殊的代数性质,它使计算机通信以一种以数据通信形式出现,实现了在计算机与计算机之间或计算机与终端设备之间进行有效的与正确地信息传递,它使得现代通信的可靠性与有效性实现了质的飞跃。
它是现代计算机技术与通信技术飞速发展的产物,在日常生活通信领域、武器控制系统等领域都被广泛应用。
一、循环码编码1.1信道编码理论1.1.1信道编码的目的在数字通信系统中由于信道内存在加性噪声及信道传输特性不理想等容易造成码间串扰同时多用户干扰、多径传播和功率限制等也导致错误译码。
为了确保系统的误比特率指标通常采用信道编码。
信道编码是为了保证信息传输的可靠性、提高传输质量而设计的一种编码。
它是在信息码中增加一定数量的多余码元,使码字具有一定的抗干扰能力。
1.1.2信道编码的实质信道编码的实质就是在信息码中增加一定数量的多余码元(称为监督码元),使它们满足一定的约束关系,这样由信息码元和监督码元共同组成一个由信道传输的码字。
举例而言,欲传输k 位信息,经过编码得到长为n(n>k)的码字,则增加了 n - k = r 位多余码元,我们定义 R = k / n 为编码效率。
1.1.3 信道编码公式令信息速率为fb ,经过编码以后的速率为ft ,定义:R =fb/ft 为编码率。
则对于任何一个信道,总存在一个截止速率R0,只要R <R0,总可以达到:BER <CR2-nR0,其中CR 为某个常数,n 为编码的约束长度。
对于等概二进码、AWGN 信道,有:(1-1)(1-2))1(log 100/20N E R b e R -+-=121ln 1)1(000-=-R b R N E1.1.4线性分组码的编译码原理1、 线性分组码的基本概念一个[n ,k ]线性分组码, 是把信息划成k 个码元为一段(称为信息组), 通过编码器变成长为n 个 码元的一组, 作为[n , k ]线性分组码的一个码字。
若每位码元的取值有q 种(q 为素数幂), 则共有q k 个码字。
n 长的数组共有q n 组, 在二进制情况下, 有2n 个数组。
显然, q n 个n 维数组(n 重)组成一个GF(q )上的n 维线性空间。
如果q k (或2k )个码字集合构成了一个k 维线性子空间, 则称它是一个[n ,k ]线性分组码。
即将k 维k 重信息空间的元素线性映射到n 维n 重矢量空间(接收矢量/收码) 的k 维n 重子空间(码空间)。
2、生成矩阵和校验矩阵生成矩阵:(1-3)G 称为生成矩阵,因为可以用它产生整个码组A ,即有(1-4) 生成矩阵的性质:具有[I k Q ]形式的生成矩阵称为典型生成矩阵。
由典型生成矩阵得出的码组A 中,信息位的位置不变,监督位附加于其后。
这种形式的码组称为系统码。
矩阵G 的各行也必须是线性无关的。
如果已有k 个线性无关的码组,则可以将其用来作为生成矩阵G ,并由它生成其余码组。
监督矩阵: []r PI H =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=001101101011011001110 (1-5)监督矩阵可用来校验和纠错。
[]⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡==0110001101001011001001111000 Q G k I [][]G34560123456a a a a a a a a a a a A ==1.2循环码介绍循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。
循环码的编码和解码设备都不太复杂,且检(纠)错能力强。
它不但可以检测随机的错误,还可以检错突发的错误。
(n,k )循环码可以检测长为n-k 或更短的任何突发错误,包括首尾相接突发错误。
循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。
符合这个特点的有多种方案,但循环码只能是表中的那种。
循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。
这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。
循环码就是这样一种编码,它可以在卡诺图中依次循环得到。
循环码又称格雷码( Grey Code )。
循环码是采用循环移位特性界定的一类线性分组码。
是线性分组码的一个重要子类;BCH 码是其主要的一大类;汉明码、R-M 码、Golay 码、RS 码等可变换;纳入循环码内,Goppa 码的一个子类也属于循环码;用反馈线性移位寄存器可以容易的实现其编码和得到伴随式;由于数学上的特性,译码方法简单。
1.2.1循环码定义设C 使某(n,k)线性分组码的码字集合,如果对任何C c c c C n n ∈=--),,,(021 ,它的循环移位),,,,(1032)1(---=n n n c c c c C 也属于C 。
该码在结构上有另外的限制,即一个码字任意循环移位的结果仍是一个有效码字。
1.2.2循环码的特点循环码有两个数学特征:(1)线性分组码的封闭型;(2)循环性,即任一许用码组经过循环移位后所得到的码组仍为该许用码组集合中的一个码组。
如:若()0121a a a a n n ⋅⋅⋅--为一循环码组,则()1032---⋅⋅⋅n n n a a a a 、()2143----⋅⋅⋅n n n n a a a a 、……还是许用码组。
也就是说,不论是左移还是右移,也不论移多少位,仍然是许用的循环码组。
1.2.3 (n.k )循环码的码多项式表示为了用代数理论研究循环码,可将码组用多项式表示,设码长为n 的循环码表示为(0121 a a a a a i n n --), 其中i a 为二进制数,通常把码组中各码元当做二进制的系数,即把上式中长为n 的各个分量看做多项式的各项系数,:()a x a x a x a x a i n i n n n n x T 012211++++++=----- (1-6)则码字与码多项式一一对应,这种多项式称为码多项式。
式中,x 的幂次是码元位置的标记。
若把一个码组左移i 位后的码组记为, (1-7) 其码多项式为(1-8) A (i)(x)可以根据x i A(x)按模x n +1运算得到,即(1-9)(1-10) 式中,Q(x)为x i A(x)除以x n +1的商式,而x i A(x)等于A (i)(x)被x n +1除得之余式。
1.2.4 (n,k)循环码的生成多项式与生成矩阵(n,k)循环码的生成多项式写为g(x),它是(n,k)循环码码集中唯一的,幂次为)...(121)(i n i n i n i n i a a a a A -+-=---=i n i n n i n n i n i a x a x a x a x A -+-------++++=12211)(...)()1mod()()()(+≡n i i x x A x x A )()1)(()()(x A x x Q x A x i n i ++=n-k 的码多项式,则)(x g x k 是一个幂次为n 的码多项式。
按模(1+n x )运算,此时:(1-11)即 )()(x R x g x k ≡ (1-12) 且因k x g(x)也是n 阶幂,故Q(x)=1。
由于它是循环码,故)(x g x k 按模(1+n x )运算后的“余式”也是循环码的一个码字,它必能被g(x)整除,即:(1-13) 由以上两式可以得到:)()()1()()1)(()(x g x f x x R x x Q x g x n n k ++=++= (1-14) 和 [])()()()(1x g x h x g x f x x k n =+++ (1-15) 从上式中可以看出,生成多项式g(x)应该是1+n x 的一个因式,即循环码多项式应该是1+n x 的一个n-k 次因式。
根据各码组集合中生成多项式的唯一性,可以构造生成矩阵G 。
由于g(x)的次数为n-k ,则g(x),xg(x),…,x k-1g(x)都是码多项式,而且线性无关,因此以这k 各多项式对应的码组作为k 行就能构成该循环码的生成矩阵,因此循环码的生成矩阵多项式可以写成(1-16)本课程设计要求完成任意(15,7)循环码的编码和译码,其中给出的生成多项式为:g(x)=x 8+x 7+x 6+x 4+1则生成矩阵G 为g(x)升幂排列时的G 为n x R x Q n x g x k )()()( +=)()()(x F x g x R =⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-)()(.......)()(1x g x xg x g x x G k⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=100010111000000010001011100000001000101110000000100010111000000010001011100000001000101110000000100010111G (1-17)对式(1.1.12)作线性变换,整理成典型形式的系统生成矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=100010111000000110011100100000011001110010000101110000001000010111000000100001011100000010000101110000001s G (1-18)若信息码元与式(1.1.13)相乘,得到的就是系统循环码。