📄 ldpc decoder.cpp
字号:
#include "iostream.h"
#include "time.h"
#include "stdlib.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
#define A 1
#define mean 0
#define delt 0.7080
#define M 250
#define N 500
#define dc 6
#define iterative 4
#define codenum 80000
#define pi 3.141592
double stand_distribute(double m,double sgma);
double generate_H(void);
int d[N];
double o[M],Rn[N];
int Hc[M][dc]={
302, 468, 151, 34, 384, 156, 75, 195, 264, 312, 254, 157, 262, 272, 429, 197, 24, 116, 436, 296, 353, 132, 332, 427, 126, 268, 45, 146, 53, 396, 351, 8, 418, 125, 97, 481, 183, 371, 87, 322, 59, 327, 70, 471, 178, 169, 201, 346, 165, 338, 136, 248, 359, 463, 472, 361, 316, 235, 3, 12,
306, 81, 2, 311, 435, 101, 373, 210, 161, 55, 211, 216, 147, 90, 399, 107, 294, 402, 9, 460, 93, 84, 160, 39, 203, 493, 430, 117, 490, 65, 43, 109, 259, 10, 446, 188, 431, 465, 82, 226, 71, 222, 249, 119, 378, 300, 411, 303, 204, 269, 238, 389, 121, 193, 31, 453, 423, 94, 79, 191,
344, 415, 52, 207, 206, 484, 33, 196, 154, 128, 78, 212, 225, 186, 383, 105, 285, 16, 164, 40, 233, 239, 25, 54, 14, 104, 397, 229, 480, 341, 278, 112, 375, 370, 51, 56, 426, 456, 205, 158, 486, 337, 149, 270, 335, 273, 143, 258, 123, 345, 179, 328, 22, 38, 137, 171, 266, 347, 339, 404,
412, 219, 21, 240, 244, 432, 113, 57, 221, 454, 252, 103, 405, 455, 334, 492, 135, 91, 80, 392, 74, 127, 62, 98, 469, 227, 367, 61, 41, 250, 253, 342, 307, 304, 202, 325, 247, 305, 184, 274, 319, 309, 20, 185, 452, 293, 213, 261, 218, 438, 447, 134, 73, 67, 260, 76, 496, 246, 308, 23,
215, 63, 64, 163, 1, 495, 115, 483, 17, 333, 194, 242, 372, 340, 66, 488, 256, 357, 124, 494, 352, 224, 37, 220, 263, 279, 114, 362, 234, 44, 138, 358, 313, 476, 50, 391, 315, 457, 470, 445, 474, 77, 11, 177, 236, 414, 277, 298, 394, 475, 410, 467, 245, 356, 106, 317, 386, 459, 199, 450,
30, 255, 208, 489, 4, 102, 491, 182, 13, 360, 130, 354, 257, 365, 131, 181, 60, 364, 96, 88, 85, 172, 275, 26, 409, 47, 29, 110, 230, 46, 133, 89, 99, 141, 289, 68, 377, 120, 122, 187, 388, 390, 326, 27, 162, 449, 434, 297, 478, 189, 295, 376, 369, 49, 69, 363, 336, 348, 380, 237,
290, 145, 440, 428, 419, 366, 36, 271, 401, 170, 425, 7, 35, 444, 58, 223, 281, 498, 42, 442, 228, 408, 437, 209, 314, 473, 83, 320, 100, 282, 200, 343, 48, 407, 395, 241, 331, 276, 166, 231, 466, 232, 417, 393, 441, 487, 72, 368, 190, 214, 280, 175, 451, 173, 148, 406, 192, 159, 198, 398,
448, 15, 403, 217, 287, 458, 142, 424, 421, 387, 485, 479, 355, 118, 286, 461, 139, 324, 155, 433, 174, 291, 140, 265, 462, 111, 0, 251, 299, 19, 422, 283, 310, 129, 32, 443, 6, 381, 477, 330, 243, 288, 267, 482, 86, 150, 413, 349, 92, 5, 144, 176, 153, 416, 108, 321, 464, 318, 18, 329,
180, 350, 292, 374, 379, 497, 301, 167, 420, 168, 284, 400, 28, 499, 385, 439, 382, 323, 95, 152,
341, 377, 145, 381, 87, 240, 156, 336, 295, 71, 479, 185, 284, 220, 91, 378, 160, 343, 137, 448, 267, 227, 202, 203, 323, 260, 326, 490, 298, 139, 192, 184, 225, 6, 25, 26, 431, 394, 204, 419, 172, 252, 81, 83, 136, 357, 289, 386, 398, 489, 314, 294, 279, 72, 111, 467, 492, 56, 468, 301,
92, 183, 389, 361, 49, 135, 214, 447, 400, 122, 273, 375, 253, 5, 459, 104, 456, 89, 440, 114, 451, 191, 113, 413, 149, 354, 18, 176, 245, 236, 308, 395, 103, 125, 181, 304, 420, 142, 8, 406, 170, 335, 411, 242, 331, 14, 74, 155, 90, 291, 141, 255, 442, 12, 146, 82, 399, 347, 1, 422,
363, 138, 368, 105, 73, 365, 268, 405, 27, 165, 94, 453, 397, 144, 123, 462, 63, 449, 119, 358, 157, 487, 473, 472, 45, 159, 315, 200, 250, 11, 410, 313, 488, 249, 495, 239, 283, 282, 248, 84, 126, 211, 257, 352, 338, 452, 484, 158, 272, 271, 425, 75, 189, 118, 219, 147, 274, 466, 235, 396,
428, 414, 115, 180, 163, 148, 88, 164, 140, 481, 168, 30, 360, 434, 166, 290, 70, 218, 277, 266, 232, 441, 78, 346, 445, 93, 50, 121, 499, 320, 408, 351, 100, 464, 244, 316, 306, 67, 256, 29, 482, 324, 275, 392, 321, 0, 373, 415, 383, 76, 128, 2, 222, 42, 198, 296, 329, 276, 258, 385,
367, 132, 288, 362, 4, 212, 241, 167, 162, 44, 437, 498, 457, 106, 38, 332, 384, 217, 478, 469, 216, 317, 99, 102, 446, 311, 179, 432, 433, 20, 182, 54, 430, 108, 95, 190, 175, 318, 15, 109, 17, 443, 24, 152, 238, 247, 35, 153, 215, 265, 40, 356, 262, 28, 173, 327, 208, 281, 427, 61,
243, 364, 465, 328, 305, 224, 312, 7, 455, 409, 476, 205, 37, 278, 349, 226, 435, 195, 494, 254, 348, 293, 65, 55, 229, 197, 292, 201, 350, 36, 177, 461, 52, 188, 391, 380, 107, 16, 300, 34, 390, 21, 330, 127, 97, 251, 246, 342, 143, 171, 416, 388, 269, 470, 39, 150, 196, 161, 496, 68,
393, 454, 355, 117, 302, 407, 120, 438, 112, 231, 325, 13, 423, 486, 169, 404, 345, 230, 9, 463, 199, 47, 426, 309, 372, 287, 43, 131, 402, 382, 310, 79, 101, 223, 174, 339, 259, 270, 303, 57, 53, 322, 98, 261, 421, 3, 340, 124, 387, 209, 417, 424, 80, 493, 33, 374, 474, 129, 187, 60,
371, 154, 210, 370, 207, 436, 264, 480, 379, 285, 228, 337, 116, 234, 344, 412, 477, 51, 77, 458, 64, 497, 334, 403, 439, 429, 280, 366, 58, 186, 297, 213, 19, 151, 319, 31, 66, 206, 359, 450, 134, 491, 96, 263, 62, 353, 69, 475, 471, 369, 485, 133, 286, 41, 130, 401, 221, 193, 237, 483,
460, 333, 86, 299, 46, 307, 85, 10, 233, 23, 22, 444, 178, 110, 418, 48, 194, 376, 59, 32,
367, 60, 487, 280, 300, 154, 288, 186, 316, 422, 296, 38, 287, 19, 21, 11, 96, 172, 282, 37, 2, 16, 283, 74, 426, 455, 378, 398, 39, 445, 328, 370, 6, 198, 472, 309, 258, 384, 53, 293, 352, 498, 347, 25, 197, 441, 350, 263, 3, 20, 451, 33, 292, 392, 249, 31, 150, 446, 86, 46,
307, 138, 247, 160, 490, 434, 474, 163, 139, 22, 124, 450, 383, 484, 421, 405, 306, 239, 360, 406, 81, 223, 234, 230, 196, 214, 40, 290, 291, 373, 331, 51, 204, 354, 376, 305, 191, 218, 45, 385, 47, 65, 187, 50, 68, 368, 125, 443, 476, 52, 26, 433, 458, 469, 264, 4, 241, 142, 423, 453,
155, 153, 284, 366, 492, 132, 23, 98, 85, 485, 131, 193, 372, 276, 121, 101, 333, 174, 195, 210, 15, 90, 151, 64, 42, 171, 215, 17, 397, 319, 245, 313, 136, 395, 489, 222, 104, 152, 389, 391, 447, 123, 92, 12, 56, 471, 480, 374, 71, 477, 308, 32, 299, 109, 461, 95, 452, 58, 213, 129,
361, 115, 217, 349, 84, 28, 318, 201, 387, 388, 97, 75, 497, 260, 105, 493, 325, 266, 248, 267, 202, 87, 304, 49, 61, 275, 277, 289, 394, 179, 456, 94, 137, 164, 468, 144, 343, 134, 358, 62, 168, 407, 415, 236, 442, 344, 146, 261, 166, 228, 103, 203, 286, 454, 295, 483, 167, 120, 227, 323,
113, 135, 41, 495, 403, 428, 256, 157, 156, 482, 175, 270, 357, 419, 211, 189, 200, 48, 465, 59, 246, 463, 410, 457, 57, 317, 470, 334, 27, 369, 449, 337, 404, 363, 281, 437, 244, 409, 364, 5, 324, 224, 257, 297, 380, 243, 173, 79, 250, 190, 116, 229, 375, 110, 382, 255, 77, 63, 390, 496,
169, 55, 272, 93, 412, 400, 254, 141, 310, 342, 425, 473, 176, 126, 107, 69, 117, 162, 294, 467, 460, 356, 82, 311, 78, 209, 436, 478, 252, 10, 335, 219, 424, 159, 29, 43, 140, 83, 340, 408, 88, 402, 119, 491, 112, 72, 122, 226, 18, 338, 7, 73, 479, 432, 396, 70, 148, 89, 212, 466,
145, 76, 359, 1, 188, 240, 414, 177, 355, 330, 181, 30, 411, 417, 362, 108, 238, 315, 158, 427, 475, 448, 127, 128, 14, 133, 273, 13, 371, 251, 320, 274, 285, 199, 259, 365, 321, 329, 341, 35, 298, 216, 262, 439, 225, 336, 147, 233, 242, 111, 237, 231, 99, 381, 91, 182, 312, 401, 118, 302,
348, 486, 377, 170, 431, 36, 34, 418, 54, 438, 326, 322, 205, 130, 268, 235, 499, 444, 220, 379, 459, 269, 481, 149, 430, 207, 488, 24, 178, 106, 303, 278, 185, 399, 180, 194, 332, 413, 114, 67, 345, 494, 161, 314, 346, 184, 462, 301, 416, 429, 9, 80, 100, 232, 66, 353, 44, 8, 165, 393,
102, 253, 208, 464, 327, 339, 206, 265, 420, 440, 386, 143, 351, 192, 183, 279, 221, 435, 0, 271,
};
void main()
{ int i,j,error=0,mashu;
int code[N];
//char ch;
double r[M][dc],q0[M][dc],q1[M][dc],ber=0.0;
double f0[N],f1[N],f[N],data[N];
void computer_Rn(double (*q0)[dc],double (*q1)[dc],double (*r)[dc]);
void decision(double * Rn,double * f);
//int check(int * d);
void update_q(double * f,double (*q0)[dc],double (*q1)[dc],double (*r)[dc]);
/* for(i=0;i<N;i++)
printf("%d,",code[i]);
printf("\n"); */
double stand_sgma;double real_H[N];
double real_sgma;double a_sgma;
for(stand_sgma=0;stand_sgma<13;stand_sgma++) //为了细分实际的性能,每次增加0.5个DB
{ a_sgma=(double)stand_sgma;
real_sgma=exp(a_sgma/10*(log(10)));
real_sgma=1/real_sgma;
real_sgma=sqrt(real_sgma);
cout<<'\n'<<'\n';
cout<<"real_sgma="<<real_sgma;
cout<<" stand_sgma="<<a_sgma<<"db ";
FILE *fp; //读取码的信息,要求与前面的encoder是配套的,用到前面的称训产生的数据
if((fp=fopen("code","rb"))==NULL)
{cout<<"cannot open this file\n";
exit(0);
}
for(i=0;i<N;i++)
if(fread(code+i,4,1,fp)!=1)
{ if(feof(fp))return;
cout<<"file read error\n";
}
for(mashu=0;mashu<codenum;mashu++) //code num=100 (1000,3,5)
{
for(i=0;i<N;i++)
{ real_H[i]=double(generate_H());
if(code[i]==0)
data[i]=real_H[i]*(-A)+stand_distribute(0,real_sgma);
else
data[i]=real_H[i]*(A)+stand_distribute(0,real_sgma);
}
//following the decoder
for(i=0;i<N;i++) //compute f0[] & f1[] 进行初始化
{
f0[i]=1/(1+exp(2*A*real_H[i]*data[i]/(delt*delt)));
f1[i]=1/(1+exp(-2*A*real_H[i]*data[i]/(delt*delt)));
f[i]=f0[i]/f1[i];
}
for(i=0;i<M;i++) //initialize q0[][] & q1[][]
for(j=0;j<dc;j++)
{ q0[i][j]=f0[Hc[i][j]]; //矩阵初始化都是0吧
q1[i][j]=f1[Hc[i][j]];
}
for(i=0;i<iterative;i++)
{
computer_Rn(q0,q1,r);
update_q(f,q0,q1,r);
}
decision(Rn,f);
for(j=0;j<N;j++)
{
if(d[j]!=code[j])
error++;
}
}
cout<<"重复的次数 is"<<mashu<<"\n";
cout<<"the iteration is"<<iterative<<"\n";
cout<<"error"<<error<<"\n";
ber=(double)error/(mashu*N);
cout<<"BER is "<<ber<<"\n";
fclose(fp);
error=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void computer_Rn(double (*q0)[dc],double (*q1)[dc],double (*r)[dc])
{
int i,j,k;
for(j=0;j<N;j++)
Rn[j]=1;
for(i=0;i<M;i++) //这边是否有冗繁??没有!对rmn进行初始化
for(j=0;j<dc;j++)
{
o[i]=1;
for(k=0;k<dc;k++)
{
if(k==j) continue;
o[i]*=(q0[i][k]-q1[i][k]);
}
if(o[i]!=1)
r[i][j]=(1+o[i])/(1-o[i]);
else r[i][j]=32767.0;
}
for(k=0;k<N;k++)
for(i=0;i<M;i++)
for(j=0;j<dc;j++)
if(Hc[i][j]==k)
Rn[k]*=r[i][j]; //就是让每行仅有的那几个rmn相乘
}
void decision(double * Rn,double * f)
{
int i;
for(i=0;i<N;i++)
if((f[i]*Rn[i])>=1)
d[i]=0;
else
d[i]=1;
}
void update_q(double * f,double (*q0)[dc],double (*q1)[dc],double (*r)[dc])
{
int i,j,k,l;
double s[M][dc],nRn[N];
for(i=0;i<M;i++)
for(j=0;j<dc;j++)
{if(r[i][j]==0) //cannot divide by zero
{
nRn[Hc[i][j]]=1;
for(l=0;l<M;l++)
{for(k=0;k<dc;k++)
if((Hc[l][k]==Hc[i][j])&&(l!=i)) //表示是同列不同行的
nRn[Hc[i][j]]*=r[l][k];
//printf("use it,yeah\n");
}
s[i][j]=f[Hc[i][j]]*nRn[Hc[i][j]];// 为什么不是 f[j]?因为这个j不是n而是行中第j个1,应该用hc[i][j]来表示
}
else
s[i][j]=f[Hc[i][j]]*Rn[Hc[i][j]]/r[i][j];
q0[i][j]=s[i][j]/(1+s[i][j]);
q1[i][j]=1-q0[i][j];
}
}
/*产生标准正态分布的数字*/
double stand_distribute(double m,double sgma)//
{
double j;double z;double i;
j=rand()%32767;
j=j/32767;
z=sgma*(sqrt(2*log(1/(1-j))));
i=rand()%32767;
i=i/32767;
z=z*sin(2*pi*i);
z=m+z;
return z;
}
/*产生瑞利分布的矩阵H*/
double generate_H(void)
{ double z;
z=rand()%32767;
z=z/32767;
z=(sqrt(2*log(1/(1-z))));
return z;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -