📄 make-ldpc.c
字号:
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 + -