⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exercise.c

📁 RS编解码c语言程序4.0版,
💻 C
字号:
/* Exercise an RS codec a specified number of times using random * data and error patterns * * Copyright 2002 Phil Karn, KA9Q * May be used under the terms of the GNU General Public License (GPL) */#define FLAG_ERASURE 1 /* Randomly flag 50% of errors as erasures */#include <stdio.h>#include <stdlib.h>#ifdef FIXED#include "fixed.h"#define EXERCISE exercise_8#elif defined(CCSDS)#include "fixed.h"#include "ccsds.h"#define EXERCISE exercise_ccsds#elif defined(BIGSYM)#include "int.h"#define EXERCISE exercise_int#else#include "char.h"#define EXERCISE exercise_char#endif#ifdef FIXED#define PRINTPARM printf("(255,223):");#elif defined(CCSDS)#define PRINTPARM printf("CCSDS (255,223):");#else#define PRINTPARM printf("(%d,%d):",rs->nn,rs->nn-rs->nroots);#endif/* Exercise the RS codec passed as an argument */int EXERCISE(#if !defined(CCSDS) && !defined(FIXED)void *p,#endifint trials){#if !defined(CCSDS) && !defined(FIXED)  struct rs *rs = (struct rs *)p;#endif  DTYPE block[NN],tblock[NN];  int i;  int errors;  int errlocs[NN];  int derrlocs[NROOTS];  int derrors;  int errval,errloc;  int erasures;  int decoder_errors = 0;  while(trials-- != 0){    /* Test up to the error correction capacity of the code */    for(errors=0;errors <= NROOTS/2;errors++){      /* Load block with random data and encode */      for(i=0;i<NN-NROOTS;i++)	block[i] = random() & NN;      #if defined(CCSDS) || defined(FIXED)      ENCODE_RS(&block[0],&block[NN-NROOTS],0);#else      ENCODE_RS(rs,&block[0],&block[NN-NROOTS]);#endif      /* Make temp copy, seed with errors */      memcpy(tblock,block,sizeof(tblock));      memset(errlocs,0,sizeof(errlocs));      memset(derrlocs,0,sizeof(derrlocs));      erasures=0;      for(i=0;i<errors;i++){	do {	  errval = random() & NN;	} while(errval == 0); /* Error value must be nonzero */	do {	  errloc = random() % NN;	} while(errlocs[errloc] != 0); /* Must not choose the same location twice */	errlocs[errloc] = 1;#if FLAG_ERASURE	if(random() & 1) /* 50-50 chance */	  derrlocs[erasures++] = errloc;#endif	tblock[errloc] ^= errval;      }      /* Decode the errored block */#if defined(CCSDS) || defined(FIXED)      derrors = DECODE_RS(tblock,derrlocs,erasures,0);#else      derrors = DECODE_RS(rs,tblock,derrlocs,erasures);#endif      if(derrors != errors){	PRINTPARM	printf(" decoder says %d errors, true number is %d\n",derrors,errors);	decoder_errors++;      }      for(i=0;i<derrors;i++){	if(errlocs[derrlocs[i]] == 0){	  PRINTPARM	  printf(" decoder indicates error in location %d without error\n",derrlocs[i]);	  decoder_errors++;	}      }      if(memcmp(tblock,block,sizeof(tblock)) != 0){	PRINTPARM	printf(" uncorrected errors! output ^ input:");	decoder_errors++;	for(i=0;i<NN;i++)	  printf(" %02x",tblock[i] ^ block[i]);	printf("\n");      }    }  }  return decoder_errors;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -