资源简介
用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
- 上一篇:c/c++中文帮助文档API
- 下一篇:基于Linux 下qt改版的聊天室
相关资源
- c/c++中文帮助文档API
- 后缀表达式求值c语言版
- linux环境下C语言实现图片的socket传输
- des算法的c语言实现c源代码
- Marching cubes C++ 源代码
- Vc++6.0MFC入门教程,很好的资源。
- VC++6.0 MFC 超简易计算器
- C++画数学函数图象
- c++实现数字转换英文无and
- C语言 地图染色 非递归 源代码
- c++利用数组实现简单的奇偶校验
- C语言实现英汉、汉英词典功能
- 基于c#的RGB转yuv程序
- 最新华为C语言编程规范
- c语言编程中点画线法
- LDPC算法C语言实现
- 学生信息管理系统c语言
- RSA加密算法c语言
- C++实现软件自动更新(update)
- nRF24LE1实验例程
- c++遗传算法,用bitset实现
- 个人账户管理系统修改版C语言版
- 基于CnComm v1.51和vc2013的串口调试软件
- VC++ OPC客户端程序
- C++纸牌游戏——21点
- FFT C语言实现
- MFC开发的与服务器通讯程序
- 合并一个文件夹中的所有文件.cpp
- 大整数乘法全解绝对可运行C++
- 基于c语言的多人聊天室系统
评论
共有 条评论