亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? encoding.cpp

?? 關于Q元LDPC碼的C++仿真程序
?? CPP
字號:
/*********************************************************************************
 * The encoder in this file is based on:
 *
 * T. Richardson and R.Urbanke, "Efficient encoding of low-density parity-check codes," IEEE Trans. Inform. Theory, vol. 47,
 * pp. 638--656, February 2001.
 *
 *********************************************************************************/



#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <ctype.h>
#include <wchar.h>
#include "LDPC_1.h"
#include "LDPC_2.h"
#include "Utils_1.h"
#include "Encoding.h"


/*********************************************************************************
 *
 * Utility
 *
 *********************************************************************************/

GFq &check_node::Element(int index)
// Treats check node as a sparse matrix column
{
   static GFq ReturnVal(0);                    // Value of check at column

   for (int j = 0; j < GetDegree(); j++)
   {
      if (GetEdge(j).LeftNode().GetID() == index)
      {
         ReturnVal = GetEdge(j).label;
         break;
      }
   }

   return ReturnVal;
}



/*********************************************************************************
 *
 * Node lists
 *
 *********************************************************************************/

void NodeListWithID::SwitchNodes(int i1, int i2)
{
   node *Aux;

   Aux = Nodes[i1];
   Nodes[i1] = Nodes[i2];
   Nodes[i2] = Aux;

   // Update ID
   Nodes[i1]->SetID(i1);
   Nodes[i2]->SetID(i2);
}





void VariableNodeList::Init(variable_node VariableNodeArray[], int p_Length)
{
   Allocate(p_Length);
   for (int i = 0; i < p_Length; i++)
   {
      Nodes[i] = &(VariableNodeArray[i]);
      Nodes[i]->SetID(i);
   }
   CurrentLength = p_Length;
}




void CheckNodeList::Init(check_node CheckNodeArray[], int p_Length)
{
   Allocate(p_Length);
   int index = 0;

   for (int i = 0; i < p_Length; i++)
   {
      if (CheckNodeArray[i].GetDegree() != 0)      // Ignore the rare case of degree = 0
      {
         Nodes[index] = &(CheckNodeArray[i]);
         Nodes[index]->SetID(index);
         index++;
      }
   }
   CurrentLength = index;
}




void EraseKnown(node &KnownColumn, NodeListWithoutID &DegreeOneRows)
// "Erase" a known column
{
   for (int i = 0; i < KnownColumn.degree; i++)
   {
      node &AdjacentRow = KnownColumn.AdjacentNode(i);
      AdjacentRow.AuxDegree--;

      if (AdjacentRow.AuxDegree == 1)
         DegreeOneRows.Add(AdjacentRow);
   }
}


/*********************************************************************************
 *
 * Urbanke's Algorithm AH
 *
 *********************************************************************************/

// If gap ends up too big, it might be necessary to modify the following 3 to 300 or larger
#define MIN_GAP   3
#define MAX_GAP   10




