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

📄 make-ldpc.c

📁 用于LDPC编码译码的仿真实现。包括随机生成校验矩阵、由校验矩阵产生生成矩阵、编码、加随机噪声、译码等内容。原作者是老外
💻 C
📖 第 1 页 / 共 2 页
字号:
  mod2sparse_clear(H);

  for (i=0;i<num_sub_matrix;i++)
  {
	 for (k=0;k<v;k++)
	  {
		  for (j=0;j<3;j++)
		  {
			  row=(int)(fmod(L[i][j]+k,v));
              col=i*v+k;
			  mod2sparse_insert(H, row,col);
		  }
	  }
  }

  
  file = open_file_std(pchk_file,"wb");
  if (file==NULL) 
  { fprintf(stderr,"Can't create parity check file: %s\n",file);
    exit(1);
  }

  intio_write(file,('P'<<8)+0x80);
  
  if (ferror(file) || !mod2sparse_write(file,H) || fclose(file)!=0)
  { fprintf(stderr,"Error writing to parity check file %s\n",file);
    exit(1);
  }

  fclose(file);
  mod2sparse_free(H);
  free(L);

 
}
void make_ldpc_zhj2(char *pchk_file, int v,int num_sub_matrix)
{
  FILE *file;
  int i, j, k;
  int row, col;
  int remainder;
  int **L;
  
  if ((L = (int **) malloc(num_sub_matrix*sizeof(int *))) == NULL)
  {
	printf("Not enough memory to allocate buffer.\n");
	exit(1);
  }
	for (i=0;i<num_sub_matrix;i++)
	{
		if ((L[i]= (int *) malloc(3*sizeof(int))) == NULL)
		{
			printf("Not enough memory to allocate buffer.\n");
			exit(1);
		}
	}

  if (num_sub_matrix>(int)(((v/6)-1)*0.5))
  {
	  fprintf(stderr,"can't construct so many matrices\n");
	  exit(1);
  }

  remainder=(int)(fmod(v,6));
  switch (remainder)
  {
  case 1:
		  for (i=0;i<num_sub_matrix;i++)
		  {
			  L[i][0]=2*i+1;
			  L[i][1]=5*(v/6)-4*i-1;
			  L[i][2]=(v/6)+2*i+1;
		  }
		  break;
  case 3:
		  for (i=0;i<num_sub_matrix;i++)
		  {
			  L[i][0]=2*i+1;
		      L[i][1]=5*(v/6)-4*i+1;
			  L[i][2]=(v/6)+2*i+1;
		  }
		  break;
  case 5:
		  for (i=0;i<num_sub_matrix;i++)
		  {
			  L[i][0]=2*i+1;
			  L[i][1]=5*(v/6)-4*i+2;
			  L[i][2]=(v/6)+2*i+2;
		  }
		  break;
  default: printf("can't construct for such 'v'\n");
  }

  for (i=0;i<num_sub_matrix;i++)
  {
	  L[i][2] = 0;
	  L[i][0] = (int) (fmod(L[i][2]+L[i][0],v));
	  L[i][1] = (int) (fmod(L[i][0]+L[i][1],v));
  }

  H = mod2sparse_allocate(M,N);
  mod2sparse_clear(H);

  for (i=0;i<num_sub_matrix;i++)
  {
	 for (k=0;k<v;k++)
	  {
		  for (j=0;j<3;j++)
		  {
			  row=(int)(fmod(L[i][j]+k,v));
              col=i*v+k;
			  mod2sparse_insert(H, row,col);
		  }
	  }
  }

  
  file = open_file_std(pchk_file,"wb");
  if (file==NULL) 
  { fprintf(stderr,"Can't create parity check file: %s\n",file);
    exit(1);
  }

  intio_write(file,('P'<<8)+0x80);
  
  if (ferror(file) || !mod2sparse_write(file,H) || fclose(file)!=0)
  { fprintf(stderr,"Error writing to parity check file %s\n",file);
    exit(1);
  }

  fclose(file);
  mod2sparse_free(H);
  free(L);

}

/* CREATE A SPARSE PARITY-CHECK MATRIX.  Of size M by N, stored in H. */

