R-S编码译码-缩短码(10,6)

本文介绍了R-S主导头差错控制算法,使用缩短R-S(10,6)码纠正2个分散或连续符号错误。提供了RS编码和译码的C语言实现代码,包括编码、译码的详细步骤,并有封装函数处理char型数组。适用于理解RS码的错误纠正原理和应用。" 126667057,9286856,MT666数字程序测试常见问题与解决方案,"['功能测试', 'OS', '数字测试', '电压测量', '回码验证']
摘要由CSDN通过智能技术生成

需求: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]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值