📄 ldpc encoder.cpp
字号:
#include "iostream.h"
#include "time.h"
#include "stdlib.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
#define N 500
#define M 250
#define dc 6
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()
{
//srand((unsigned)time(NULL)); //initiate
int i,k,s,t,j,l,n;
int H[M][N],buff[N],s1[N],s2[N];
unsigned code[N];
FILE *fp;
if((fp=fopen("code","wb"))==NULL)
{printf("cannot open this file\n");
exit(0);
}
printf("ok\n");
for(i=0;i<M;i++) // 构造一个400*1000的矩阵
{ for(j=0;j<N;j++)
H[i][j]=0;
}
for(i=0;i<M;i++) //400*1000矩阵赋初值 其中HC 是范围倒400*5;
{ for(j=0;j<dc;j++)
H[i][Hc[i][j]]=1;
}
j=N-1; //j=999;
for(i=M-1;i>0;i--) //i=399;
{ s=i-1;
skip: k=s;
if(H[i][j]==0)
{ while(H[k][j]==0)
{ k--;
if(k<0)
{ j--;
if(j>=0) goto skip; // 这边是为了防止该行的以上每一列都是0,使倒数几行每行的倒数几个数是1
else goto next;
}
}
for(t=0;t<N;t++)
{ buff[t]=H[i][t];
H[i][t]=H[k][t];
H[k][t]=buff[t]; //找出每一行的每一列从下到上的第一个1的列,然后两列交换顺序
}
}
do
{ if(H[s][j]==1) //将每一行与最后一行或相对应的一行进行对消,这样就可以保证每列都会有个零或一个1
{for(t=0;t<N;t++)
H[s][t]=(H[s][t]+H[i][t])%2;
} s--; ////////***///////原来这边有个大的错误s--;}
}while(s>=0);
j--; //循环一遍以后,i--,j--
}
next: for(s=0;s<M;s++) //rank=M-s,但S也不是真正矩阵的秩
{ k=0;
for(j=0;j<N;j++)
{ if(H[s][j]==1) k++;} //测试第一行或者第S+1行才是有1的,即是非0行
if(k!=0) break;
}
// cout<<"\n"<<s<<"\n";
j=N-1;
n=0;
for(i=M-1;i>=s;i--)
{
if(H[i][j]==0)
{ for(t=j-1;t>=0;t--)
if(H[i][t]==1) break;
for(l=0;l<M;l++) //进行列交换,为了中线上都是1
{ buff[l]=H[l][t];
H[l][t]=H[l][j];
H[l][j]=buff[l];
s1[n]=t; //知道是哪两列相互交换的
s2[n]=j;
}
for(t=i-1;t>=0;t--)
{
if(H[t][j]==1)
for(l=0;l<N;l++)
H[t][l]=(H[t][l]+H[i][l])%2;
}
n++;
}
j--;
}
for(j=0;j<N-M+s;j++) //code 010101...000000000设置信息位
{
if(j%2==1)
code[j]=1;
else code[j]=0;
//code[j]=rand()%2;
}
for(j=N-M+s;j<N;j++) //设置校验位?
{code[j]=0;}
for(i=s;i<M;i++) //calculate the check bits
{ for(j=N-1;j>=N-M+s;j--)
{if(H[i][j]==1) break;}
for(k=0;k<j;k++)
{ if(H[i][k]==1)
code[j]=(code[k]+code[j])%2;
}
}
for(i=n-1;i>=0;i--) //位置的交换回来
{ buff[i]=code[s1[i]];
code[s1[i]]=code[s2[i]];
code[s2[i]]=buff[i];
}
for(i=0;i<M;i++) //check code //
{
k=0;
for(j=0;j<dc;j++)
{k=(k+code[Hc[i][j]])%2;}
if(k==1) break;
}
if(k==1)
cout<<"\n"<<i<<"the code is wrong!"<<"\n";
else
cout<<"\n"<<s<<" "<<"the code is right!"<<"\n";
for(i=0;i<N;i++)
printf("%d, ",code[i]);
printf("\n");
for(i=0;i<N;i++)
{
if(fwrite(code+i,4,1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -