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

📄 16qam.cpp

📁 模拟16QAM调制解调过程(在AWGN信道条件下)
💻 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 + -