• 大小: 5KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: C/C++
  • 标签: LDPC  C  

资源简介

用c 语言实现的LDPC和积译码过程。。采用自定义的矩阵存储形式,降低了内存需求

资源截图

代码片段和文件信息

// GF(2) LDPC encoding/decoding simulator
// (c) 2005-2006 by Seishi Takamura @ Stanford University / NTT (Nippon Telegraph and Telephone)
// Absolutely no warranty.
#include 
#include 
#include 
#include 
#include 
#include


//N是指信息节点的个数,M是指校验节点的个数
//rmax cmax分别指最大列权重和行权重,即为一的个数
//这是几个全局都使用的变量记住。。。。。
int n m;
int rmax cmax;
int *row_weight *col_weight;
int **row_col;

static unsigned int rndm = 2815UL;
void SRand(int n) {
  rndm = n;
}

unsigned int Rand(void)           // simple pseudo rand
{
  return rndm = (77UL * rndm + 1243UL) & 0x7fffffffUL; // 31bit
}
//下面这两个函数,,,,不懂不懂。。。。。
double atanh2(double x)
{
  return log((1.0 + x) / (1.0 - x));  // returns 2*atanh(x)返回一个指定角度参数所对应的反双曲正切值。
}
double logtanh2(double x)
{
  return log(tanh(fabs(x*0.5)));  // returns log tanh |x|计算双曲正切值
}

#define INT 6/*8*/              // int part
#define DECI 14/*13*/              // fraction part
#define FMUL (1<#define PREC (1.0/FMUL)      // precision
#define LEVELS (1<<(INT+DECI))
static int flogtanh[LEVELS];
static int fgallag[LEVELS];

int float2fix(double x)
{
  if (x >= 0) {
    return (int)(x * FMUL + 0.5);
  } else {
    return -(int)((-x) * FMUL + 0.5);
  }
}

unsigned int float2fixu(double x)
{
  return (unsigned int)(x * FMUL + 0.5);
}

#define fix2float(x) ((x)*PREC)

void inittab(void)
{//我感觉这个程序是初始化
  int i = 1;
  double right = logtanh2(fix2float(i) - 0.5*PREC);
  flogtanh[0] = -FMUL*14;
  for ( ; i < LEVELS; i++) {
    double d = fix2float(i);
    double left = logtanh2(d+0.5*PREC);
    flogtanh[i] = float2fix((4*logtanh2(d)+right+left) / 6.0);
    right = left;
  }

  i = 1;
  fgallag[0] = FMUL*14;
  right = atanh2(exp(fix2float(-i) - 0.5*PREC));
  for ( ; i < LEVELS; i++) {
    double d = fix2float(-i);
    double expd = atanh2(exp(d));
    double left = atanh2(exp(d+0.5*PREC));
    fgallag[i] = float2fix((4*expd+right+left) / 6.0);
    right = left;
  }
}

#if 1
int Flogtanh(int x)//这里是每次迭代后,判决的过程可能。。。。。。
{//如果L(Qi)<0则xi=1
 //否则为0;如果xHT=0成立则译码结束否则跳到
//第1步直至满足校验等式或超过最大迭代次数
//为止。

  assert(x>=0);//if (x < 0) return 0;
  if (x >= LEVELS)
    return 0;
  return flogtanh[x];
}
#else
  #define Flogtanh(x) flogtanh[x]
#endif

#if 1
int Fgallag(int x)
{
  assert(x <= 0);//  if (x >= 0) return -FMUL*14; //-115000
  if (x <= -LEVELS)
    return 0;
  return fgallag[-x];
}
#else
  #define Fgallag(x) fgallag[-(x)]
#endif

int HamDist(int *x int *y int len)
{
  int i sum = 0;
  for (i = 0; i < len; i++) {
    if (*x++ != *y++) sum++;
  }
  return sum;
}

int bsc(int x[] int y[] double p int q0[])
{
/*初始化:对接收到的i个信息计算初始信道信息:
    L(ci)=L(qij)=logP0iP1i=2yi/σ2
    式中yi为接收到的混有噪声的信息σ2为噪声平
    均功率。*/

//lets y[] be noisy version of x[] with crossover probability of p 
//and sets the values of q0[] (see description below)
//q0[0<

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      11947  2010-03-13 19:10  GF2_LDPC.c.cpp

----------- ---------  ---------- -----  ----

                11947                    1


评论

共有 条评论