📄 qam.cpp
字号:
#include "16QAM.h"
#include<fstream.h>
void main()
{
fop.open("data.txt");
for(snrin = 0; snrin < 16; snrin += 1)
{
// adopt radom generat function
code_gen();
// adopt mapping function
qam_mapping();
// generate awgn signal
awgn_add();
// soft demodulate
qam_soft_dem();
// output soft information
printer_softinform();
fop<<pe<<'\n';
}
fop.close();
}
/******************function(i) generate source code*************/
void code_gen()
{
long int i;
for(i = 0; i < codenum; i ++)
{
data_in[i] = rand()%2;
}
}
/***************************************************************/
/******************function(ii) mapping*************************/
void qam_mapping()
{
long int j;
for(j = 0; j < codenum/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 )
{
code_source[j].data_re = 1 ;
code_source[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = 3 ;
code_source[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = 3 ;
code_source[j].data_im = 3 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
code_source[j].data_re = 1 ;
code_source[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 )
{
code_source[j].data_re = -1 ;
code_source[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = -3 ;
code_source[j].data_im = 1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = -3 ;
code_source[j].data_im = 3 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
code_source[j].data_re = -1 ;
code_source[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 )
{
code_source[j].data_re = -1 ;
code_source[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = -3 ;
code_source[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = -3 ;
code_source[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
code_source[j].data_re = -1 ;
code_source[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 )
{
code_source[j].data_re = 1 ;
code_source[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 0 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = 3 ;
code_source[j].data_im = -1 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 1 )
{
code_source[j].data_re = 3 ;
code_source[j].data_im = -3 ;
}
else if(data_in[4*j + 2] == 1 && data_in[4*j + 3] == 0 )
{
code_source[j].data_re = 1 ;
code_source[j].data_im = -3 ;
}
}
}
}
/***************************************************************/
/******************function(iii) generate awgn signal***********/
void awgn_add()
{
int j ;
m=65536;
mu=0;//the average of the additive Gaussian white noise
delta = sqrt(1.25/pow(10,snrin/10));//the variable of the AWGN
////////////////////////////////////////////////
r[0]=41;
for(j=0;j<m;j++)
{
r[j+1]=mod(r[j]*2053+13849,m);
rnd[j]=(double)r[j]/m;
}
m=65536;
for(j=0;j<codenum/4;j++)
{
if(j*n>m-n)
break;
awgn_1[j]=mu+delta*(sum(n,rnd,j*n)-n/2)/sqrt((double)n/12);
}
r[0]=0;
for(j=0;j<m;j++)
{
r[j+1]=mod(r[j]*2053+13849,m);
rnd[j]=(double)r[j]/m;
}
m=65536;
for(j=0;j<codenum/4;j++)
{
if(j*n>m-n)
break;
awgn_2[j]=mu+delta*(sum(n,rnd,j*n)-n/2)/sqrt((double)n/12);
}
//////////////////////////////////////////////////
for(j = 0; j < codenum/4; j ++)
{
code_source[j].data_re += awgn_1[j];
code_source[j].data_im += awgn_2[j];
}
}
/***************************************************************/
/******************function(iv) qam soft demodulate*****************/
void qam_soft_dem()
{
double temp[8];
double min, min1, min0;
long int i, j;
for(j = 0; j < codenum/4; j ++)
{
// the first code in I road
// min1
temp[0] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re - 3, 2);
temp[1] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re + 3, 2);
temp[2] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re + 1, 2);
temp[3] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re - 1, 2);
temp[4] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re + 1, 2);
temp[5] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re - 1, 2);
temp[6] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re + 3, 2);
temp[7] = pow(code_source[j].data_im + 1, 2) + pow(code_source[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(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re + 3, 2);
temp[1] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re - 3, 2);
temp[2] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re + 1, 2);
temp[3] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re - 1, 2);
temp[4] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re + 1, 2);
temp[5] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re - 1, 2);
temp[6] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re + 3, 2);
temp[7] = pow(code_source[j].data_im - 1, 2) + pow(code_source[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] = min;
// printf("%f/n",data_out[4*j]);
// the second code in I road
// min1
temp[0] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im - 3, 2);
temp[1] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im + 3, 2);
temp[2] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im + 1, 2);
temp[3] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im - 1, 2);
temp[4] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im + 1, 2);
temp[5] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im - 1, 2);
temp[6] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im + 3, 2);
temp[7] = pow(code_source[j].data_re + 1, 2) + pow(code_source[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(code_source[j].data_re - 3, 2.0)+ pow(code_source[j].data_im + 3, 2.0);
temp[1] = pow(code_source[j].data_re - 3, 2.0) + pow(code_source[j].data_im - 3, 2.0);
temp[2] = pow(code_source[j].data_re - 3, 2.0) + pow(code_source[j].data_im + 1, 2.0);
temp[3] = pow(code_source[j].data_re - 3, 2.0) + pow(code_source[j].data_im - 1, 2.0);
temp[4] = pow(code_source[j].data_re - 1, 2.0) + pow(code_source[j].data_im + 1, 2.0);
temp[5] = pow(code_source[j].data_re - 1, 2.0) + pow(code_source[j].data_im - 1, 2.0);
temp[6] = pow(code_source[j].data_re - 1, 2.0) + pow(code_source[j].data_im + 3, 2.0);
temp[7] = pow(code_source[j].data_re - 1, 2.0) + pow(code_source[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;
// printf("%f/n",data_out[4*j + 1]);
// the first code in Q road
// min1
temp[0] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re - 3, 2);
temp[1] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re + 3, 2);
temp[2] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re + 1, 2);
temp[3] = pow(code_source[j].data_im + 3, 2) + pow(code_source[j].data_re - 1, 2);
temp[4] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re + 1, 2);
temp[5] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re - 1, 2);
temp[6] = pow(code_source[j].data_im - 3, 2) + pow(code_source[j].data_re + 3, 2);
temp[7] = pow(code_source[j].data_im - 3, 2) + pow(code_source[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(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re + 3, 2);
temp[1] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re - 3, 2);
temp[2] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re + 1, 2);
temp[3] = pow(code_source[j].data_im + 1, 2) + pow(code_source[j].data_re - 1, 2);
temp[4] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re + 1, 2);
temp[5] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re - 1, 2);
temp[6] = pow(code_source[j].data_im - 1, 2) + pow(code_source[j].data_re + 3, 2);
temp[7] = pow(code_source[j].data_im - 1, 2) + pow(code_source[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;
// printf("%f/n",data_out[4*j + 2]);
// the second code in Q road
// min1
temp[0] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im - 3, 2);
temp[1] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im + 3, 2);
temp[2] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im + 1, 2);
temp[3] = pow(code_source[j].data_re + 3, 2) + pow(code_source[j].data_im - 1, 2);
temp[4] = pow(code_source[j].data_re - 3, 2) + pow(code_source[j].data_im + 1, 2);
temp[5] = pow(code_source[j].data_re - 3, 2) + pow(code_source[j].data_im - 1, 2);
temp[6] = pow(code_source[j].data_re - 3, 2) + pow(code_source[j].data_im + 3, 2);
temp[7] = pow(code_source[j].data_re - 3, 2) + pow(code_source[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(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im + 3, 2);
temp[1] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im - 3, 2);
temp[2] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im + 1, 2);
temp[3] = pow(code_source[j].data_re + 1, 2) + pow(code_source[j].data_im - 1, 2);
temp[4] = pow(code_source[j].data_re - 1, 2) + pow(code_source[j].data_im + 1, 2);
temp[5] = pow(code_source[j].data_re - 1, 2) + pow(code_source[j].data_im - 1, 2);
temp[6] = pow(code_source[j].data_re - 1, 2) + pow(code_source[j].data_im + 3, 2);
temp[7] = pow(code_source[j].data_re - 1, 2) + pow(code_source[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 + 3] = min;
}
}
/***************************************************************/
/******************function(v)soft information output*****************/
double printer_softinform()//误码率输出
{
long int i,j;
for(i = 0, j = 0; i < codenum; i ++)//统计误码数
{
if((data_in[i] == 0 && data_out[i] < 0)||(data_in[i] == 1 && data_out[i] > 0))
j++;
}
pe = j/(double)codenum;
return(pe);
}
/************************************************** */
int mod(int n,int d)//n的模d运算
{
int y;
y=n-d*(n/d);
return y;
}
double sum(int N,double x[],int initial)
{
double my_sum=0;
for(int i=initial;i<N+initial;i++)
{
my_sum=my_sum+x[i];
}
return my_sum;
}
/************************************************** */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -