📄 16qam.cpp
字号:
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "stdio.h"
#define PI 3.14159
#define LENGTH 60000
struct data
{
double data_re,data_im;
};
void data_produce(int[],int);//产生信源
void maping(int[],data[],int);//将数据映射到星座图
void awgn(data[],double,int);
void soft_dem(data[],double[],int);
void main()
{
double snr;
int i,j;
data resource_data[LENGTH/4];
int data_in[LENGTH];
double data_out[LENGTH];
double pe;
FILE *pfile;
pfile = fopen("data.txt","w");
cout<<"SNR"<<'\t'<<'\t'<<"Pe"<<endl;
for (snr=0;snr<16;snr++)
{
data_produce(data_in,LENGTH);
maping(data_in,resource_data,LENGTH);
awgn(resource_data,snr,LENGTH);
soft_dem(resource_data,data_out,LENGTH);
for (i=j=0;i<LENGTH;i++)
{
if ((data_in[i]==0&&data_out[i]<0)||(data_in[i]==1&&data_out[i]>0))
j++;
}
pe=j/double(i);
fprintf(pfile,"%10.9f\t",pe);
printf("%f\t%10.9f\n",snr,pe);
}
fclose(pfile);
}
void data_produce(int data_in[], int n)//产生信源
{
for( int i = 0; i <n; i ++)
data_in[i] = rand()%2;
}
/********************星座图***********************/
// 0010 0110 * 1110 1010
// 0011 0111 * 1111 1011
// *************************************
// 0001 0101 * 1101 1001
// 0000 0100 * 1100 1000
/****************************************************/
void maping(int data_in[],data resource_data[],int length)//映射到星座图
{
int j;
for(j = 0; j < length/4; j ++)
{
if(data_in[4*j] == 0 && data_in[4*j + 1] == 0 )
{
if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = -3 ;
resource_data[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = -3 ;
resource_data[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = -3 ;
resource_data[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = -3 ;
resource_data[j].data_im = 3 ;
}
}
else if(data_in[4*j] == 0 && data_in[4*j + 1] == 1 )
{
if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = -1 ;
resource_data[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = -1 ;
resource_data[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = -1 ;
resource_data[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = -1 ;
resource_data[j].data_im = 3 ;
}
}
else if(data_in[4*j] == 1 && data_in[4*j + 1] == 1 )
{
if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = 1 ;
resource_data[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = 1 ;
resource_data[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = 1 ;
resource_data[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = 1 ;
resource_data[j].data_im = 3 ;
}
}
else if(data_in[4*j] == 1 && data_in[4*j + 1] == 0 )
{
if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = 3 ;
resource_data[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = 3 ;
resource_data[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
resource_data[j].data_re = 3 ;
resource_data[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
resource_data[j].data_re = 3 ;
resource_data[j].data_im = 3 ;
}
}
}
}
void awgn(data resource_data[], double snr,int length)//加性高斯白噪声
{
int j ;
double u1,u2,u3,u4;
double r1,r2;
double delta;
delta = sqrt(1.25/pow(10,snr/10.0));
for(j = 0; j < length/4; j ++)
{
u1 = (double)(rand()*1.0)/(RAND_MAX+1);
u2 = (double)(rand()*1.0)/(RAND_MAX+1);
u3 = (double)(rand()*1.0)/(RAND_MAX+1);
u4 = (double)(rand()*1.0)/(RAND_MAX+1);
r1=sqrt(2.0*log(1.0/(1.0-u1)))*cos(2*PI*u3);
r2=sqrt(2.0*log(1.0/(1.0-u2)))*cos(2*PI*u4);
resource_data[j].data_re += delta*r1;
resource_data[j].data_im += delta*r2;
}
}
void soft_dem(data resource_data[],double data_out[],int length)//软解调
{
double temp[8];
double min, min1, min0;
int i, j;
for(j = 0; j < length/4; j ++)
{
// 第一位
// min1
temp[0] = pow(resource_data[j].data_re - 3, 2) + pow(resource_data[j].data_im - 3, 2);
temp[1] = pow(resource_data[j].data_re - 3, 2) + pow(resource_data[j].data_im + 3, 2);
temp[2] = pow(resource_data[j].data_re - 3, 2) + pow(resource_data[j].data_im + 1, 2);
temp[3] = pow(resource_data[j].data_re - 3, 2) + pow(resource_data[j].data_im - 1, 2);
temp[4] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im + 1, 2);
temp[5] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im - 1, 2);
temp[6] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im + 3, 2);
temp[7] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im - 3, 2);
min1 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min1 > temp[i])
min1 = temp[i];
}
// min0
temp[0] = pow(resource_data[j].data_re + 3, 2) + pow(resource_data[j].data_im + 3, 2);
temp[1] = pow(resource_data[j].data_re + 3, 2) + pow(resource_data[j].data_im - 3, 2);
temp[2] = pow(resource_data[j].data_re + 3, 2) + pow(resource_data[j].data_im + 1, 2);
temp[3] = pow(resource_data[j].data_re + 3, 2) + pow(resource_data[j].data_im - 1, 2);
temp[4] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im + 1, 2);
temp[5] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im - 1, 2);
temp[6] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im + 3, 2);
temp[7] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im - 3, 2);
min0 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min0 > temp[i])
min0 = temp[i];
}
min = (min1 - min0)/4.0;
data_out[4*j] = min;
// 第二位
// min1
temp[0] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im - 3, 2);
temp[1] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im + 3, 2);
temp[2] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im + 1, 2);
temp[3] = pow(resource_data[j].data_re - 1, 2) + pow(resource_data[j].data_im - 1, 2);
temp[4] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im + 1, 2);
temp[5] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im - 1, 2);
temp[6] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im + 3, 2);
temp[7] = pow(resource_data[j].data_re + 1, 2) + pow(resource_data[j].data_im - 3, 2);
min1 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min1 > temp[i])
min1 = temp[i];
}
// min0
temp[0] = pow(resource_data[j].data_re - 3, 2.0) + pow(resource_data[j].data_im + 3, 2.0);
temp[1] = pow(resource_data[j].data_re - 3, 2.0) + pow(resource_data[j].data_im - 3, 2.0);
temp[2] = pow(resource_data[j].data_re - 3, 2.0) + pow(resource_data[j].data_im + 1, 2.0);
temp[3] = pow(resource_data[j].data_re - 3, 2.0) + pow(resource_data[j].data_im - 1, 2.0);
temp[4] = pow(resource_data[j].data_re + 3, 2.0) + pow(resource_data[j].data_im + 1, 2.0);
temp[5] = pow(resource_data[j].data_re + 3, 2.0) + pow(resource_data[j].data_im - 1, 2.0);
temp[6] = pow(resource_data[j].data_re + 3, 2.0) + pow(resource_data[j].data_im + 3, 2.0);
temp[7] = pow(resource_data[j].data_re + 3, 2.0) + pow(resource_data[j].data_im - 3, 2.0);
min0 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min0 > temp[i])
min0 = temp[i];
}
min = (min1 - min0)/4.0;
data_out[4*j + 1] = min;
// 第三位
// min1
temp[0] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re - 3, 2);
temp[1] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re + 3, 2);
temp[2] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re + 1, 2);
temp[3] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re - 1, 2);
temp[4] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re + 1, 2);
temp[5] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re - 1, 2);
temp[6] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re + 3, 2);
temp[7] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re - 3, 2);
min1 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min1 > temp[i])
min1 = temp[i];
}
// min0
temp[0] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re + 3, 2);
temp[1] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re - 3, 2);
temp[2] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re + 1, 2);
temp[3] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re - 1, 2);
temp[4] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re + 1, 2);
temp[5] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re - 1, 2);
temp[6] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re + 3, 2);
temp[7] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re - 3, 2);
min0 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min0 > temp[i])
min0 = temp[i];
}
min = (min1 - min0)/4.0;
data_out[4*j + 2] = min;
// 第四位
// min1
temp[0] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re - 3, 2);
temp[1] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re + 3, 2);
temp[2] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re + 1, 2);
temp[3] = pow(resource_data[j].data_im + 1, 2) + pow(resource_data[j].data_re - 1, 2);
temp[4] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re + 1, 2);
temp[5] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re - 1, 2);
temp[6] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re + 3, 2);
temp[7] = pow(resource_data[j].data_im - 1, 2) + pow(resource_data[j].data_re - 3, 2);
min1 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min1 > temp[i])
min1 = temp[i];
}
// min0
temp[0] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re + 3, 2);
temp[1] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re - 3, 2);
temp[2] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re + 1, 2);
temp[3] = pow(resource_data[j].data_im + 3, 2) + pow(resource_data[j].data_re - 1, 2);
temp[4] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re + 1, 2);
temp[5] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re - 1, 2);
temp[6] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re + 3, 2);
temp[7] = pow(resource_data[j].data_im - 3, 2) + pow(resource_data[j].data_re - 3, 2);
min0 = temp[0];
for(i = 0; i < 8; i ++)
{
if(min0 > temp[i])
min0 = temp[i];
}
min = (min1 - min0)/4.0;
data_out[4*j + 3] = min;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -