?? 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 + -