void make_ldpc_KTS(char *pchk_file, int q,int num_sub_matrix)
{
  FILE *file;
  int i, j, k,i1;
  int row, col;
  int sqq,v=3*q,m = (q-1)/6;
  int **L, **L_add;  /**  存储所有的差分集  **/
  int *factor,factor_i;
  int num_class,prime,order, num;
  double temp;


   if ((factor = (int *) malloc((int)(q*0.5)*sizeof(int))) == NULL)
  {
	printf("Not enough memory to allocate buffer.\n");
	exit(1);
  } 
  
  if ((L = (int **) malloc((6*m+1)*sizeof(int *))) == NULL)
  {
	printf("Not enough memory to allocate buffer.\n");
	exit(1);
  } 
  for (i=0;i<(6*m+1);i++)
  {
	if ((L[i]= (int *) malloc(3*sizeof(int))) == NULL)
	{
		printf("Not enough memory to allocate buffer.\n");
		exit(1);
	}
  }

  if ((L_add = (int **) malloc((3*m)*sizeof(int *))) == NULL)
  {
	printf("Not enough memory to allocate buffer.\n");
	exit(1);
  } 
  for (i=0;i<(3*m);i++)
  {
	if ((L_add[i]= (int *) malloc(3*sizeof(int))) == NULL)
	{
		printf("Not enough memory to allocate buffer.\n");
		exit(1);
	}
  }

  if (num_sub_matrix>(int)(9*m+1))
  {
	  fprintf(stderr,"can't construct so many matrices\n");
	  exit(1);
  }
  /*judge q is or not prime number*/
  sqq = (int) (sqrt(q));

  for (i1=2;i1<=sqq;i1++)
  {
	  if (q%i1==0)
	  {
		  printf("q is not a prime number\n");
		  break;
	  }
  }

  if (i1 > sqq) // q is a prime number
  { /*look for a primitive element of GF(q)*/

	  /* 1. 找出q-1的因子*/
	  factor_i = 2;
	  while ((q-1)%factor_i!=0 && (factor_i<(q-1)))
		  factor_i++;
	  if (factor_i<(q-1))
	  {
		  factor[0]=factor_i;
	      factor[1]=(q-1)/factor_i;
		  num=2;
	  }
	  else
	  {
		  factor[0]=q-1;
		  num=1;
	  }
	  for (i=factor_i+1;i<factor[num-1];i++)
	  {
		  if ((q-1)%i==0)
		  {
			  factor[num]=i;
			  factor[num+1]=(q-1)/i;
			  num+=2;
		  }
	  }

	  /*本原元*/
	  
	  order=0; i=2;

	  while ((i<q) && (order != q-1))
	  {
		  j=0;
		  while ((j<num) && (order==0))
		  {
			  if ((int)(fmod((int)(pow(i,factor[j])),q))==1)
				  order = factor[j];
			  j++;
		  }
		  if (order==0)
			  order=q-1;
		  else
			  order=0;
		  i++;
	  }

	  prime = i-1; /** 本原元 **/

	  L[0][0]=0;
	  L[0][1]=0;
	  L[0][2]=0;

	  k=1;

	  for (i=1;i<=m;i++)
	  {
		  for (j=0;j<3;j++)
		  {
  			  temp=pow(prime,(i+m)); //以防太大用整型越界
			  L[k][j]=(int)(fmod(temp,q));

			  temp=pow(prime,(i+3*m));
			  L[k][(int)(fmod(j+1,3))]=(int)(fmod(temp,q));

			  temp=pow(prime,(i+5*m));
			  L[k][(int)(fmod(j+2,3))]=(int)(fmod(temp,q));
			  k++;
		  }
	  }

      for (i=1;i<=m;i++)
	  {
		  for (j=0;j<3;j++)
		  {
			  temp=pow(prime,i);
			  L[k][j]=(int)(fmod(temp,q));

			  temp=pow(prime,i+2*m);
			  L[k][(int)(fmod(j+1,3))]=(int)(fmod(temp,q));

			  temp=pow(prime,i+4*m);
			  L[k][(int)(fmod(j+2,3))]=(int)(fmod(temp,q));
			  k++;
		  }
	  }

	  k=0;
	  for (i=1;i<=m;i++)
	  {
		  for (j=0;j<3;j++)
		  {
			  temp=pow(prime,i);
			  L_add[k][0]=(int)(fmod(temp,q));

			  temp=pow(prime,i+2*m);
			  L_add[k][1]=(int)(fmod(temp,q));

			  temp=pow(prime,i+4*m);
			  L_add[k][2]=(int)(fmod(temp,q));
			  k++;
		  }
	  }

      H = mod2sparse_allocate(M,N);
      mod2sparse_clear(H);

	  num_class = num_sub_matrix< (6*m+1)?num_sub_matrix:6*m+1;

      for (i=0;i<num_class;i++)
	  {
		  for (k=0;k<q;k++)
		  {
			  for (j=0;j<3;j++)
			  {
				  row=(int)(fmod(L[i][j]+k,q))+j*q;
                  col=i*q+k;
			      mod2sparse_insert(H, row,col);
			  }
		  }
	  }

	  if (num_sub_matrix> num_class)
	  {
		  for (i=0;i<num_sub_matrix;i++)
		  {
			  for (k=0;k<q;k++)
			  {
				  col++;
				  for (j=0;j<3;j++)
				  {
					  row=(int)(fmod(L_add[i][j]+k,q))+i*q;
			          mod2sparse_insert(H, row,col);
				  }
			  }
		  }
	  }
	  
	 

  
  file = open_file_std(pchk_file,"wb");
  if (file==NULL) 
  { fprintf(stderr,"Can't create parity check file: %s\n",file);
    exit(1);
  }

  intio_write(file,('P'<<8)+0x80);
  
  if (ferror(file) || !mod2sparse_write(file,H) || fclose(file)!=0)
  { fprintf(stderr,"Error writing to parity check file %s\n",file);
    exit(1);
  }

  fclose(file);
  mod2sparse_free(H);
  }

   free(L);
   free(L_add);
   free(factor);

 
}