void UrbankeAlgorithmAH(NodeListWithID &Columns, NodeListWithID &Rows)
{
   //------------------------------------------------------
   // Init degrees
   //------------------------------------------------------
   for (int i = 0; i < Rows.GetLength(); i++)
      Rows[i].AuxDegree = Rows[i].degree;

   // data structure for degree one nodes
   NodeListWithoutID DegreeOneRows;
   DegreeOneRows.Allocate(Rows.GetLength());

   //------------------------------------------------------
   // Initialization: select known columns
   //-----------------------------------------------------
   int SystematicColumns = max(Columns.GetLength() - Rows.GetLength(), 0) + MIN_GAP;


   for (int i = 0; i < SystematicColumns; i++)
   {
      // Select a known column among remaining columns
      int Known = uniform_random(Columns.GetLength() - i) + i;
      Columns.SwitchNodes(Known, i);          // Move known column to start 
      EraseKnown(Columns[i], DegreeOneRows);  // "Erase" known column
   }

   int FirstNonSystematic = SystematicColumns;

   //------------------------------------------------------
   // Diagonal extension steps
   //------------------------------------------------------
   int DegreeOneIndex = 0;
   int StartUnknown = FirstNonSystematic;
   for (; StartUnknown < Columns.GetLength(); StartUnknown++)
   {
      // Find next degree one row
      // Skip degree one rows which may have turned to zero
      for (; DegreeOneIndex < DegreeOneRows.GetLength(); DegreeOneIndex++)
         if (DegreeOneRows[DegreeOneIndex].AuxDegree == 1)
            break;

      if (DegreeOneIndex == DegreeOneRows.GetLength())
         break;       // If not finished and no degree one nodes remain

      node &CurrentDegreeOneRow = DegreeOneRows[DegreeOneIndex++];
      int CurrentRowNumber = CurrentDegreeOneRow.GetID();
      
      // Find the single unknown column (degree 1 refers to unknown connected nodes)
      int NewColumnToBeKnown = -1;
      for (int i = 0; i < CurrentDegreeOneRow.GetDegree(); i++)
      {
         int ColumnNumber = CurrentDegreeOneRow.AdjacentNode(i).GetID();
         if (ColumnNumber >= StartUnknown)
         {
            NewColumnToBeKnown = ColumnNumber;
            break;
         }
      }

      if (NewColumnToBeKnown == -1)     // Assertion - an unknown column must be found
      {
         cout << "LDPC_Code::GenerateEncoder(): No unknown column was found, while "
              << "because degree of row = 1, by definition one should have been found\n";
         exit(1);
      }

      Columns.SwitchNodes(NewColumnToBeKnown, StartUnknown);    // Make new known column StartUnknown 
      Rows.SwitchNodes(CurrentRowNumber, StartUnknown - FirstNonSystematic);
      EraseKnown(Columns[StartUnknown], DegreeOneRows);         // "Erase" new known node
   }

   //-------------------------------------------------------------
   // Generate gap by moving remaining unknowns down
   //-------------------------------------------------------------
   int LowerTriangularLength = StartUnknown - FirstNonSystematic;
   for (int i1 = Columns.GetLength()-1, i2 = StartUnknown - 1;  
        i2 >= FirstNonSystematic;  i1--, i2--)
        {
           Columns.SwitchNodes(i1, i2);
        }

   //-------------------------------------------------------------
   // Record gap
   //-------------------------------------------------------------
   Columns.Gap = Columns.GetLength() - LowerTriangularLength;
   Rows.Gap = Rows.GetLength() - LowerTriangularLength;

//   cout << "SystematicColumns = " << SystematicColumns << "\n"
//      << "StartUnknown = " << StartUnknown << "\n"
//      << "Columns.GetLength() = " << Columns.GetLength() << "\n"
//      << "Columns gap = " << Columns.Gap << "\n"
//      << "Rows.GetLength() = " << Rows.GetLength() << "\n"
//      << "Rows gap = " << Rows.Gap << "\n";
}


/*********************************************************************************
 *
 * Encoder
 *
 *********************************************************************************/



void LDPC_Code::GenerateRandomSystematic()
{
   //------------------------------------------------------
   // Randomly select values for systematic digits
   //------------------------------------------------------
   for (int i = 0; i < Systematic; i++)
      Variables[i].Symbol.val = uniform_random(GFq::q);
}
 



void LDPC_Code::Encode()
{
   int FirstVarOfTriangle = Systematic + Gap;
  
   //------------------------------------------------------
   // Determine gap symbols
   //------------------------------------------------------
   if (Gap > 0)
   {
      // Multiply systematic vector multiplied by GapMatrix
      matrix Vals(Gap);          // a column vector for results
      for (int i = 0; i < Gap; i++)
      {
         Vals[i] = 0;
         for (int j = 0; j < Systematic; j++)
            Vals[i] += Variables[j].Symbol * GapMatrix.Element(i,j);
      }

      matrix GapVars(Gap);
      GapVars = MinusPhiInverse * Vals;

      // place vals
      for (int i = 0; i < Gap; i++)
         Variables[Systematic + i].Symbol = GapVars[i];
   }

   //------------------------------------------------------
   // Determine all the rest
   //------------------------------------------------------
   for (int i = 0; i < Triangle; i++)
   {
      // Calculate value of check node without symbol
      Variables[FirstVarOfTriangle + i].Symbol = 0;
      GFq label = Checks[i].Element(FirstVarOfTriangle + i);
      Variables[FirstVarOfTriangle + i].Symbol = (Checks[i].Value()/label).Minus();
   }
}




void LDPC_Code::GenerateEncoder_WithoutGap()
{
   //------------------------------------------------------
   // Approximate lower triangularize
   //------------------------------------------------------
   // Init 
   Variables.Init(Graph.variable_nodes, Graph.N);
   Checks.Init(Graph.check_nodes, Graph.M);

   UrbankeAlgorithmAH(/* columns */ Checks, /* rows */ Variables);

   // Reverse because we have made checks the columns and variables the rows
   Variables.Reverse();
   Checks.Reverse();

   // Determine values
   Systematic = Variables.GetLength() - Checks.GetLength();
   Gap = Checks.Gap;
   Triangle = Variables.GetLength() - Systematic - Gap;

   int FirstCheckOfGap = Checks.GetLength() - Gap;

   //------------------------------------------------------
   // Eliminate gap check nodes
   //------------------------------------------------------
   if (Gap > MAX_GAP)
   {
      cout << "GenerateEncoder_WithoutGap: Gap = " << Gap << " too big\n";
      exit(1);
   }

   for (int i = FirstCheckOfGap; i < Checks.GetLength(); i++)
   {
      Checks[i].Disconnect();
   }

   // Update variables
   Systematic += Gap;
   Gap = 0;
   GapMatrix.deAllocate();
   MinusPhiInverse.deAllocate();
}



