📄 ldpc01.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 + -