void make_ldpc_B3G(char *pchk_file, double *lamita, int Dlmax,double *lao,int Drmax, int seed)
{
  FILE *file;
  int i, j;
  int col,temp;
  int *rand_row,*bit_degree,*check_degree;
  
  rand_row = chk_alloc(M,sizeof *rand_row);
  check_degree = chk_alloc(M,sizeof *check_degree);
  bit_degree = chk_alloc(N,sizeof *bit_degree);

  rand_int_num( rand_row, M, seed);		


  for (i=0;i<2694;i++)
	  bit_degree[i]=3-1;

  for (i=2694;i<2713;i++)
	  bit_degree[i]=4-1;

  for (i=2713;i<2987;i++)
	  bit_degree[i]=6-1;

  for (i=2987;i<3749;i++)
	  bit_degree[i]=7-1;

  for (i=3749;i<3906;i++)
	  bit_degree[i]=8-1;

  for (i=3906;i<3914;i++)
	  bit_degree[i]=19-1;

  for (i=3914;i<4420;i++)
	  bit_degree[i]=20-1;

  for (i=4420;i<8801;i++) // 一个校验比特放在对角线上
	  bit_degree[i]=2-1;

  for (i=8801;i<8840;i++)
	  bit_degree[i]=3-1;

  for (i=0;i<5;i++)
	  check_degree[rand_row[i]]=7-2;

  for (i=5;i<4233;i++)
	  check_degree[rand_row[i]]=8-2;

  for (i=4233;i<4420;i++)
	  check_degree[rand_row[i]]=9-2;

  H = mod2sparse_allocate(M,N);
  mod2sparse_clear(H);

  for (i=0;i<4420;i++)
  {
	  mod2sparse_insert(H, i, i);
	  mod2sparse_insert(H, i, i+4420);
  }

  for (i=0;i<404;i++)
  {
	  for (j=0;j<check_degree[rand_row[i]];j++)
	  {
		  col =(i+1+ (j+1) * (int) (floor((4420 + i+1)/check_degree[rand_row[i]])))%8840;
		  if ((mod2sparse_find(H, i,col)) || (bit_degree[col] == 0))
		  {
			  temp = 0;
              col = 5;
              while ( temp == 0 )
			  {
				  if ((mod2sparse_find(H, rand_row[i],col)) || (bit_degree[col] == 0))
				  {
					  temp=0;
				  }
				  else
				  {
					  mod2sparse_insert(H, rand_row[i], col);
				  	  bit_degree[col] = bit_degree[col] - 1;
                      temp = 1;
				  }
				  col = col+1;
			  }
		  }
		 else
		 {
			 mod2sparse_insert(H, rand_row[i], col);
			 bit_degree[col]= bit_degree[col] - 1;
 
		  }
	  }
  }

  for (i=404;i<4420;i++)
  {
	  for (j=0;j<check_degree[rand_row[i]];j++)
	  {
		  col = (i+1+3906 + j * (int) (floor((4420 + i+1)/check_degree[rand_row[i]])))%8840;
		  if ((mod2sparse_find(H, i,col)) || (bit_degree[col] == 0))
		  {
			  temp = 0;
              col = (j%2+1)*4420-1;
              while ( temp == 0 )
			  {
				  if ((mod2sparse_find(H, rand_row[i],col)) || (bit_degree[col] == 0))
				  {
					  temp=0;
				  }
				  else
				  {
					  mod2sparse_insert(H, rand_row[i], col);
				  	  bit_degree[col] = bit_degree[col] - 1;
				//	  printf("%d  ",col);
                      temp = 1;
				  }
				  col = col-1;
			  }
		  }
		  else
		  {
			 mod2sparse_insert(H, rand_row[i], col);
			 bit_degree[col] = bit_degree[col] - 1;
          //   printf("%d  ",col);
		  }
	  }
	 // printf("\n");
	 	  
  }
	  
  file = open_file_std(pchk_file,"wb");
  if (file==NULL) 
  { fprintf(stderr,"Can't create parity check file: %s\n",file);
    exit(1);
  }

  intio_write(file,('P'<<8)+0x80);
  
  if (ferror(file) || !mod2sparse_write(file,H) || fclose(file)!=0)
  { fprintf(stderr,"Error writing to parity check file %s\n",file);
    exit(1);
  }



  /* Create the initial version of the parity check matrix. */

// make sp martrix acording the position matrix
  fclose(file);
  mod2sparse_free(H);

 
}


⌨️ 快捷键说明

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