void LDPC_Code::GenerateEncoder()
{
   //------------------------------------------------------
   // Approximate lower triangularize
   //------------------------------------------------------
   // Init
   Variables.Init(Graph.variable_nodes, Graph.N);
   Checks.Init(Graph.check_nodes, Graph.M);

   UrbankeAlgorithmAH(/* columns */ Checks, /* rows */ Variables);

   // Reverse because we have made checks the columns and variables the rows
   Variables.Reverse();
   Checks.Reverse();

   // Determine values
   Systematic = Variables.GetLength() - Checks.GetLength();
   Gap = Checks.Gap;
   Triangle = Variables.GetLength() - Systematic - Gap;

   cout << "GenerateEncoder: Gap = " << Gap << "\n";

   //ofstream bbbTemp("Temp.txt");
   //for (int i = 0; i < Variables.GetLength(); i++)
   //   for (int j = 0; j < Variables[i].GetDegree(); j++)
   //      bbbTemp << Variables[i].AdjacentNode(j).GetID() << " " << i << "\n";
   //bbbTemp.close();
   //exit(0);

   int FirstCheckOfGap = Checks.GetLength() - Gap;
   int FirstVarOfTriangle = Systematic + Gap;

   //------------------------------------------------------
   // Handle gap
   //------------------------------------------------------
   // Init gap matrix
   GapMatrix.Init(Gap, Variables.GetLength());

   for (int i = 0; i < Gap; i++)
   {
      //cout << FirstCheckOfGap + i << ">" << Checks[FirstCheckOfGap + i].GetID() << " " << Checks[FirstCheckOfGap + i].degree << "\n";
      GapMatrix.Set(i, Checks[FirstCheckOfGap + i]);
   }

   //ofstream bbbTemp2("Temp.txt");
   //GapMatrix.SparseOut(bbbTemp2);
   //bbbTemp2.close();
   //exit(0);

   // Gaussian elimination 
   for (int j = Triangle - 1; j >= 0; j--)      // column
   {
      // Find element appropriate matrix element
      int EliminatedCol = FirstVarOfTriangle + j;     // Column to be eliminated
      check_node &CheckRow = Checks[j];     // j'th check should be nonzero at j'th column
      GFq EliminatingRowVal = CheckRow.Element(EliminatedCol);        // Value of row at column to be eliminated

      for (int i = 0; i < GapMatrix.M; i++)     // row of GapMatrix
      {
         GFq ValToBeEliminated = GapMatrix.Element(i, EliminatedCol);
         if (!ValToBeEliminated.IsZero())
         {
            GFq Mult = (ValToBeEliminated / EliminatingRowVal).Minus();
            GapMatrix.Add(i, CheckRow, Mult);
         }
      }
   }

   // obtain phi^-1
   // While matrix is singular, switch columns
   BOOLEAN Success = FALSE;
   for (int Attempts = 0; Attempts < 10000; Attempts++)
   {
      matrix phi = GapMatrix.Extract(Systematic, Gap);   // Systematic = first col after systematic
      MinusPhiInverse = phi.Inverse();

      if (!MinusPhiInverse.IsNull())    // if success
      {
         MinusPhiInverse.MultiplyByMinusOne();
         Success = TRUE;
         break;
      }
      else
      {  // switch columns randomly
         int i1 = uniform_random(Systematic);
         int i2 = uniform_random(Gap) + Systematic;

         GapMatrix.SwitchColumns(i1, i2);
         Variables.SwitchNodes(i1, i2);
      }
   }

   if (!Success)
   {
      cout << "Unable to find an invertible phi, maybe increase number of attempts\n";
      exit(1);
   }
}     

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91蝌蚪国产九色| 欧美日韩中文一区| 天天影视色香欲综合网老头| 国产精品三级久久久久三级| 久久这里只有精品6| 欧美一区三区四区| 91精品久久久久久久99蜜桃| 欧美性一二三区| 色综合网色综合| 暴力调教一区二区三区| 高清不卡一区二区| 粉嫩高潮美女一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 日本网站在线观看一区二区三区| 亚洲444eee在线观看| 天天综合色天天| 美国av一区二区| 国产成人在线视频网址| 韩国毛片一区二区三区| 裸体健美xxxx欧美裸体表演| 奇米影视在线99精品| 国产成人在线视频网址| 国产精品一卡二卡在线观看| 国产一区二区女| 91免费看视频| 777xxx欧美| 欧美α欧美αv大片| 国产清纯美女被跳蛋高潮一区二区久久w | 成人免费在线播放视频| 亚洲激情男女视频| 免费观看成人鲁鲁鲁鲁鲁视频| 国产在线看一区| 色一区在线观看| 欧美r级电影在线观看| 中文字幕在线不卡一区| 亚洲大片在线观看| 国产在线国偷精品免费看| 在线视频一区二区三区| 欧美精品一区二区三区很污很色的| 国产精品美女一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 91色视频在线| 国产日本欧洲亚洲| 蜜臀国产一区二区三区在线播放| 国产白丝网站精品污在线入口| 在线免费观看视频一区| 91麻豆精品国产91久久久资源速度 | 午夜精品久久久久久| 风间由美一区二区三区在线观看| 欧美电影免费提供在线观看| 国产精品你懂的| 国产高清精品在线| 欧美r级在线观看| 日本欧美在线看| 欧美日韩一区二区三区四区| 国产精品高潮久久久久无| 久久99国产乱子伦精品免费| 欧美午夜精品电影| 欧美激情中文字幕一区二区| 精久久久久久久久久久| 欧美一二三四区在线| 午夜av区久久| 日韩视频免费观看高清在线视频| 亚洲影院免费观看| 欧美丝袜自拍制服另类| 亚洲综合成人在线| 欧美日韩在线观看一区二区| 亚洲一区二区三区精品在线| 欧美三级视频在线| 视频一区视频二区中文| 日韩欧美自拍偷拍| 国产高清久久久| 亚洲柠檬福利资源导航| 欧美色男人天堂| 久久成人免费网站| 国产精品丝袜91| 91传媒视频在线播放| 日韩精品五月天| 久久亚洲一区二区三区四区| 91香蕉国产在线观看软件| 亚洲不卡av一区二区三区| 日韩精品一区二区三区视频| 成人综合婷婷国产精品久久蜜臀| 亚洲精品中文字幕在线观看| 欧美一区二区三区不卡| 成人黄色a**站在线观看| 亚洲第一主播视频| 国产欧美一区二区三区在线老狼| 欧美亚洲国产一卡| 国产91富婆露脸刺激对白| 日韩精品五月天| 亚洲免费在线视频一区 二区| 5566中文字幕一区二区电影| 色一情一伦一子一伦一区| 卡一卡二国产精品 | 精品视频999| 成人手机在线视频| 亚洲18女电影在线观看| ...中文天堂在线一区| 日韩无一区二区| 91精品欧美一区二区三区综合在 | 日韩三级视频中文字幕| av亚洲精华国产精华精| 国产一区 二区 三区一级| 日韩激情一二三区| 一区二区三区欧美日韩| 日本一区二区久久| 久久天天做天天爱综合色| 欧美精品一卡两卡| 欧美视频一区二区| 精品视频999| 欧美综合视频在线观看| 色拍拍在线精品视频8848| 丁香桃色午夜亚洲一区二区三区| 狠狠色丁香久久婷婷综| 青青草国产成人av片免费| 夜夜操天天操亚洲| 亚洲高清免费视频| 亚洲综合成人在线| 天涯成人国产亚洲精品一区av| 亚洲综合自拍偷拍| 亚洲二区在线视频| 免费看精品久久片| 久久99热国产| 国产精品一区二区三区网站| 国内精品视频一区二区三区八戒 | 国产精品久久久久久福利一牛影视 | 91精品国产色综合久久ai换脸| 日韩美女视频在线| 国产人成一区二区三区影院| 亚洲视频 欧洲视频| 亚洲h在线观看| 91一区二区在线观看| 在线视频综合导航| 日韩一区二区在线播放| 国产欧美一区二区在线观看| 国产欧美1区2区3区| 亚洲国产美国国产综合一区二区| 日本亚洲欧美天堂免费| 懂色av一区二区三区免费观看 | 亚洲乱码日产精品bd | 亚洲一区免费观看| 麻豆成人久久精品二区三区红 | 91成人免费在线视频| 久久看人人爽人人| 亚洲午夜久久久久久久久电影网| 国内精品免费在线观看| 欧美视频自拍偷拍| 国产精品免费观看视频| 天天亚洲美女在线视频| 色综合天天综合网天天看片| 欧美r级电影在线观看| 亚洲1区2区3区视频| 91在线视频18| 色综合中文字幕国产 | 日韩免费看的电影| 一区二区三区在线不卡| 成人午夜电影小说| 亚洲精品在线观看视频| 亚洲福利视频导航| 色av综合在线| 国产精品美女久久久久aⅴ| 国产一区二区调教| 精品国产免费久久| 麻豆国产精品777777在线| 欧美精品视频www在线观看| 亚洲尤物在线视频观看| 色8久久人人97超碰香蕉987| 中文字幕精品一区二区精品绿巨人| 国内成+人亚洲+欧美+综合在线| 91麻豆精品国产91久久久久久| 日日夜夜精品视频免费 | 欧美伦理电影网| 日韩av电影一区| 欧美电影免费观看完整版| 狠狠色丁香久久婷婷综合_中| 精品国产乱码久久久久久影片| 国产一区二区三区免费| 亚洲国产精品国自产拍av| av欧美精品.com| 亚洲欧美成人一区二区三区| 欧美人狂配大交3d怪物一区| 七七婷婷婷婷精品国产| 国产亚洲视频系列| 欧美综合一区二区三区| 日韩中文字幕亚洲一区二区va在线| 日韩美女在线视频| 成人午夜av影视| 丝袜亚洲精品中文字幕一区| 日韩一区二区三区观看| 成人小视频在线| 亚洲国产精品久久不卡毛片| 久久久久久久精| 欧美色成人综合| 国产盗摄女厕一区二区三区 | av一本久道久久综合久久鬼色| 五月综合激情网| 国产精品久久久久久久久久免费看| 欧美性色aⅴ视频一区日韩精品| 国产乱一区二区|