www.pudn.com > 16QAMsoftdemodulation.rar > 16_QAM.cpp


#include 
#include 
#include   
#include 
#define data_len 10000             //仿真所用数据总的比特数目 
#define code_len data_len/4       //仿真所用数据总的码元数目 
#define pi 3.1415926 
//用结构体定义复数  
    struct complex                 
	{  
	    double Real;              //实部  
        double Imag;              //虚部  
	};  
 
//A、B是复数,此函数用来计算|A-B|^2的值 
    double abs(struct complex a,struct complex b) 
	{ 
		return((a.Real-b.Real)*(a.Real-b.Real)+(a.Imag-b.Imag)*(a.Imag-b.Imag)); 
	}; 
 
 
void main() 
{    
	float SNR=-18;                               //输入信噪比(dB) 
	double coef_AWGN=sqrt(5/pow(10,SNR/10));    //乘AWGN噪声(0,1)用于产生所需要的噪声功率 
	int data[data_len];                         //存放仿真所用0 1 数据 
	int receive_data[data_len];                 //存放经判决后的数据 
        srand(time(0));                             //产生随机数的种子 
 
       //产生随机数存放在data数组里面 
	for(int i=0;i0) 
			R[i]=Y[i]/2147483563; 
		else  
			R[i]=2147483562.0/2147483563.0; 
		//printf("\n%f",R[i]); 
	} 
		//i=2*code_len-1 
		Y[i]=fmod((noise_I[i]-noise_Q[i]),2147483562); 
			while(Y[i]<0) 
		{ 
			Y[i]=Y[i]+2147483562; 
		} 
		if(Y[i]>0) 
			R[i]=Y[i]/2147483563; 
		else  
			R[i]=2147483562.0/2147483563.0; 
	 
 
 
 
    for(i=0;i0)receive_data[4*i]=0; 
		else  receive_data[4*i]=1; 
			 
		if(LLR_BQ1[i]>0)receive_data[4*i+1]=0; 
		else  receive_data[4*i+1]=1; 
	                 
        if(LLR_BI2[i]>0)receive_data[4*i+2]=0; 
		else  receive_data[4*i+2]=1; 
		               
        if(LLR_BQ2[i]>0)receive_data[4*i+3]=0; 
		else  receive_data[4*i+3]=1; 
	} 
 
        //将发送数据和接收数据同时输出 
        for(i=0;i