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

📄 girth.c

📁 density evolution for LDPC codes design and some related documents
💻 C
字号:
/*  	FILENAME: girth.c  	AUTHOR: Tadashi Wadayama	HOW TO MAKE:	gcc -O2 -o girth girth.c*/#include <stdio.h>#include <stdlib.h>#define INFINITY 10000000int n;int m;int rmax;int cmax;int *row_weight;int *col_weight;int **row_list;int **col_list_r;int **col_list_c;int *vf;int *cf;int g;				/* girth */int local_g;int local_g_hist[30];void init_BP(FILE *fp){/**********************************************************************************/// initialization of BP decoder/**********************************************************************************/  int i,j;  int v;  int *counter;// read parity check matrix   fscanf(fp,"%d %d\n",&n,&m);	// n:code length, m:number of parity checks  fscanf(fp,"%d %d\n",&rmax,&cmax); // rmax:maximum number of row weight				    // cmax:maximum number of column weight  row_weight = malloc(sizeof(int)*m); // array for row weight profile  for (i = 0; i <= m-1; i++) fscanf(fp,"%d",&row_weight[i]);  col_weight = malloc(sizeof(int)*n); // array for column weight profile  for (i = 0; i <= n-1; i++) fscanf(fp,"%d",&col_weight[i]);  counter = malloc(sizeof(int)*n);   for (i=0; i <= n-1; i++) counter[i] = 0;    row_list = malloc(sizeof(int*)*m); // parity check matrix in row form  for (i=0;i<=m-1;i++) row_list[i] = malloc(sizeof(int)*rmax);  col_list_r = malloc(sizeof(int*)*n);   for (i=0;i<=n-1;i++) col_list_r[i] = malloc(sizeof(int)*cmax);  col_list_c = malloc(sizeof(int*)*n);   for (i=0;i<=n-1;i++) col_list_c[i] = malloc(sizeof(int)*cmax);// set up for parity check matrix  for (j = 0; j <= m-1; j++) {    for (i = 0; i <= row_weight[j]-1; i++) {      fscanf(fp,"%d",&v);      v--;      row_list[j][i] = v;      col_list_r[v][counter[v]] = j;      col_list_c[v][counter[v]] = i;      counter[v]++;    }  }  vf = malloc(sizeof(int)*n);  cf = malloc(sizeof(int)*m);}int visit_cnode(int c, int len){  int i;  int v;  if (len > 12) return;  //printf(">>>>> c = %d\n",c);  //printf("vf = ");  //for (i = 0; i<= n-1; i++) printf("%d ",vf[i]);  //printf("\n");  //printf("cf = ");  //for (i = 0; i<= m-1; i++)  printf("%d ",cf[i]);  //printf("\n");      for (i = 0; i <= row_weight[c]-1; i++) {    v = row_list[c][i];    if (vf[v] >= len+1) {      vf[v] = len+1;      visit_vnode(v,len+1);    }    else {      if (vf[v] == -1) {	//printf("loop!! ");	//printf("len = %d\n",len+1);	if ((len+1 > 2)&&(len+1 < g)) {	  g = len+1;	}	if ((len+1 > 2)&&(len+1 < local_g)) {	  local_g = len+1;	}      }    }  }}int visit_vnode(int v, int len){  int i;  int c;  if (len > 12) return;  //printf("v = %d\n",v);  for (i = 0; i <= col_weight[v]-1; i++) {        c = col_list_r[v][i];    if (cf[c] >= len+1) {      cf[c] = len+1;      visit_cnode(c,len+1);    }  }}int girth(){  int i;  int v;  g = INFINITY;  for (v = 0; v <= n-1; v++) {    printf("======= start node = %d =====\n",v);    for (i = 0; i<= n-1; i++) vf[i] = INFINITY;    for (i = 0; i<= m-1; i++) cf[i] = INFINITY;    vf[v] = -1;			/* start variable node */    local_g = INFINITY;    visit_vnode(v,0);    if (local_g < 29) local_g_hist[local_g]++;    printf("local girth = %d\n",local_g);    //printf("vf = ");    //for (i = 0; i<= n-1; i++) printf("%d ",vf[i]);    //printf("\n");    //printf("cf = ");    //for (i = 0; i<= m-1; i++)  printf("%d ",cf[i]);    //printf("\n");  }  return g;}int main(int argc,char **argv){  FILE* fp;  int i;    if (argc != 2) {    printf("usage : girth spmatfile\n");    exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL) {    fprintf(stderr,"Can't open spmatfile.\n");    exit(-1);  }  init_BP(fp);    for (i = 0; i <= 29; i++) local_g_hist[i] = 0;  printf("girth = %d\n",girth());  for (i = 0; i <= 29; i++) printf("%d %d\n",i,local_g_hist[i]);}

⌨️ 快捷键说明

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