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

3G开发

开发平台:

C/C++

  1. #ifndef LDPC_1
  2. #define LDPC_1
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <iostream.h>
  7. #include <fstream.h>
  8. #include <ctype.h>
  9. #include <wchar.h>
  10. #include "Utils_1.h"
  11. #include "LDPC_2.h"
  12. #define MAX_LAMBDAS 1000
  13. #define MAX_RHOS    1000
  14. ////////////////////////////////////////////////////////////////////////////
  15. //
  16. // LDPC Code
  17. //
  18. ////////////////////////////////////////////////////////////////////////////
  19. class convolutional_code;
  20. class LDPC_Code
  21. {
  22. public:
  23.   bipartite_graph Graph;
  24.   int lambda_degs[MAX_LAMBDAS + 1];
  25.   double lambda_wts[MAX_LAMBDAS + 1];
  26.   int rho_degs[MAX_RHOS + 1];
  27.   double rho_wts[MAX_RHOS + 1];
  28.   int BlockLength;  // Used in monte-carlo simulations
  29.   mapping MapInUse;
  30.   channel *Channel;
  31.   // For use in encoding
  32.   VariableNodeList Variables;
  33.   CheckNodeList Checks;
  34.   int Systematic, Gap, Triangle;
  35.   matrix GapMatrix, MinusPhiInverse;
  36. public:
  37.   // General functions ----------------------------------------------------
  38.   LDPC_Code( ifstream &File,
  39.              int p_BlockLength = -1,
  40.      channel *p_Channel = NULL );
  41.   LDPC_Code() : 
  42.     BlockLength(-1),
  43.     Channel(NULL) {}
  44.   LDPC_Code &operator=(LDPC_Code &Code);
  45.   void GetFromFile( ifstream &file );
  46.  
  47.   void SetChannel( channel &p_Channel )
  48.   {
  49.      Channel = &p_Channel;
  50.   }
  51.   double sigma_lambda();
  52.   double sigma_rho();
  53.   double Calc_Energy();
  54.   double SumLambda()
  55.     { 
  56.       double sum = 0;
  57.       for (int i = 0; lambda_degs[i] != -1; i++)
  58. sum += lambda_wts[i];
  59.       return sum;
  60.     }
  61.   double SumRho()
  62.     { 
  63.       double sum = 0;
  64.       for (int i = 0; rho_degs[i] != -1; i++)
  65. sum += rho_wts[i];
  66.       return sum;
  67.     }
  68.   double Calc_Symbol_Rate();
  69.   double Calc_Bit_Rate()
  70.   {return Calc_Symbol_Rate() * log((double)GFq::q)/log(2.);   }
  71.   void MakeLambdasValid()   // Make lambdas sum = 1
  72.     {
  73.       double sum = SumLambda();
  74.       for (int i = 0; lambda_degs[i] != -1; i++)
  75. lambda_wts[i] /= sum;
  76.     }
  77.   void MakeRhosValid()   // Make lambdas sum = 1
  78.     {
  79.       double sum = SumRho();
  80.       for (int i = 0; rho_degs[i] != -1; i++)
  81. rho_wts[i] /= sum;
  82.     }
  83.   void GetLambdasWtsFromFile( ifstream &file );
  84.   void GetRhoWtsFromFile( ifstream &file );
  85.   int CountLambdaDegs()
  86.     {
  87.       int count;
  88.       for (count = 0; lambda_degs[count] != -1; count++);
  89.       return count;
  90.     }
  91.   int CountRhoDegs()
  92.     {
  93.       int count;
  94.       for (count = 0; rho_degs[count] != -1; count++);
  95.       return count;
  96.     }
  97.   // Monte Carlo functions -----------------------------------------
  98.   void Init_Messages( vector &ChannelOutput );
  99.   void Leftbound_Iteration( );
  100.   void Rightbound_Iteration( );
  101.   void FinalIteration( );
  102.   double Belief_Propagation_Decoder(int Count_Iterations);
  103.   void GetZeroCodeword( vector &Codeword );
  104.   double Calc_Symbol_Error_Rate();
  105.   double Calc_Rightbound_Symbol_Error_Rate();
  106.   void ResetGraph()
  107.    { 
  108.       Graph.Reset(BlockLength, lambda_degs, lambda_wts, rho_degs, rho_wts, MapInUse); 
  109.       Variables.Init(Graph.variable_nodes, Graph.N);
  110.       Checks.Init(Graph.check_nodes, Graph.M);
  111.    }
  112.   // Encoding ------------------------------------------------------
  113.   double Calc_Source_Coding_Symbol_Rate();
  114.   double Calc_Source_Coding_Bit_Rate();
  115.   void GenerateRandomSystematic();
  116.   void Encode();
  117.   void GenerateEncoder();
  118.   void GenerateEncoder_WithoutGap();
  119. } ;
  120. #endif