• 大小: 11KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-05-15
  • 语言: C/C++
  • 标签: rs编码  c语言  

资源简介

利用c语言编写的rs编解码程序,里边有大概的注释。方便学习和研究,有一定的参考价值。里边包含编码和解码,有需要可以自取。

资源截图

代码片段和文件信息

//rs code
//m=8
 
#include 
#include 
#include 
 
#define mm  8          /* RS code over GF(2**4) - change to suit */
#define nn  255          /* nn=2**mm -1   length of codeword */
#define tt  10           /* number of errors that can be corrected */
#define kk  235           /* kk = nn-2*tt  */
 
int pp[mm+1] = {1 0 1 1 1 0 0 0 1};
int alpha_to [nn+1] index_of [nn+1] gg [nn-kk+1] ;
int recd [nn] data [kk] bb [nn-kk] ;
 
void generate_gf()
/* 生成GF(2^m)空间 */
{
register int i mask ;
mask = 1 ;
alpha_to[mm] = 0 ;
for (i=0; i {
alpha_to[i] = mask ;
index_of[alpha_to[i]] = i ;
if (pp[i]!=0)
alpha_to[mm] ^= mask ;
mask <<= 1 ;
}
index_of[alpha_to[mm]] = mm ;
mask >>= 1 ;
for (i=mm+1; i {
if (alpha_to[i-1] >= mask)
alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1]^mask)<<1) ;
else 
alpha_to[i] = alpha_to[i-1]<<1 ;
index_of[alpha_to[i]] = i ;
}
index_of[0] = -1 ;
//alpha_to[nn] = 1;
for(i=0;i printf(“gf%d is%d\n“ialpha_to[i]);
}
 
void gen_poly()
/* 生成---生成多项式*/
{
register int ij ;
gg[0] = 2 ;    /* primitive element alpha = 2  for GF(2**mm)  */
gg[1] = 1 ;    /* g(x) = (X+alpha) initially */
for (i=2; i<=nn-kk; i++)
    {
gg[i] = 1 ;
for (j=i-1; j>0; j--)
if (gg[j] != 0)  
gg[j] = gg[j-1]^ alpha_to[(index_of[gg[j]]+i)%nn];
else 
gg[j] = gg[j-1] ;
gg[0] = alpha_to[(index_of[gg[0]]+i)%nn] ;     /* gg[0] can never be zero */
   }
   //printf(“polynomial:\n“);
   //for(i=0; i<=nn-kk; i++)
//   printf(“%d      “ gg[i]);
   //printf(“\n“);
   /* convert gg[] to index form for quicker encoding */
   for (i=0; i<=nn-kk; i++)  
   gg[i] = index_of[gg[i]];
 
   //printf(“polynomial:\n“);
   //for(i=0; i<=nn-kk; i++)
//   printf(“%d      “ gg[i]);
   //printf(“\n“);
}
 
void encode_rs()
/* 编码*/
{
register int ij ;
int feedback ;
for (i=0; i for (i=kk-1; i>=0; i--)
    {
//逐步的将下一步要减的,存入bb(i)
feedback = index_of[data[i]^bb[nn-kk-1]] ;
if(feedback != -1)
        {
for (j=nn-kk-1; j>0; j--)
            if (gg[j] != -1)
bb[j] = bb[j-1]^alpha_to[(gg[j]+feedback)%nn] ; //plus = ^
            else
bb[j] = bb[j-1] ;
bb[0] = alpha_to[(gg[0]+feedback)%nn] ;
        }
else
        {
for (j=nn-kk-1; j>0; j--)
bb[j] = bb[j-1] ;
bb[0] = 0 ;
        };
    };
}
 
void decode_rs()
 {/*解码*/
register int ijuq ;
int elp[nn-kk+2][nn-kk] d[nn-kk+2] l[nn-kk+2] u_lu[nn-kk+2] s[nn-kk+1] ;
int count=0 syn_error=0 root[tt] loc[tt] z[tt+1] err[nn] reg[tt+1] ;
/* first form the syndromes */
for(i=0; i if(recd[i] == -1)
recd[i] = 0;
else
recd[i] = index_of[recd[i]];
 
for (i=1; i<=nn-kk; i++)
{
s[i] = 0 ;
for (j=0; j        if (recd[j]!=-1)
s[i] ^= alpha_to[(recd[j]+i*j)%nn] ;      /* recd[j] in index form *

评论

共有 条评论