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

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 "LDPC_1.h"
  7. #include "LDPC_2.h"
  8. #include "Utils_1.h"
  9. #include <ctype.h>
  10. #include <wchar.h>
  11. /**************************************************************
  12.  *
  13.  * LDPC Constructors
  14.  * 
  15.  **************************************************************/
  16. void LDPC_Code::GetFromFile( ifstream &file )
  17.   char dummy_buffer[10000];
  18.   int rhos_index, lambdas_index;
  19.   rhos_index = lambdas_index = 0;
  20.   BOOLEAN GotMapInUse = FALSE;
  21.   //----------------------------------------------
  22.   // Go over file
  23.   //----------------------------------------------
  24.   while (!file.eof())
  25.     {
  26.       switch (file.peek()) 
  27.       {
  28.       case 'r':
  29.          if (rhos_index >= MAX_RHOS)
  30.          {
  31.             cout << "LDPC_Code::GetFromFile: MAX_RHOS exceededn";
  32.             exit(1);
  33.          }
  34.  file >> rho_degs[rhos_index] >> rho_wts[rhos_index];
  35.  file.getline(dummy_buffer, sizeof(dummy_buffer));  // reach eol
  36.          rhos_index++;
  37.          break;
  38.       case 'l':
  39.          if (lambdas_index >= MAX_LAMBDAS)
  40.          {
  41.             cout << "LDPC_Code::GetFromFile: MAX_LAMBDAS exceededn";
  42.             exit(1);
  43.          }
  44.  file >> lambda_degs[lambdas_index] >> lambda_wts[lambdas_index];
  45.          lambdas_index++;
  46.  file.getline(dummy_buffer, sizeof(dummy_buffer));  // reach eol
  47.          break;
  48.       case 'm':
  49.  GotMapInUse = TRUE;
  50.          MapInUse.GetFromFile( file );
  51.          // Initialize GF(q)
  52.          GFq::Initialize(MapInUse.GetQ());
  53.          break;
  54.       default:
  55.  file.getline(dummy_buffer, sizeof(dummy_buffer));   // Skip line
  56.       }
  57.     }
  58.   if (!GotMapInUse)
  59.   {
  60.   cout << "mapping not definedn";
  61.   exit(1);
  62.   }
  63.   rho_degs[rhos_index] = -1;
  64.   rho_wts[rhos_index] = -1;
  65.   lambda_degs[lambdas_index] = -1;
  66.   lambda_wts[lambdas_index] = -1;
  67. }
  68. LDPC_Code::LDPC_Code( 
  69.       ifstream &File, 
  70.       int p_BlockLength,
  71.       channel *p_Channel )
  72.   : BlockLength(p_BlockLength),
  73.     Channel(p_Channel)
  74. {
  75.   GetFromFile( File );
  76. }
  77. /*************************************************************************
  78.  *
  79.  *  Calc rate
  80.  *
  81.  *************************************************************************/
  82. double LDPC_Code::sigma_lambda()
  83. {
  84.   double n;
  85.   n = 0;
  86.   
  87.   for (int i = 0; lambda_degs[i] != -1; i++)
  88.     n += lambda_wts[i]/lambda_degs[i];
  89.  
  90.   return n;
  91. }
  92. double LDPC_Code::sigma_rho()
  93. {
  94.   double m;
  95.   m = 0;
  96.  
  97.  for (int i = 0; rho_degs[i] != -1; i++)
  98.    m += rho_wts[i]/rho_degs[i];
  99.   return m;
  100. }
  101. double LDPC_Code::Calc_Symbol_Rate()
  102. {
  103.    double SigmaLambda = sigma_lambda();
  104.    double SigmaRho = sigma_rho();
  105.    return 1 - SigmaRho/SigmaLambda;
  106. }
  107. /**************************************************************
  108.  *
  109.  * mapping read from file
  110.  * 
  111.  **************************************************************/
  112. void mapping::GetFromFile( ifstream &file )
  113. // Read the mapping from the current position in the file
  114.   file >> q;
  115.   
  116.   if (q > MAX_Q)
  117.   {
  118.      cout << "q exceeds MAX_Q in mapping:GetFromFilen";
  119.      exit(1);
  120.   }
  121.   for (int i = 0; i < q; i++)
  122.   {
  123.      file >> vals[i];
  124.   }