需求:R-S主导头差错控制算法,采用缩短R-S(10,6)码,能够纠正这个码块中出现的2个分散的或者两个连续的符号(4个bit)错误。话不多说,直接上代码,本代码参考了网上的很多资料,所以公开在CSDN上,希望能帮到有需要的人。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>
#define GF_POWER 4 /* 伽罗华域GF(2^m)的幂次数 */
#define ENCODE_LEN 15 /* 编码后的长度 */
#define ERR_NUM 2 /* 能够纠正的错误数目,可以纠正这个码块中出现的2个分散的或者两个连续的符号错误 */
#define INFO_CODE_LEN 11 /* 信息码长 */
#define DIFF_VALUE 5 /* 系统码(15,11)与缩短码(10,6)的信息长度差值 */
const int nPriPoly[GF_POWER+1] = {
1, 1, 0, 0, 1} ; /* 本原多项式系数:1+x+x^4 */
const int nAlphaTo[ENCODE_LEN+1] = {
1, 2, 4, 8, 3, 6, 12, 11, 5, 10, 7, 14, 15, 13, 9, 0}; /* 为多项式域GF(2^m)中的元素,将多项式形式映射为二进制形式 */
const int nIndexOf[ENCODE_LEN+1] = {
-1, 0, 1, 4, 2, 8, 5, 10, 3, 14, 9, 7, 6, 13, 11, 12}; /* 域中各元素所对应的的幂次数,如 nIndexOf(alpha^m)=m,将二进制形式映射为多项式形式 */
const int nCodeGenPoly[ENCODE_LEN-INFO_CODE_LEN+1] = {
10, 3, 6, 13, 0}; /* g(x)码生成多项式幂次数,MATLAB函数生成的为多项式系数 */
/*
函数功能:实现RS编码,在系统码(15-11)的基础上使用缩短码(10-6)级编码。
实现原理:信息码乘以x^(n-k-1),再除以g(x),即可得到余式r(x),也就得到了校验位。
输入:anInfoData: 信息码存储数组
输出:anCheckData: 校验码存储数组
输出:anRecodeData: 重新编码后的存储数组
返回值:无
*/
void Encode_Rs(int anRecodeData[ENCODE_LEN-DIFF_VALUE], int anCheckData[ENCODE_LEN-INFO_CODE_LEN], int anInfoData[INFO_CODE_LEN-DIFF_VALUE])
{
int i,j ;
int nFeedBack ;
/* 采用缩短码(10,6),需要减去5个R-S符号单位 */
for (i=INFO_CODE_LEN-DIFF_VALUE-1; i>=0; i--)
{
nFeedBack = nIndexOf[anInfoData[i]^anCheckData[ENCODE_LEN-INFO_CODE_LEN-1]] ;
if (nFeedBack != -1)
{
for (j=ENCODE_LEN-INFO_CODE_LEN-1; j>0; j--)
{
if (nCodeGenPoly[j] != -1)
{
/* 得到余式,即为校验式 */
anCheckData[j] = anCheckData[j-1]^nAlphaTo[(nCodeGenPoly[j]+nFeedBack)%ENCODE_LEN] ;
}
else
{
anCheckData[j] = anCheckData[j-1] ;
}
}
anCheckData[0] = nAlphaTo[(nCodeGenPoly[0]+nFeedBack)%ENCODE_LEN] ;
}
else
{
for (j=ENCODE_LEN-INFO_CODE_LEN-1; j>0; j--)
{
anCheckData[j] = anCheckData[j-1] ;
}
anCheckData[0] = 0 ;
}
}
/* 填充校验位数据 */
for (i=0; i<ENCODE_LEN-INFO_CODE_LEN; i++)
{
anRecodeData[i] = anCheckData[i] ;
}
/* 填充信息位数据 */
for (i=0; i<INFO_CODE_LEN-DIFF_VALUE; i++)
{
anRecodeData[i+ENCODE_LEN-INFO_CODE_LEN] = anInfoData[i] ;
}
}
/*
函数功能:实现RS译码,在系统码(15-11)的基础上使用缩短码(10-6)级编码。
实现原理:1、由接收码字R(X),即校验码计算伴随多项式S(x);
2、根据伴随式及Berlekamp迭代算法计算错误位置多项式;
3、用钱搜索法解出错误位置多项式的根;
4、利用Forney算法求得错误位置上的错误值,从而得到错误图样E(x);
5、在RS码的纠错范围内,即错误数不大于2时,R(x) + E(x) = C(x),其中C(x)指编码后的码字多项式。
输入:anRecodeData: 重新编码后的存储数组
输出:anDecodeData: 译码后的存储数组
返回值:无
*/
void Decode_Rs(int anRecodeData[ENCODE_LEN], int anDecodeData[INFO_CODE_LEN])
{
int i,j,u,q ;
int anElp[ENCODE_LEN-INFO_CODE_LEN+2][ENCODE_LEN-INFO_CODE_LEN]; /* 错误位置多项式 */
int anAdjoint_Poly[ENCODE_LEN-INFO_CODE_LEN+1]; /* 伴随多项式 */
int anRoot[ERR_NUM]; /* 错误位置多项式的根 */
int anLoc[ERR_NUM]; /* 错误位置 */
int anErr[ENCODE_LEN]; /* 错误图样E(x) */
int anD[ENCODE_LEN-INFO_CODE_LEN+2], l[ENCODE_LEN-INFO_CODE_LEN+2], u_lu[ENCODE_LEN-INFO_CODE_LEN+2]