資源簡介
用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?????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?????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?????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改版的聊天室
評論
共有 條評論