Main.cpp
上传用户:speoil
上传日期:2021-10-06
资源大小:100k
文件大小:6k
源码类别:

3G开发

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <iostream.h>
  5. #include <fstream.h>
  6. #include <ctype.h>
  7. #include "LDPC_1.h"
  8. #include "LDPC_2.h"
  9. #include "Utils_1.h"
  10. BOOLEAN debug = TRUE;
  11. /*****************************************************************************
  12.  *
  13.  * MAIN
  14.  *
  15.  *****************************************************************************/
  16. int main(int argc, char **argv)
  17. {
  18.   //-------------------------------------------------------------------
  19.   // Command line arguments
  20.   //-------------------------------------------------------------------
  21.   int iterations = 5000;
  22.   char infilename[100];
  23.   int BlockLength = 50000;
  24.   int count_runs = 100;
  25.   char ChannelType = 'G'; 
  26.   char *CurrentOption;
  27.   channel *Channel;
  28.   char *OutputLogFileName = "results.txt";
  29.   unsigned seed = RandomSeed();
  30.   if (argc < 3)
  31.     {
  32.       ReportBuf.OpenFile(OutputLogFileName);
  33.       cout << "usage: "
  34.    << argv[0] << " <input file> <SNR (dB)/crossover> {<options>}n"
  35.            << "Options: n"
  36.            << "   -c : Channel (G)aussian, (B)SC default: " << ChannelType << "n"
  37.            << "   -i : maximum iterations, default: " << iterations  << "n"
  38.    << "   -b : block length, default: " << BlockLength << "n"
  39.            << "   -r : number of runs, default: " << count_runs << "n"
  40.            << "   -s : seed (default = random, based on time)n"
  41.            << "   -o : output log file, "err" means direct to stderr, default: " << OutputLogFileName << "n";
  42.       return -1;
  43.     }
  44.   sscanf(argv[1], "%s", infilename);
  45.   for (int i = 3; i < argc; i++)
  46.   {
  47.      CurrentOption = argv[i];
  48.      if (CurrentOption[0] != '-')
  49.      {
  50.         cout << "Invalid command line parameter #" << i << ": " << CurrentOption << "n";
  51.         exit(1);
  52.      }
  53.      switch(CurrentOption[1])
  54.      {
  55.      case 'c':
  56.         ChannelType = CurrentOption[2];
  57.         break;
  58.      case 'i':
  59.         sscanf(CurrentOption + 2, "%d", &iterations);
  60.         break;
  61.      case 'b':
  62.         sscanf(CurrentOption + 2, "%d", &BlockLength);
  63.         break;
  64.      case 'r':
  65.         sscanf(CurrentOption + 2, "%d", &count_runs);
  66.         break;
  67.      case 's':
  68.         sscanf(CurrentOption + 2, "%d", &seed);
  69.         break;
  70.      case 'o':
  71.         OutputLogFileName = CurrentOption + 2;
  72.         break;
  73.      default:
  74.         cout << "Invalid option#" << i << ": " << CurrentOption << "n";
  75.         exit(1);
  76.      }
  77.   }
  78.   //-------------------------------------------------------------
  79.   // Log file
  80.   //-------------------------------------------------------------
  81.   ReportBuf.OpenFile(OutputLogFileName);
  82.   //-------------------------------------------------------------
  83.   // Init seed
  84.   //-------------------------------------------------------------
  85.   my_srand(seed);
  86.   
  87.   //-------------------------------------------------------------------
  88.   // Code
  89.   //-------------------------------------------------------------------
  90.   ifstream DefinitionFile;
  91.   DefinitionFile.open(infilename);
  92.   if (!DefinitionFile)
  93.   {
  94.       cout << "Error opening file " << infilename << "n";
  95.       exit(1);
  96.   }
  97.   
  98.   LDPC_Code Code(DefinitionFile, BlockLength);
  99.   //-------------------------------------------------------------
  100.   // Handle channel
  101.   //-------------------------------------------------------------
  102.   double channel_p;
  103.   double noise_sigma;
  104.   double SNR_dB, No, SNR;
  105.   switch(ChannelType)
  106.   {
  107.   case 'G':
  108.      noise_sigma = 0;         // To avoid compiler warning
  109.      Channel = new AWGN_Channel;
  110.      sscanf(argv[2], "%lf", &SNR_dB);
  111.      SNR = pow(10., SNR_dB / 10.);
  112.      No = 1./SNR;
  113.      noise_sigma = sqrt(No);
  114.      ((AWGN_Channel*)Channel)->SetNoiseSigma(noise_sigma);
  115.      break;
  116.   case 'B':
  117.      Channel = new BSC_Channel;
  118.      sscanf(argv[2], "%lf", &channel_p);
  119.    
  120.      ((BSC_Channel*)Channel)->SetChannel_p(channel_p);
  121.      break;
  122.   default:
  123.      cout << "Invalid channel selectionn";
  124.      exit(1);
  125.   }
  126.   // Connect channel with code
  127.   Code.SetChannel(*Channel);
  128.   Channel->ProcessMapping(Code);
  129.   //-------------------------------------------------------------------
  130.   // Print channel data
  131.   //-------------------------------------------------------------------
  132.   double Rate = Code.Calc_Symbol_Rate();
  133.   cout << "----------------------------------------------------------------------------n"
  134.        << "Symbol Rate = " << Rate 
  135.        << " Bit Rate = " << Code.Calc_Bit_Rate()
  136.        << " Iterations = " << iterations
  137.        << "nSum Lambda = " << Code.SumLambda()
  138.        << " Sum Rhos = " << Code.SumRho() 
  139.        << " Block length = " << BlockLength
  140.        << " Channel = " << ChannelType 
  141.        << "nSeed = " << seed
  142.        << "n";
  143.   Channel->PrintChannelData(Code);
  144.   cout << "n----------------------------------------------------------------------------n";
  145.   
  146.   //------------------------------------------------------------------------
  147.   // Go
  148.   //------------------------------------------------------------------------
  149.   double AccumulatedSER;
  150.   vector Codeword, ChannelOutput;
  151.   AccumulatedSER = 0;
  152.   for (int i = 0; i < count_runs; i++)
  153.   {
  154. Code.ResetGraph();
  155.     Code.GetZeroCodeword( Codeword );
  156. Channel->SimulateOutputVector( Codeword, ChannelOutput );
  157.     Code.Init_Messages( ChannelOutput );
  158. AccumulatedSER += Code.Belief_Propagation_Decoder(iterations);
  159.   }
  160.   //------------------------------------------------------------------------
  161.   // return OK
  162.   //------------------------------------------------------------------------
  163.   delete Channel;
  164.   return 0;
  165. }