1、汕 头 大 学 工 学 院三级项目报告课程名称: 信息论与编码 课程题目: 循环码的编码和译码程序设计 指导教师: 唐雅娟 系 别: 电子工程系 专 业: 电子信息工程 学生姓名: 曾煌冠 学 号: 09141014 完成时间: 2012 年 5月4日至 5月14日成绩: 评阅人:唐雅娟循环码的编码和译码程序设计一. 循环码编码和译码原理简介:1. RS循环码编码原理与特点:首先令和分别表示信息多项式与校验多项式,则一个RS码的多项式表达式为:如果为一个码字,则它必须为生成多项式的位数,即:编码的过程就是从和中寻找,它可通过除法算法来完成。即用除以得到:(1式)同时令=-,则有。2. RS循环
2、码译码原理与特点:(1) 能纠正t个符号差错的(n,k)RS码,数据段中包含k个信息符号和2t个校验符号。设存贮器系统数据输出的多项式(妈接收字多项式)可以表达为,差错图样多项式为,纠错后的码多项式为,伴随式多项式为,差错定位多项式为。3. RS循环码的基本步骤及实现循环码的程序流程图:信源分帧Rs(7,3)编码BPSK调制AWGN信道BPSK解调Rs(7,3)译码合帧误码率计算4. 主要源程序:/*输入的信息元:m(x)*/void information_element(unsigned char mxK)unsigned char tem;srand(unsigned)time(0);f
3、or (unsigned int i=0;iK;i+)tem = rand()%6+1;if (tem = 1)mxi = a;elsemxi = tem + 48;/*确定被除数:x(n-k)m(x)*/void count_dividend(unsigned char dividend,unsigned char mx)for (int i=0;i=K)dividendi = 0;continue;dividendi = mxi;/*gx各项乘以被除数的第一项系数;注意:符号0的ASCII码为48*/void for_mod2(unsigned char tem,unsigned char
4、 c)unsigned int i;switch (c)case 1:for (i=0;i5;i+)temi = gxi;break;case a:for(i=0;i5;i+)if (gxi = 1)temi = a;else if (gxi = a)temi = 2;elsetemi = gxi + 1;break;default:for(i=0;i5;i+)if (gxi = 1)temi = c;else if (gxi = a)temi = (int)c + 1;elsetemi = (int)gxi + (int)c - 48;break;/*应用课本第153页的表6-7的关系式转换
5、*/for (i=0;i8& temi!=a)temi -= 7;if (temi=7)temi = 1;/*与GF(23)扩域(课本153页)匹配*/unsigned char math(unsigned char ctem)unsigned char c = 0;/当两系数相同时(即ai+ai=0)为0if (ctem0=0&ctem1=0&ctem2=1)c = 1;if (ctem0=0&ctem1=1&ctem2=0)c = a;if (ctem0=1&ctem1=0&ctem2=0)c = 2;if (ctem0=0&ctem1=1&ctem2=1)c = 3;if (ctem0=
6、1&ctem1=1&ctem2=0)c = 4;if (ctem0=1&ctem1=1&ctem2=1)c = 5;if (ctem0=1&ctem1=0&ctem2=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;j5;j+)unsigned char tem13;unsigned char tem23;/*被除数对应到GF(23)扩域,增加三位都是0的情况*/swi
7、tch (dividendj)case 1:for (k=0;k3;k+)tem1k = GF0k;break;case a:for (k=0;k3;k+)tem1k = GF1k;break;case 0:for (k=0;k3;k+)tem1k = 0;break;default:unsigned int n = dividendj - 48;for (k=0;k3;k+)tem1k = GFnk;/*gx各项乘以被除数的第一项系数后对应到GF(23)扩域,增加三位都是0的情况*/switch (temj)case 1:for (k=0;k3;k+)tem2k = GF0k;break;c
8、ase a:for (k=0;k3;k+)tem2k = GF1k;break;case 0:for (k=0;k3;k+)tem1k = 0;break;default:unsigned int m = temj - 48;for (k=0;k3;k+)tem2k = GFmk;/*异或运算*/unsigned char ctem3;for (k=0;kK;k+)if (tem1k = tem2k)ctemk = 0;elsectemk = 1;remainderj-1 = math(ctem);/*匹配*/*多项式相除*/void polynomial_division(unsigned
9、char dividend,unsigned char remainder,int flag)unsigned char tem5;unsigned int i,n=5;for (i=0;iflag;i+)for_mod2(tem,dividend0);mod2(dividend,tem,remainder);/*准备下次除法的被除数,如果被除数的第一项为0则被除数数组左移一位,第一,二项都为0则停止*/for (unsigned int j=0;jR;j+)dividendj = remainderj;dividend4 = dividendn+;if (dividend0 = 0)if (
10、dividend1 = 0)break;for (unsigned int k=0;kK;k+)dividendk = dividendk+1;i +;n +;dividend3 = 0;/*求余式*/void count_remainder(unsigned char remainderR)information_element(mx);unsigned char dividendN;count_dividend(dividend,mx);polynomial_division(dividend,remainder,K);/*RS码映射成7个二进制3bit组,对应GF表*/void crea
11、te_rsc(unsigned char rsc,unsigned char remainder,unsigned char rsc_GFNK)unsigned int i,k;for (i=0;i3;i+)rsci = mxi;for (i=3;iN;i+)rsci = remainderi-3;for (i=0;iN;i+)switch (rsci)case 1:for (k=0;k3;k+)rsc_GFik = GF0k;break;case a:for (k=0;k3;k+)rsc_GFik = GF1k;break;case 0:for (k=0;k3;k+)rsc_GFik = 0
12、;break;default:unsigned int m = rsci - 48;for (k=0;k3;k+)rsc_GFik = GFmk;/*BPSK映射:符号1映射成1,符号0映射成-;注意:符号-输出为-1*/void BPSK_mapping(unsigned char rsc_GFNK,unsigned char rsc_BPSKNK)unsigned int i,j;for (i=0;iN;i+)for (j=0;jK;j+)if (rsc_GFij = 1)rsc_BPSKij = 1;else rsc_BPSKij = -;if (rsc_BPSKij = -)/*加噪声
13、干扰*/void add_noise(unsigned char rsc_BPSKNK)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_BPSKn1m1 = -)rsc_BPSKn1m1 = 1;elsersc_BPSKn1m1 = -;if (rsc_BPSKn2m2 = -)rsc_BPSKn2m2
14、 = 1;elsersc_BPSKn2m2 = -;/*解映射*/void de_mapping(unsigned char rsc_BPSKNK,unsigned char de_rscN)unsigned int i,j;for (i=0;iN;i+)for (j=0;j8& c!=a)c -= 7;if (c=7)c = 1;if (c 7| c=a)break;switch (c)case 1:for (k=0;k3;k+)c_temk = GF0k;break;case a:for (k=0;k3;k+)c_temk = GF1k;break;case 0:for (k=0;k3;k
15、+)c_temk = 0;break;default:unsigned int m = c - 48;for (k=0;k3;k+)c_temk = GFmk;/*求伴随多项式*/unsigned char count_sx(unsigned char de_rscN,unsigned int f)unsigned char tem = 0 ,result = 0;unsigned char c_tem1K;unsigned char c_tem2K;unsigned char c_temK;for (unsigned int i=0;iN;i+)if (de_rsci = 0)continu
16、e;else if (de_rsci = a)tem = 1 + (6 - i)*f;else if (de_rsci = 1)if (6-i)!=0)tem = 0 + (6 - i)*f;else tem = 1;elsetem = de_rsci + (6 - i)*f;math_GF(tem,c_tem1);math_GF(result,c_tem2);for (unsigned int k=0;kK;k+)if (c_tem1k = c_tem2k)c_temk = 0;else c_temk = 1;result = math(c_tem);return result;/*求错误多
17、项式count_ex()的子程序,实现异或运算*/void nor(unsigned char temp1K,unsigned char temp2K,unsigned char resultK)for (unsigned int i=0;iK;i+)if (temp1i = temp2i)resulti = 0;else resulti = 1;/*求错误多项式count_ex()的子程序,返回两个行列式相减的结果*/int fun(unsigned char c1,unsigned char c2)unsigned char temp1K,temp2K,resultK;if (c1 = 0
18、)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 sR,unsigned char qxK-1,int n)unsigned c
19、har tem1,tem2;unsigned char sxR;int tem;for (unsigned int i=0;in;i+)if (si = 1)sxi = 0;else if (si = a)sxi = 1;elsesxi = si;/*采用行列式法*/if (s0!=0&s2!=0)tem1 = sx0+sx2-48;else tem1 = 0;if (s1!=0)tem2 = sx1+sx1-48;elsetem2 = 0;tem = fun(tem1,tem2);/*Q2=(s3s3-s2s4)/(s1s3-s2s2)*/if (s2!=0)tem1 = sx2+sx2-4
20、8;elsetem1 = 0;if (s1!=0&s3!=0)tem2 = sx1+sx3-48;elsetem2 = 0;int a = fun(tem1,tem2);qx0 = a-tem+48;if (qx0 0)qx0 = qx0 + 7;/*Q1=(s1s4-s2s3)/(s1s3-s2s2)*/if (s0!=0&s3!=0)tem1 = sx0+sx3-48;elsetem1 = 0;if (s1!=0&s2!=0)tem2 = sx1+sx2-48;elsetem2 = 0;int b = fun(tem1,tem2);qx1 = b-tem+48;if (qx1 0)qx1
21、= qx1 + 7;/*搜索错误位置*/void wrong_position(unsigned char tem2)unsigned char qxK;unsigned int i,j;unsigned char tem1K,tem2K,tem3K;unsigned char temp=0,result;for (i=0;iN;i+)for (unsigned int j=0;jK-1;j+)qxj = temj;/*确保下次循环时错误位置不变*/int n=2;result = 0;for (j=0;jK;j+)if (qxj=1)qxj = 0;else if (qxj=a)qxj =
22、1;qxK-1 = 1;/*错误多项式的最后一位是1*/temp = qxj+i*n;/*实现xi*ai*/n -= 1;math_GF(temp,tem1);math_GF(result,tem2);for (unsigned int k=0;kK;k+)/*异或运算*/if (tem1k = tem2k)tem3k = 0;elsetem3k = 1;result = math(tem3);/*译码与纠错*/void decode_rsc(unsigned char de_rscN,unsigned char sxR)for (unsigned int i=0;iR;i+)sxi = co
23、unt_sx(de_rsc,i+1);unsigned char qxK-1;count_ex(sx,qx,R);for (unsigned int j=0;j8& qxj!=a)qxj -= 7;else if (qxj=7)qxj = 1;else if (qxj 0)qxj = qxj + 7;wrong_position(qx);void main()char GXR+1;void count_gx(char GXR+1);count_gx(GX);unsigned char rscN;unsigned char rsc_GFNK;unsigned char remainderR;count_remainder(remainder);create_rsc(rsc,remainder,rsc_GF);unsigned char rsc_BPSKNK;BPSK_mapping(rsc_GF,rsc_BPSK);add_noise(rsc_BPSK);unsigned char de_rscN;de_mapping(rsc_BPSK,de_rsc);unsigned char sxR;decode_rsc(de_rsc,sx
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2