📄 encode.cpp
字号:
// encode.cpp : Defines the entry point for the console application.
//根据hb矩阵和信息位来产生码子
//编码main程序
//参考请见E:\En_Decode\LDPC\TDMP\C_ldpc\我的修改\combined_ldpc_mod2\我的修改
/*
编码步骤:
1.读入h矩阵的信息;
2.由随机数函数,生成信息位序列;
3.根据以上信息进行子矩阵的乘积和求和,由此得出校验位序列;
4.把信息位和校验位连接即可得到码字序列;
*/
#include "head.h"
/**********************文件矩阵的读入,16*32的H矩阵****************************/
int read_file_h(int* &h,char *filename,int &row,int &col, int &num)//引用作为函数形参
{
int i,j;
FILE *inputH;
if((inputH=fopen(filename,"r"))==NULL)
{
printf("can not open the input symbol degree distribution file!\n");
return 0;
}
fscanf(inputH,"%d",&row);//从磁盘文件上读入数据行数,列数
fscanf(inputH,"%d",&col);
fscanf(inputH,"%d",&num);//num 是移位数
h=new int[row*col];//开辟一个存放整型数组的空间,该组有row*col个元素,返回一个指向整型数据的指针,h为指针
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
fscanf(inputH,"%d",&h[i*col+j]);//读取矩阵各元素
}
fclose(inputH);
return 1;
}
/**********************用来生成信息序列****************************/
//这两种方法都可以
/*
void inf_bit_generater(int *inf_bit,int inf_length)//随机生成
{
int i;
srand((unsigned)time(NULL));//???
for (i=0;i<inf_length;i++)
{
inf_bit[i]=rand()%2;//rand()用来产生-90到32767之间的随机整数,%2后产生0,1之间的一个数
}
}
*/
void inf_bit_generater(int *inf_bit,int inf_length)//人为输入
{
int i;
//srand((unsigned)time(NULL));//???
//for (i=0;i<inf_length;i++)
// {
//inf_bit[i]=(i%4==0); //rand()%2
//}
for(i=0;i<inf_length/4;i++)
{
inf_bit[i*4]=1;
inf_bit[i*4+1]=1;
inf_bit[i*4+2]=1;
inf_bit[i*4+3]=1;
}
}
/**********************用来生成校验序列****************************/
//由移位数num得到对应的子矩阵
void conver(int num,int *matrix,int length)//matrix[length*length]128*128
{
int i,j,one_position;
if(num==-1)
{
for(i=0;i<length;i++)
for(j=0;j<length;j++)
matrix[i*length+j]=0;//移位数-1代表子矩阵是0阵,移位数0代表子矩阵是单位阵
}
else
{
for(i=0;i<length;i++)//由右移位数num来恢复出对应的子矩阵
{
one_position=(i+num)%length;//子矩阵第一行的j等于右移位数num
for(j=0;j<length;j++)
{
if(one_position==j)
matrix[i*length+j]=1;
else
matrix[i*length+j]=0;
}
}
}
}
//实现两个矩阵的求和
void matrix_and(int* matrix_1,int* matrix_2,int length)//matrix1[length*length],matrix2[length*length]
{
int i,j;
for(i=0;i<length;i++)
for(j=0;j<length;j++)//把两个矩阵的对应元素相加
matrix_1[i*length+j]=matrix_1[i*length+j]+matrix_2[i*length+j];
}
//先移位个数转化为对应的子矩阵,再相加,并且把生成的结果保存在matrix1中
void num_marker_matrix_and(int* matrix1,int length,int num)//matrix1,matrix2都是子矩阵
{
int * matrix2;
matrix2=new int[length*length];
conver(num,matrix2,length);//在哪?第一个,
matrix_and(matrix1,matrix2,length);//两个矩阵的求和
delete []matrix2;//撤消空间
}
//实现对所要求的列的矩阵进行求和,所要求的行以下进行求和运算
void col_matrix_and(int* h,int* matrix,int length,int row,int col,int col_position,int row_position)
{
int i,j,num;
for(i=0;i<length;i++)
for(j=0;j<length;j++)
matrix[i*length+j]=0;//matrix[]=128*128
for(i=row_position;i<row;i++)//h[]:16*32
{
num=h[i*col+col_position];
if(num!=-1)//-1代表0单位阵
num_marker_matrix_and(matrix,length,num);//求h矩阵中row_position到row行,某一列col_position的p之和。
}
}
//这里的code是长度为length的矢量,初始值为0
void matrix_muti_inf(int* matrix,int* inf_bit,int* code,int col_position,int length,int row,int* check_bit)
{
int i,j;
for(i=0;i<length;i++)
for(j=0;j<length;j++)
{
if(col_position<row)
code[i]=(code[i]+matrix[i*length+j]*inf_bit[col_position*length+j])%2;//P*U(i)
else
code[i]=(code[i]+matrix[i*length+j]*check_bit[j])%2;//P*V(0)
}
}
void encode(int* h,int* inf_bit,int row,int col,int length,int* code,int check_bit_pisition,int* check_bit)
{
int i,j,temp_row;
int* temp_matrix;
temp_matrix=new int[length*length];
for(i=0;i<length;i++)
code[i]=0;
//若从0行开始,通过循环求所有的P*U(i),P*V(0)的加和
//若从非0的row positon行开始,通过循环求从row positon行开始的所有的P*U(i)
if(check_bit_pisition!=0)//??//and函数的row positon
temp_row=row+1;//???
else
temp_row=row;
for(j=0;j<temp_row;j++)//j为上面的col position
{
// col_matrix_and,matrix_muti_inf这两个函数不能交换位置,在所有的P相加之后,才能乘U(i)
col_matrix_and(h,temp_matrix,length,row,col,j,check_bit_pisition);//通过循环,求所有的P*U(i),P*V(i)的加和,即(P-)*V(0)的值
matrix_muti_inf(temp_matrix,inf_bit,code,j,length,row,check_bit);//求P*U(i)和P*V(0)
}
delete []temp_matrix;
}
/*
//把校验位,信息位写入到文件中
int putin_file(int* inf_bit,int* check_code,int length,int row,char* filename)
{
int i,j;
FILE *inputH;
if((inputH=fopen(filename,"w"))==NULL)
{
printf("can not open the input symbol degree distribution file!\n");
return 0;
}
fprintf(inputH,"%s","信息位是:\n");
for(i=0;i<row;i++)//输出信息位
{
for(j=0;j<length;j++)
fprintf(inputH,"%d\t",inf_bit[i*length+j]);//\t为水平制表符
fprintf(inputH,"\n");
}
fprintf(inputH,"%s","校验位是:\n");
for(i=0;i<row;i++)//输出校验位
{
for(j=0;j<length;j++)
fprintf(inputH,"%d\t",check_code[i*length+j]);//输出校验位
fprintf(inputH,"\n");
}
fclose(inputH);
return 1;
}
void num_to_position(int * store_h,int num,int num_i,int num_j,int length,int col_sum,int store_h_col)
{
int i;
for(i=0;i<length;i++)
{
store_h[(num_i*length+i)*store_h_col+col_sum]=(num++)%length+num_j*length;
}
}
void fill_negative_one(int *store_h,int length,int i_position,int col_sum,int store_h_col)
{
int i;
for(i=0;i<length;i++)
{
store_h[(i_position*length+i)*store_h_col+col_sum]=-1;
}
}
void h_conver_to_compress(int *h, int *store_h,int length,int row,int col,int store_h_row,int store_h_col)
{
int i,j;
int temp,col_sum;
for(i=0;i<row;i++)
{
col_sum=0;
for(j=0;j<col;j++)
{
temp=h[i*col+j];
if(temp!=-1)
{
num_to_position(store_h,temp,i,j,length,col_sum,store_h_col);
col_sum++;
}
}
while(col_sum<store_h_col)
{
fill_negative_one(store_h,length,i,col_sum,store_h_col);
col_sum++;
}
}
}
int put_h_into_file(int *h,char *filename,int length,int row,int col)
{
int i,j;
int store_h_row,store_h_col;
int *store_h;
FILE *inputH;
store_h_row=row*length;
store_h_col=7;//7????
store_h=new int[store_h_row*store_h_col];
h_conver_to_compress(h,store_h,length,row,col,store_h_row,store_h_col);
if((inputH=fopen(filename,"w"))==NULL)
{
printf("can not open the input symbol degree distribution file!\n");
return 0;
}
for(i=0;i<store_h_row;i++)
{
for(j=0;j<store_h_col;j++)
fprintf(inputH,"%d\t",store_h[i*store_h_col+j]);
fprintf(inputH,"\n");
}
delete []store_h;
fclose(inputH);
return 1;
}
/*
/**********************生成编码码字,main中调用这个****************************/
void main()
{
int *matrix,*inf_bit,*h, *check_code,*check_code_one;
int length;
int i, j;
int row,col;
int check_num;
char filename[20];
int encode_sq[70000];
int encode_length;
FILE *fp;
//scanf("%s",filename);
sprintf(filename,"Hb.txt");//?????
read_file_h(h,filename,row,col,length);//文件矩阵h的读入
encode_length=col*length;
matrix=new int[length*length];//给各个矩阵开辟存储空间
inf_bit=new int[row*length];
check_code_one=new int[length];
check_code=new int[length*row];
inf_bit_generater(inf_bit,row*length);//信息位的随机生成
for(i=1;i<row-1;i++)//在第2行-15行之间的v(0)对应的那一列,搜索其中不为-1的那个num,即P-1
{
if(h[i*col+row]!=-1)
check_num=h[i*col+row];//check_num??//
}
for(i=0;i<row;i++)//P109=P19,//校验位的生成
{
encode(h,inf_bit,row,col,length,check_code_one,i,check_code);//i即上面的check_bit_pisition,即row position
if(i==0)//v(0)
for(j=0;j<length;j++)
check_code[i*length+j]=check_code_one[(length-check_num+j)%length];//encode里面的code
else//v(i)
for(j=0;j<length;j++)
check_code[i*length+j]=check_code_one[j];
}
// sprintf(filename,"h_compress_store.txt");
// put_h_into_file(h,filename,length,row,col);
//把码字写入到文件code.txt中
if ((fp=fopen("code.txt","w"))==NULL)
{
printf("can't open file code.txt \n");
exit(1);
}
for(i=0;i<encode_length;i++)//encode_sq为码字序列
{
if(i<encode_length/2)//encode_length/2=2048
encode_sq[i]=inf_bit[i];//把信息位的0-2047赋给码字的0-2047
else
encode_sq[i]=check_code[i-encode_length/2];//把校验位的0-2047赋给码字的2048-4095
if(i%128==0)
{
fprintf(fp,"\n");
printf("\n");
}
fprintf(fp,"%d",encode_sq[i]);
printf("%d",encode_sq[i]);
}
fclose (fp);
delete []check_code_one;//撤消空间
delete []check_code;
delete []h;
delete []inf_bit;
delete []matrix;
printf("\n\n\n");
}
/*
int main(int argc, char* argv[])
{
int encode_sq[4096];
int encode_length=4096;
generate_code(encode_sq,encode_length);
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -