第五节 系统循环码的编译码电路
- 格式:ppt
- 大小:176.00 KB
- 文档页数:19
1“四遥”功能:①遥测:远程测量,传输被测变量值.②遥信:远程指示,如告警\开关位置等状态.。
对状态信息的远程监视。
③遥控:传送改变运行设备状态的命令。
④遥调:远程调节,传送改变运行设备参数的命令。
2,实现远程的手段:配置必要的自动装置;设国家调度,大区网调,省级调度和地区调度等各级调度中心。
2两种传输模式:循环传输模式CDT或问答传输模式poling3五级调度:国家调度、大区网调、省级调度、地区调度和县级调度。
4电力系统调度中心的任务:1 合理调度发电厂出力2 迅速排除故障3 实时了解,决策调整5远程监控:远动技术在电力系统中的应用,使调度员借助遥测和遥信,监视远方运行设备的实时运行状况;借助遥控和遥调,完成对远方运行设备的控制.即远程监视和远程控制。
6,远程信息内容:包括①遥测信息,②遥信信息,③遥控信息,④腰调信息。
①分为电量和非电量两类。
②用“1”“0”表示出一个遥信对象的两种不同状态。
遥测信息称为上行信息。
③是传送改变运行设备状态的命令。
必须进行返回校核。
④传送改变运行设备参数的命令。
遥调信息和遥控信息称为下行信息。
7,远程信息传输模式:①循环传输模式CDT②问答传输模式polling。
①信息的传送是周期性的,周而复始的,发端不顾及收端的需要,也不要求收端给予回答。
②必须由调动主动像厂站端发送查询命令报文,厂站端按调度端的查询要求发送回答报文(按需传送,必须保证有上下行信道。
)8,远东信息的编码:远动信息在传输前,必须按有关规定,把远动信息变换成各种信息字或各种报文。
9,远动信道:传输远动信号的通道。
包括专用有线信道,复用电力线载波信道,微波通道,光纤信道,无线电信道等。
10,远动系统的设备:厂站端远动装备,调度端远动装置,远动信道。
11远动系统配置类型:①点对点配置,②多路点对点配置,③多点星形配置,④多点共线配置,⑤多点环形配置。
①专用的传输链路想连接。
②东故宫各自链路与多个站相连的一种配置。
循环码的编译码方法..***************** 实践教学****************** 兰州理工大学计算机与通信学院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。
循环码编译码工作过程可以概括为以下几个步骤:一、循环码编码过程1. 生成多项式选择:循环码的编码过程中,需要选择合适的生成多项式,以便将输入的数据符号转换成循环码序列。
常见的生成多项式有GF(2^m)中的最小多项式、标准多项式等。
2. 输入数据符号的编码:将输入的数据符号转换成二进制码字,可以采用简单的模2加法或利用编码算法进行转换。
3. 生成多项式扩展:将二进制码字通过生成多项式进行扩展,得到循环码的码字。
由于循环码是循环移位对称的,因此可以通过将码字循环移位得到不同的码字。
4. 校验位添加:根据循环码的校验规则,添加校验位,以确保编码后的码字是正确的循环码序列。
二、循环码解码过程1. 循环移位:将接收到的码字进行循环移位,使其与发送的码字匹配。
2. 校验位检查:根据循环码的校验规则,检查接收到的码字中的校验位是否正确。
3. 错误检测与纠正:如果校验位不正确,需要根据错误的位置和大小进行错误检测和纠正。
如果错误数量较少且位置相对固定,可以采用简单的错误纠正算法;如果错误数量较多或位置不固定,则需要利用更复杂的算法进行错误检测和纠正。
4. 数据恢复:根据解码过程中得到的正确的二进制码字,恢复原始数据符号。
需要注意的是,循环码的编码和解码过程都涉及到多项式的运算,因此需要选择合适的算法和工具进行实现。
同时,为了保证编码和解码的正确性和效率,还需要对传输过程中的干扰和噪声等因素进行考虑和处理。
在实现循环码的过程中,可以采用硬件或软件的方式。
对于硬件实现,可以利用数字电路和微处理器等技术进行设计;对于软件实现,可以利用编程语言和算法库等进行编写。
在实际应用中,需要根据具体的需求和环境选择合适的方式。
总之,循环码是一种重要的编码技术,具有较高的可靠性和效率。
了解循环码的编译码工作过程,对于在实际应用中实现循环码、优化编码和解码性能、提高通信系统的性能具有重要意义。
汕头大学工学院三级项目报告课程名称:信息论与编码课程题目:循环码的编码和译码程序设计指导教师:唐雅娟系别:电子工程系专业:电子信息工程学生姓名:曾煌冠学号: 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.实验测试结果:二.心得体会:通过这次的实验,让我对循环码有了更深刻的理解。