📄 lbc.cpp
字号:
// LBC.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "BCHCode.h"
#include<iostream>
#include <cmath>
/*产生(a,b)区间上均匀分布的随机数*/
double uniform(double a,double b,long int *seed)
{
double t;
*seed=2045*(*seed)+1;
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;
return(t);
}
/*产生高斯分布N(mean,sigma)的随机数*/
double gauss(double mean,double sigma,long int *s)
{
int i;
double x,y;
for(x=0,i=0;i<12;i++){
x+=uniform(0.0,1.0,s);
}
x=x-6.0;
y=mean+x*sigma;
return(y);
}
int main(int argc, char* argv[])
{
BCH bch;
double A;// 信号幅度
double sigma;//白噪声方差
long seed = 1000;
int err_cnt,uncode_err_cnt ;
double SNR=0.0;
double err_rate = 0.0;
double uncode_err_rate = 0.0;
vector<double> snr_vec;
vector<double> err_vec;
vector<double> uncode_err_vec;
A = 4.0;
//5 :0.01: 16
for (sigma = 1.0; sigma < 16.000001; sigma += 0.01)
{
err_cnt = 0;
uncode_err_cnt = 0;
//100组一次测试
for (int i = 0; i < 100; i++)
{
//1.信源编码
bvec test;
for (int m = 0; m < 21; m++)
{
//产生随机码元
test.push_back(rand() % 2);
//cout << test[m];
}
//cout << " | ";
//2.BCH(31,21)编码
bvec code;
bch.SysEncode(test,code);
//调制, 上信道, 解调
vector<double> modu;
modu.resize(31);
for (m = 0; m < 31; m++)
{
if (code[m] == 1)
modu[m] = A;
else
modu[m] = -1 * A;
//AWGN
modu[m] += gauss(0, sigma, &seed);
if (modu[m] >= 0.0)
{
if (code[m] != 1)
uncode_err_cnt ++;
code[m] = 1;
}
else
{
if (code[m] != 0)
uncode_err_cnt ++;
code[m] = 0;
}
}
bvec dec;
bch.Decode(code,dec);
for ( m = 0; m < 21; m++)
{
// cout << dec[m];
if (test[m] != dec[m])
{
// cout <<"error!";
err_cnt ++;
}
}
// cout<<endl;
}
err_rate = (double)((double)err_cnt / (double)2100);
uncode_err_rate = (double)((double)uncode_err_cnt / (double)3100);
SNR = 10 * log10(A*A/2/sigma);
cout <<SNR<< "," <<err_rate << endl;
snr_vec.push_back(SNR);
err_vec.push_back(err_rate);
uncode_err_vec.push_back(uncode_err_rate);
}
FILE * fp = fopen("snr.txt", "w");
for(int i = 0;i < snr_vec.size(); i++)
{
fprintf(fp, "%f,",snr_vec[i]);
}
fprintf(fp , "\r\n___________________________________\r\n");
for( i = 0;i < snr_vec.size(); i++)
{
fprintf(fp, "%f,",err_vec[i]);
}
fprintf(fp , "\r\n___________________________________\r\n");
for( i = 0;i < snr_vec.size(); i++)
{
fprintf(fp, "%f,",uncode_err_vec[i]);
}
fclose(fp);
return 0;
}
/*
#include "Polynomial.h"
//计算出H矩阵
int main()
{
int H[10][33] = {{1,0,0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0},
{1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0},
{1,0,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0},
{1,1,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0},
{0,1,1,0,0,0,0,0,1,1,0,1,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0},
{1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0},
{0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0},
{0,0,1,0,1,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1}};
FILE * fp = fopen("s.txt", "w");
int i,j,k;
for (j = 0;j < 31; j++)
{
fprintf(fp, "{");
for(i = 0;i < 10;i++)
{
cout<<H[i][j]<<" ";
fprintf(fp, "%d", H[i][j]);
fprintf(fp,",");
}
fprintf(fp, "%d,%d", j,j);
fprintf(fp, "},");
fprintf(fp,"\r\n");
cout<<endl;
}
cout<<"xxxx"<<endl;
for ( j = 0;j < 30; j++)
for(k=j+1; k<31; k++)
{
fprintf(fp, "{");
for(i = 0;i < 10;i++)
{
if (H[i][j] == H[i][k])
{
fprintf(fp, "%d", 0);
cout<<"0 ";
}
else
{
fprintf(fp, "%d", 1);
cout<<"1 ";
}
fprintf(fp,",");
}
fprintf(fp, "%d,%d", j,k);
cout <<":::"<< j << k<<endl;
fprintf(fp, "},\r\n");
}
fclose(fp);
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -