⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qam.cpp

📁 接收端采用软解调的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 + -