Go to the documentation of this file.00001 #include <itpp/itcomm.h>
00002
00003 using namespace std;
00004 using namespace itpp;
00005
00006 extern int main(int argc, char **argv)
00007 {
00008 int Nbits=1000*1000*5000;
00009 int Nbers=2000;
00010 double BERmin=1e-6;
00011 vec EbN0db = "0.6:0.2:5";
00012
00013 LDPC_Code C(argv[1]);
00014 bool single_snr_mode=false;
00015 if (argc==3) {
00016 double x;
00017 sscanf(argv[2],"%lf",&x);
00018 EbN0db.set_size(1);
00019 EbN0db(0)=x;
00020 single_snr_mode=true;
00021 }
00022
00023 cout << "Running with Eb/N0: " << EbN0db << endl;
00024
00025
00026 C.setup_decoder("bp","2500 1 0");
00027
00028
00029
00030
00031 cout << C << endl;
00032
00033 int N = C.get_nvar();
00034 BPSK Mod;
00035 bvec bitsin = zeros_b(N);
00036 vec s = Mod.modulate_bits(bitsin);
00037
00038 RNG_randomize();
00039 for (int j=0; j<length(EbN0db); j++) {
00040
00041 double N0 = pow(10.0,-EbN0db(j)/10.0) / C.get_rate();
00042 AWGN_Channel chan(N0/2);
00043 BERC berc;
00044 BLERC ferc;
00045 ferc.set_blocksize(N);
00046 for (long int i=0; i<Nbits; i+=C.get_nvar()) {
00047
00048 vec x = chan(s);
00049
00050
00051 vec softbits=Mod.demodulate_soft_bits(x,N0);
00052
00053
00054 bvec bitsout=C.decode(softbits);
00055
00056
00057 berc.count(bitsin,bitsout);
00058 ferc.count(bitsin,bitsout);
00059
00060 if (single_snr_mode) {
00061 cout << "Eb/N0=" << EbN0db(j) << " Simulated "
00062 << ferc.get_total_blocks() << " frames and "
00063 << berc.get_total_bits() << " bits. "
00064 << "Obtained " << berc.get_errors() << " bit errors. "
00065 << " BER: " << berc.get_errorrate()
00066 << " FER: " << ferc.get_errorrate() << endl;
00067 cout.flush();
00068 } else {
00069 if (berc.get_errors()>Nbers) { break;}
00070 }
00071 }
00072
00073 cout << "Eb/N0=" << EbN0db(j) << " Simulated "
00074 << ferc.get_total_blocks() << " frames and "
00075 << berc.get_total_bits() << " bits. "
00076 << "Obtained " << berc.get_errors() << " bit errors. "
00077 << " BER: " << berc.get_errorrate()
00078 << " FER: " << ferc.get_errorrate() << endl;
00079 cout.flush();
00080 if (berc.get_errorrate()<BERmin) { break; }
00081 }
00082 return 0;
00083 }