循环编码Word格式文档下载.doc
《循环编码Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《循环编码Word格式文档下载.doc(15页珍藏版)》请在冰豆网上搜索。
![循环编码Word格式文档下载.doc](https://file1.bdocx.com/fileroot1/2022-10/4/f17b8aca-7140-442e-9406-fd827b3315d2/f17b8aca-7140-442e-9406-fd827b3315d21.gif)
一.循环码编码和译码原理简介:
1.RS循环码编码原理与特点:
首先令和分别表示信息多项式与校验多项式,则一个RS码的多项式表达式为:
如果为一个码字,则它必须为生成多项式的位数,即:
编码的过程就是从和中寻找,它可通过除法算法来完成。
即用除以得到:
(1式)
同时令=-,则有。
2.RS循环码译码原理与特点:
(1)能纠正t个符号差错的(n,k)RS码,数据段中包含k个信息符号和2t个校验符号。
设存贮器系统数据输出的多项式(妈接收字多项式)可以表达为,差错图样多项式为,纠错后的码多项式为,伴随式多项式为,差错定位多项式为。
3.RS循环码的基本步骤及实现循环码的程序流程图:
信源
分帧
Rs(7,3)编码
BPSK调制
AWGN信道
BPSK解调
Rs(7,3)译码
合帧
误码率计算
4.主要源程序:
/*输入的信息元:
m(x)*/
voidinformation_element(unsignedcharmx[K])
{
unsignedchartem;
srand((unsigned)time(0));
for(unsignedinti=0;
i<
K;
i++) {
tem=rand()%6+1;
if(tem==1) mx[i]='
a'
;
else mx[i]=tem+48;
}
}
/*确定被除数:
x^(n-k)m(x)*/
voidcount_dividend(unsignedchardividend[],unsignedcharmx[])
{ for(inti=0;
N;
if(i>
=K) { dividend[i]='
0'
continue;
dividend[i]=mx[i];
/*gx各项乘以被除数的第一项系数;
注意:
符号'
的ASCII码为48*/
voidfor_mod2(unsignedchartem[],unsignedcharc)
{ unsignedinti;
switch(c)
{ case'
1'
:
for(i=0;
5;
i++) tem[i]=gx[i];
break;
case'
for(i=0;
i++){
if(gx[i]=='
) tem[i]='
elseif(gx[i]=='
2'
else tem[i]=gx[i]+1;
}
default:
i++)
{ if(gx[i]=='
) tem[i]=c;
) tem[i]=(int)c+1;
else tem[i]=(int)gx[i]+(int)c-48;
/*应用课本第153页的表6-7的关系式转换*/
for(i=0;
{ if(tem[i]=='
8'
if(tem[i]>
'
&
tem[i]!
='
) tem[i]-=7;
if(tem[i]=='
7'
/*与GF(2^3)扩域(课本153页)匹配*/
unsignedcharmath(unsignedcharctem[])
unsignedcharc='
//当两系数相同时(即a^i+a^i=0)为0
if(ctem[0]=='
ctem[1]=='
ctem[2]=='
) c='
3'
4'
5'
6'
returnc;
/*mod2加*/
voidmod2(unsignedchardividend[],unsignedchartem[],unsignedcharremainder[])
{ unsignedintk;
for(unsignedintj=1;
j<
j++)
{ unsignedchartem1[3];
unsignedchartem2[3];
/*被除数对应到GF(2^3)扩域,增加三位都是'
的情况*/
switch(dividend[j])
{case'
for(k=0;
k<
3;
k++) tem1[k]=GF[0][k];
break;
case'
k++) tem1[k]=GF[1][k];
k++) tem1[k]='
default:
unsignedintn=dividend[j]-48;
k++) tem1[k]=GF[n][k];
/*gx各项乘以被除数的第一项系数后对应到GF(2^3)扩域,增加三位都是'
switch(tem[j])
k++) tem2[k]=GF[0][k];
k++) tem2[k]=GF[1][k];
unsignedintm=tem[j]-48;
k++) tem2[k]=GF[m][k];
/*异或运算*/
unsignedcharctem[3];
for(k=0;
k++)
{ if(tem1[k]==tem2[k]) ctem[k]='
else ctem[k]='
remainder[j-1]=math(ctem);
/*匹配*/
/*多项式相除*/
voidpolynomial_division(unsignedchardividend[],unsignedcharremainder[],intflag)
unsignedchartem[5];
unsignedinti,n=5;
flag;
{
for_mod2(tem,dividend[0]);
mod2(dividend,tem,remainder);
/*准备下次除法的被除数,如果被除数的第一项为0则被除数数组左移一位,第一,二项都为0则停止*/
for(unsignedintj=0;
R;
j++)dividend[j]=remainder[j];
dividend[4]=dividend[n++];
if(dividend[0]=='
)
{
if(dividend[1]=='
)break;
for(unsignedintk=0;
k++)dividend[k]=dividend[k+1];
i++;
n++;
dividend[3]='
/*求余式*/
voidcount_remainder(unsignedcharremainder[R])
information_element(mx);
unsignedchardividend[N];
count_dividend(dividend,mx);
polynomial_division(dividend,remainder,K);
/*RS码映射成7个二进制3bit组,对应GF表*/
voidcreate_rsc(unsignedcharrsc[],unsignedcharremainder[],unsignedcharrsc_GF[N][K])
unsignedinti,k;
i++){rsc[i]=mx[i];
for(i=3;
i++){rsc[i]=remainder[i-3];
{ switch(rsc[i])
{ case'
k++)rsc_GF[i][k]=GF[0][k];
k++)rsc_GF[i][k]=GF[1][k];
k++)rsc_GF[i][k]='
unsignedintm=rsc[i]-48;
k++)rsc_GF[i][k]=GF[m][k];
/*BPSK映射:
符号‘1’映射成‘1’,符号‘0’映射成‘-’;
符号‘-’输出为‘-1’*/
voidBPSK_mapping(unsignedcharrsc_GF[N][K],unsignedcharrsc_BPSK[N][K])
{ unsignedinti,j;
{for(j=0;
{if(rsc_GF[i][j]=='
)rsc_BPSK[i