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

📄 ldpc01.cpp

📁 bpsk 调制
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include <map>
#include <math.h>  
#include <iomanip>

#include "ldpc.h"
#include "bpsk.h"
#include "gauss.h"
#include "mul_GF2.h"
#include "rearrange_bits.h"
#include "awgn.h"
#include "decoder_ldpc_bpsk.h"
#include "extract_message.h"
#include "campare_fram.h"


using namespace std;

void main()
{int i=0,j=0;
int sam=0;
int ix[1]={0},iy[1]={0},ixy[1]={0};
double x=0.0;
double y=0.0;
double N0=0.0005;
int M=48,N=96,K=6,J=3,K0=48;
int ifbits[48]={0};
int chbits[48]={0};
int cdbits[96]={0};
int cdbits_recol[96]={0};
int cdbits_bpsk[96]={0};

int decoded[96]={0};
int codes[48]={0};


//CFile fin("48x48_d_binary.txt",CFile::modeReadWrite);
 ifstream fin("48x48_d_binary.txt",ios::binary);
  fin.read((char *)(&ix),sizeof(int));
  fin.read((char *)(&iy),sizeof(int));
//int *d=new int[ix*iy];
int d[48*48]={0};
   fin.read((char *)(&d),48*48*sizeof(int));
   fin.close(); 
   fin.clear(); 

////编码部分
   int ix_recol=0;
   int iy_recol=0;
fin.open("1x48_rearranged_cols_binary.txt",ios::binary);
 fin.read((char *)(&ix_recol),sizeof(int));
  fin.read((char *)(&iy_recol),sizeof(int));
//int *rearranged_cols=new int[48]; 
  int rearranged_cols[48]={0};
	   fin.read((char *)(&rearranged_cols),sizeof(rearranged_cols));
	   fin.close();
	   fin.clear(); 

fin.open("48000_inforbits_binary02.txt",ios::binary);
ofstream fout("96000_codes_recols.txt",ios::binary);
int FR_num=0;
   while (FR_num<1000) 
   {
		fin.read((char *)(&ifbits),K0*sizeof(int));	
   
// mul_GF2(int C[],int A[],int am,int an ,int B[],int bm,int bn);
   mul_GF2(chbits,d,ix[0],iy[0],ifbits,48,1);  
   
	//得到系统码
	for(i=0;i<48;i++)
	{
		cdbits[i]=chbits[i];
	}
	for(i=ix[0];i<96;i++)
	{
		cdbits[i]=ifbits[i-K0];
	}
  
  //列重排,得到与H相对应的码
      rearrange_bits(cdbits_recol,cdbits,N,rearranged_cols,iy_recol);
  	  fout.write((char *)(&cdbits_recol),N*sizeof(int));
	  FR_num++;
   }
fin.close();
fin.clear();  
fout.close(); 
fout.clear(); 

//调制部分BPSK
fin.open("96000_codes_recols.txt",ios::binary);
fout.open("96000_codes_recols_bpsk.txt",ios::binary);
FR_num=0;
   while (FR_num<1000) 
   {
	   
     fin.read((char *)(&cdbits_recol),N*sizeof(int));	  
     bpsk(cdbits_bpsk,cdbits_recol,N);
     fout.write((char *)(&cdbits_bpsk),N*sizeof(int));
	 FR_num++;
   }
fin.close(); 
fout.close(); 
fin.clear(); 
fout.clear(); 
//通过信道部分awgn(int n0,double a[],int b[],int bn)

fin.open("96000_codes_recols_bpsk.txt",ios::binary);
fout.open("96000_bpsk_awgn.txt",ios::binary);
double b_awgn[96];
int b_awgn_int[96];
FR_num=0;
   while (FR_num<1000) 
   {
	 fin.read((char *)(&b_awgn_int),N*sizeof(int));
	 for(i=0;i<N;i++)
	 {
	   b_awgn[i]=(double)b_awgn_int[i];
	 }
     awgn(N0,b_awgn,N); 	 
     fout.write((char *)(&b_awgn),N*sizeof(double));
	 FR_num++;
   }
fin.close(); 
fout.close(); 
fin.clear(); 
fout.clear(); 
////解码部分
/*
int *ncols=new int[J*N];
int *nrows=new int[K*M];
int *h=new int[M*N];
*/
int ncols[3*96]={0};
int nrows[6*48]={0};
int h[48*96]={0};
//fin.open("96x3_ncol.txt");
fin.open("3x96_ncol_binary.txt",ios::binary);
   fin.read((char *)(&ncols),J*N*sizeof(int));
fin.close();
fin.clear(); 
/*
for(i=0;i<J;i++)
  { for(j=0;j<N;j++)
   cout<<ncols[i*N+j]<<" ";
   cout<<endl;
   }
*/
//fin.open("48x6_nrow.txt");
fin.open("6x48_nrow_binary.txt",ios::binary); 
	   fin.read((char *)(&nrows),K*M*sizeof(int));
fin.close();
fin.clear();   

fin.open("48x96_h_binary.txt",ios::binary);  
	   fin.read((char *)(&h),M*N*sizeof(int));
fin.close(); 
fin.clear(); 

fin.open("96000_bpsk_awgn.txt",ios::binary);
fout.open("48000_decoded_codes.txt",ios::binary);
   FR_num=0;
   while (FR_num<1000)  
   {     fin.read((char *)(&b_awgn),N*sizeof(double));
   
   //decoder_ldpc_bpsk(int iter_max,double sigma,int h[],int nrow[],\\
   //int ncol[],int M,int N,int J,int K,int decoded[],double received[])
   decoder_ldpc_bpsk(5,N0,h,nrows,ncols,48,96,3,6,decoded,b_awgn);
   //extract_message(int codes[],int decoded[],int re_cols[],int N,int M)
   extract_message(codes,decoded,rearranged_cols,N,M);
    fout.write((char *)(&codes),K0*sizeof(int));
    FR_num++;
   }
fin.close(); 
fout.close(); 
fin.clear(); 
fout.clear(); 
//delete []rearranged_cols;
//delete []ncols;
//delete []nrows;
//delete []h;
//计算误码率,误祯率
double bit_error=0;
double bit_error1[1]={0};
double fram_error=0;
double fram_num=0;
double fram_error_sign[1]={0};
double BER=0.0;
double FER=0.0;
fin.open("48000_inforbits_binary02.txt",ios::binary);
ifstream fin2("48000_decoded_codes.txt",ios::binary);

       FR_num=0;
      while (FR_num<1000)  
	  {   
		  fram_error_sign[0]=0;		  
		  fin.read((char *)(&ifbits),K0*sizeof(int));
		  fin2.read((char *)(&codes),K0*sizeof(int));		  
		  fram_num++;
		  //cout<<fram_num<<endl;
		  campare_fram(ifbits,codes,K0,bit_error1,fram_error_sign);		  
		    //1001?
		  if(fram_error_sign[0]==1)
		  {
		  bit_error=bit_error+bit_error1[0];
		  fram_error++; 
		  }
		  FR_num++;
	  }

fin.close(); 
fin2.close();
fin.clear(); 
fin2.clear();  
BER=bit_error/(fram_num*K0);
//bpsk
cout<<"BER="<<BER<<" fram_error="<<fram_error<<" bit_error="<<bit_error<<endl;
}

⌨️ 快捷键说明

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