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

📄 encode.cpp

📁 低密度奇偶校验码硬判决译码算法的c语言实现
💻 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 + -