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

📄 fec.c

📁 蓝牙模块的2/3FEC接口函数
💻 C
字号:

#include "config.h"

/*  code_bit  */
uint16 g[15]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x100,0x200,0x365,0x1AF,0x35E,0x1D9,0x3B2};

void FEC_code(uint16 *code_in, uint16 *code_out, uint8 len)
{
   uint8  i, j;
   uint16 a, val, code;
   uint16 mid[15];
   uint16 code_bit[15];
   
   for ( ; len > 0 ; len-- ) 
   {
   	   val = *code_in++;
   	   
	   for(i=0;i<15;i++)
	   {
	      a = val&g[i];      
	      for(j=0;j<10;j++)
		  {
	         mid[j] = a&1;
	         a = a>>1;
		  }
	      code_bit[i] = mid[0];
	      
	      for(j=1;j<10;j++)
	      	 code_bit[i] = code_bit[i]^mid[j];
	   }
	   code = 0;
	   for(i=0;i<15;i++)
	   {
	   	   code |= (code_bit[i]<<i);
	   }
	   *code_out++ = code;
	}   	   
}

/* decode and correct */
uint16 check[5]={0x765,0x9AF,0x135E,0x21D9,0x43B2};  /*the check array*/

void FEC_decode(uint16 *code_in, uint16 *code_out, uint8 len)
{ 
  uint8  i, j;
  uint16 a, val, code;
  uint16 mid[15];
  uint16 code_bit[15];  
  uint16 check_out[5];
  uint16 errorflag,matchbit,matchflag,comparebit;
  
  for ( ; len > 0 ; len-- ) 
  {
  	  val = *code_in++; 
  	     
	  a = val;
	  for (i=0;i<15;i++)      /*change the data received into bits*/
	  { 
		 code_bit[i] = a&1;
	     a = a>>1;
	  }

	  for(i=0;i<5;i++)        /*caculate the cheksum*/
	  {  
		 a = val&check[i];
	     for(j=0;j<15;j++)    /*get every bit of a */
		 {
		    mid[j] = a&1;
		    a=a>>1;
		 }
	     check_out[i] = mid[0];
	     for(j=1;j<15;j++)
	        check_out[i]=check_out[i]^mid[j]; /*add the bits in mode 2*/
	  }

	  i=0; 
	  errorflag=0;  
	  do 
	  {
	     if(check_out[i]==1) 
	     { 
	     	errorflag=1; 
	     	i=5;
	     }
	     else 
	     	i++;
	  }
	  while (i<5);     	/* check if the check is all 0 */

	  if (errorflag==1)
	  {   
	  	  i=0;  
	  	  matchbit=100;      /* look for the same line*/
	      do  
		  { 
			  j=0; 
			  matchflag=1;
		      do 
			  { 
				  comparebit=(check[j]>>i)&1; /* get the [j][i] bit of the array*/
		    	  if (check_out[j]!=comparebit) 
				  {
					  j=5;
					  matchflag=0;
				  }                /*not coincident,jump out at once*/
	              else 
	                  j++;
			  } 
	          while (j<5);
		       
			  if (matchflag==1) 
			  {
				 matchbit=i;
				 i=15;
			  }               /*if found,jump out at once*/
		      else 
		         i++;
		   }
	       while (i<15);
	     
		   if (matchbit<=14)
	       {
		        code_bit[matchbit]=code_bit[matchbit]^1;    /*correct the error bit*/
	       }
	    }
	    code = 0;
	    for(i=0;i<10;i++)
	    {
	   	    code |= (code_bit[i]<<i);
	    }
	    *code_out++ = code;
    }
}

⌨️ 快捷键说明

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