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

📄 demodclass.cpp

📁 三种模拟调制与解调的算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DemodClass.cpp: implementation of the DemodClass class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mod_demod.h"
#include "DemodClass.h"
#include "AWGNClass.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DemodClass::DemodClass(CString pnameModel,CString ptypeModel,
					   long vmodelSampleFreq,long vinputSampleFreq,
					   int vtimeStep,CString pnameGetDataFile,
					   CString pnamePutDataFile,int vtypeSignalGen,
					   double vampCarrier,long vfreqCarrier,
					   double vphaseCarrier,double vModPara)
{
	parameter.nameModel=pnameModel;
	parameter.typeModel=ptypeModel;
    parameter.modelSampleFreq=vmodelSampleFreq;
    parameter.inputSampleFreq=vinputSampleFreq;
	parameter.timeStep=vtimeStep;
	parameter.nameGetDataFile=pnameGetDataFile;
	parameter.namePutDataFile=pnamePutDataFile;
    parameter.typeSignalGen=vtypeSignalGen;
    parameter.ampCarrier=vampCarrier;
	parameter.freqCarrier=vfreqCarrier;
    parameter.phaseCarrier=vphaseCarrier;
	parameter.ModPara=vModPara;
}

DemodClass::~DemodClass()
{

}
void DemodClass::run()
{
	switch(parameter.typeSignalGen)
	{
	case 1:
		this->AMDemod();
		break;
	case 2:
		this->FMDemod();
		break;
	case 3:
		this->SSBDemod();
		break;
    case 4:
		this->OOKDemod();
		break;
	case 5:
		this->FSKDemod();
		break;
	case 6:
		this->MSKDemod();
		break;
    case 7:
		this->BPSKDemod();
		break;
	case 8:
		this->QPSKDemod();
		break;
	case 9:
		this->_16QAMDemod();
		break;
    default:
		break;
	}
}
////////////////////////////////////////
void DemodClass::AMDemod()
{
	long i,num_of_scan;
	float *h,*fn,*fn_I,*fn_Q;
	double dt,fln,fhn;
	double BandWidth;
	BandWidth=2*Input_Signal_Freq;
	dt=1.0/parameter.inputSampleFreq;
	num_of_scan=parameter.timeStep/1000.0*parameter.inputSampleFreq;
	

	//BPF,used to filt the noise
    fln=(parameter.freqCarrier-0.5*BandWidth*1.2)/parameter.inputSampleFreq;
	fhn=(parameter.freqCarrier+0.5*BandWidth*1.2)/parameter.inputSampleFreq;
    h=firwin(12768,3,fln,fhn,1);
	if(!h)
	{
		cout<<"Error occured when generate BPF.\n";
		getch();
		exit(1);
	}
	if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
	{
		free(h);
		cout<<"Error occured when save h.dat.\n";
		getch();
		exit(1);
	}
	free(h);
	convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
		    "d:\\temp\\AM_Demod1.dat",32768);
	
	fn=getData("d:\\temp\\AM_Demod1.dat",1,num_of_scan);
	if(!fn)
	{
		cout<<"Cann't read AM_Demod1.dat.\n";
		getch();
	    exit(1);
	}
	for(i=0;i<num_of_scan;i++)
		*(fn+i)=*(fn+i)*2*cos(2*pi*parameter.freqCarrier*i*dt);
	
	if(putData(fn,"d:\\temp\\AM_Demod_I.dat",num_of_scan)==FALSE)
	{
		cout<<"Error occured when create AM_Demod_I.dat\n";
		free(fn);
		getch();
	}
	free(fn);
	
	fn=getData("d:\\temp\\AM_Demod1.dat",1,num_of_scan);
	if(!fn)
	{
		cout<<"Cann't open the input file AM_Demod1.dat.\n";
		getch();
	    exit(1);
	}
	for(i=0;i<num_of_scan;i++)
		*(fn+i)=*(fn+i)*(-2)*sin(2*pi*parameter.freqCarrier*i*dt);
	if(putData(fn,"d:\\temp\\AM_Demod_Q.dat",num_of_scan)==FALSE)
	{
		cout<<"Error occured when create AM_Demod_Q.dat\n";
		free(fn);
		getch();
	}
	free(fn);

	//LPF
	fln=0.5*BandWidth*1.2/parameter.inputSampleFreq;
	h=firwin(12768,1,fln,0,1);
	if(!h)
	{
		cout<<"Error occured when generate LPF fileter\n";
		getch();
		exit(1);
	}
	if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
	{
		free(h);
		cout<<"Error occured when save h.dat.\n";
		getch();
		exit(1);
	}
	free(h);
	convold("d:\\temp\\h.dat","d:\\temp\\AM_Demod_I.dat",
		    "d:\\temp\\AM_Demod_I1.dat",32768);
	convold("d:\\temp\\h.dat","d:\\temp\\AM_Demod_Q.dat",
		    "d:\\temp\\AM_Demod_Q1.dat",32768);


	fn_I=getData("d:\\temp\\AM_Demod_I1.dat",1,num_of_scan);
	if(!fn_I)
	{
		cout<<"Cann't read AM_Demod_I1.dat.\n";
		getch();
	    exit(1);
	}
	fn_Q=getData("d:\\temp\\AM_Demod_Q1.dat",1,num_of_scan);
	if(!fn_Q)
	{
		cout<<"Cann't read AM_Demod_Q1.dat.\n";
		free(fn_I);
		getch();
	    exit(1);
	}
	for(i=0;i<num_of_scan;i++)
		*(fn_I+i)=sqrt(*(fn_I+i)*(*(fn_I+i))+
			           (*(fn_Q+i))*(*(fn_Q+i)))/parameter.ampCarrier-1.0;
		
	free(fn_Q);
	//if(putData(fn_I,"d:\\temp\\AM_Out.dat",num_of_scan)==FALSE)
	if(putData(fn_I,parameter.namePutDataFile,num_of_scan)==FALSE)
	{
		cout<<"Error occured when save file AM_Out.dat\n";
		free(fn_I);
		getch();
		exit(1);
	}
	free(fn_I);
	CFile::Remove("d:\\temp\\h.dat");
	CFile::Remove("d:\\temp\\AM_Demod1.dat");
	CFile::Remove("d:\\temp\\AM_Demod_I.dat");
	CFile::Remove("d:\\temp\\AM_Demod_Q.dat");
	CFile::Remove("d:\\temp\\AM_Demod_I1.dat");
	CFile::Remove("d:\\temp\\AM_Demod_Q1.dat");

	cout<<"AM Demodulate complete\n";
}
///////////////////////////////////////////////////
void DemodClass::FMDemod()
{
	float *fn,*h;
	double dt,BetaFM,BFM;
	long i,num_of_scan;
	double temp_n_1,temp_n,fln,fhn;
    dt=1.0/parameter.inputSampleFreq;
	num_of_scan=parameter.timeStep/1000.0*parameter.inputSampleFreq;
	BetaFM=parameter.ModPara/(2*pi*Input_Signal_Freq);
	BFM=2*(BetaFM+1)*Input_Signal_Freq;
	
	//BPF used to filt noise
	fln=(parameter.freqCarrier-BFM*0.5>0)?(parameter.freqCarrier-BFM*0.5):0;
	fln=fln/parameter.inputSampleFreq;
	fhn=(parameter.freqCarrier+BFM*0.5)/parameter.inputSampleFreq;
	h=firwin(12768,3,fln,fhn,1);
	if(!h)
	{
		cout<<"Error occured when generate BPF.\n";
		getch();
		exit(1);
	}
	if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
	{
		free(h);
		cout<<"Error occured when save h.dat.\n";
		getch();
		exit(1);
	}
	free(h);
	convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
			"d:\\temp\\FM_Demod1.dat",32768);

	
    fn=getData("d:\\temp\\FM_Demod1.dat",1,num_of_scan);
	if(!fn)
	{
		cout<<"Error occured when read FM_Demod1.dat.\n";
		getch();
		exit(1);
	}
	if(phasedetect(fn,parameter.freqCarrier,dt,
			    num_of_scan,"d:\\temp\\FM_Phase.dat")==FALSE)
	{
		free(fn);
		cout<<"Error occured when detect phase.\n";
		getch();
		exit(1);
	}
	free(fn);

	fn=getData("d:\\temp\\FM_Phase.dat",1,num_of_scan);
	if(!fn)
	{
		cout<<"Error occured when read FM_Phase.dat.\n";
		getch();
		exit(1);
	}
	temp_n=*fn;
	*fn=temp_n*parameter.inputSampleFreq/parameter.ModPara;
	for(i=1;i<num_of_scan;i++)
	{
		temp_n_1=temp_n;
		temp_n=*(fn+i);
		*(fn+i)=(temp_n-temp_n_1)*parameter.inputSampleFreq/parameter.ModPara;
	}
	if(putData(fn,"d:\\temp\\temp.dat",num_of_scan)==FALSE)
	{
		free(fn);
		cout<<"Error occured when save temp.dat\n";
		getch();
		exit(1);
	}
	free(fn);

	//LPF filter
	fln=Input_Signal_Freq*1.2/parameter.inputSampleFreq;
	h=firwin(12768,1,fln,0,1);
	if(!h)
	{
		cout<<"Error occured when generate LPF filter.\n";
		getch();
		exit(1);
	}
	if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
	{
		free(h);
		cout<<"Error occured when save h.dat.\n";
		getch();
		exit(1);
	}
	free(h);
	convold("d:\\temp\\h.dat","d:\\temp\\temp.dat",
		    parameter.namePutDataFile,32768);
	CFile::Remove("d:\\temp\\FM_Demod1.dat");
	CFile::Remove("d:\\temp\\FM_Phase.dat");
	CFile::Remove("d:\\temp\\temp.dat");
	CFile::Remove("d:\\temp\\h.dat");

    cout<<"FM Demodulate complete.\n";

}
//////////////////////////////////////////////
void DemodClass::SSBDemod()
{
		float	*fn_i,*fn_q,*h;
		double	fln,fhn;
		double	dt=1.0/parameter.inputSampleFreq;
		long	i,num_of_scan;
	
		
		num_of_scan=(long) parameter.timeStep/1000.0*parameter.inputSampleFreq;
	   
		//BPF used to filt noise
		//the SSB modulation is lower band 
		fln=(parameter.freqCarrier-Input_Signal_Freq*1.2)/parameter.inputSampleFreq;
		fhn=parameter.freqCarrier*1.005/parameter.inputSampleFreq;
		h=firwin(12768,3,fln,fhn,1);
		if(!h)
		{
			cout<<"Error occured when generate BPF.\n";
			getch();
			exit(1);
		}
		if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
		{
			free(h);
			cout<<"Error occured when save h.dat.\n";
			getch();
			exit(1);
		}
		free(h);
		convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
				"d:\\temp\\SSB_Demod1.dat",32768);
		
		
		fn_i=getData("d:\\temp\\SSB_Demod1.dat",1,num_of_scan);
		if(!fn_i)
		{
			cout<<"Error occured when read SSB_Demod1.dat.\n";
			getch();
		    exit(1);
		}
		for(i=0;i<num_of_scan;i++) 
			*(fn_i+i)=*(fn_i+i)*cos(2*pi*parameter.freqCarrier*i*dt+parameter.phaseCarrier);
		fn_q=getData("d:\\temp\\SSB_Demod1.dat",1,num_of_scan);
        if(!fn_q)
		{
			cout<<"Error occured when read file SSB_Demod1.dat.\n";
			free(fn_i);
			getch();
            exit(1);
		}
		if(hilbth(fn_q,num_of_scan,"d:\\temp\\temp.dat")==FALSE)
		{
			cout<<"Error occured when do hilbert transate.\n";
			free(fn_i);
			free(fn_q);
			getch();
			exit(1);
		}
		fn_q=getData("d:\\temp\\temp.dat",1,num_of_scan);
		if(!fn_q)
		{
			cout<<"Error occured when read temp.dat.\n";
			free(fn_i);
			getch();
			exit(1);
		}
        for(i=0;i<num_of_scan;i++)
			*(fn_q+i)=*(fn_q+i)*sin(2*pi*parameter.freqCarrier*i*dt+parameter.phaseCarrier);
		for(i=0;i<num_of_scan;i++)
			*(fn_q+i)+=(*(fn_i+i));
		free(fn_i);
		if(putData(fn_q,"d:\\temp\\SSB_Demod_Sec.dat",num_of_scan)==FALSE)
		{
			cout<<"Error occured when save SSB_Demod_Sec.dat";
			free(fn_q);
			getch();
			exit(1);
		}
		free(fn_q);

		//LPF filter;
		fln=Input_Signal_Freq*1.2/parameter.inputSampleFreq;
		h=firwin(12768,1,fln,0,1);
		if(!h)
		{
			cout<<"Error occured when generate the LPF.\n";
			getch();
			exit(1);
		}
		if(putData(h,"D:\\temp\\h.dat",12769)==FALSE)
		{
			free(h);
			cout<<"Error occured when save h.dat.\n";
			getch();
			exit(1);
		}
		free(h);
		convold("D:\\temp\\h.dat","D:\\temp\\SSB_Demod_Sec.dat",
				parameter.namePutDataFile,32768);
		CFile::Remove("d:\\temp\\h.dat");
		CFile::Remove("d:\\temp\\SSB_Demod1.dat");
		CFile::Remove("D:\\temp\\SSB_Demod_Sec.dat");
		CFile::Remove("d:\\temp\\temp.dat");
		cout<<"SSB demodulate complete.\n";
}
////////////////////////////////
void DemodClass::OOKDemod()
{
	cout<<"Undefined.\n";
	getch();
}
void DemodClass::FSKDemod()
{
	cout<<"Undefined.\n";
	getch();
}
void DemodClass::MSKDemod()
{
	cout<<"Undefined.\n";
	getch();
}
void DemodClass::BPSKDemod()
{
	cout<<"Undefined.\n";
	getch();
}
void DemodClass::QPSKDemod()
{
	cout<<"Undefined.\n";
	getch();
}	
void DemodClass::_16QAMDemod()
{
	cout<<"Undefined.\n";
	getch();
}	
void DemodClass::bitSynch()
{
	cout<<"Undefined.\n";
	getch();
}
/////////////////////////////
double DemodClass::window(int type,int n,int i)
{
	double w;
	w=1.0;
	switch(type)
	{
        case 1:
			{ w=0.54-0.46*cos(2*i*pi/(n-1));
			  break;
			}
		case 2:
			{ w=0.5*(1.0-cos(2*i*pi/(n-1)));
			  break;
			}
		case 3:
			{ w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));
			  break;
			}
		
	}
	return(w);
}
///////////////////////////////////////////////////////
float *DemodClass::firwin(int n,int band,double fln,double fhn,int wn)
{
 //n	滤波器的阶数
 //band 滤波器类型,1--低通,2--高通,3--带通,4--带阻
 //fln,对于低通和高通滤波器:通带边界频率,对于带通和带阻
 //fln:通带下边界频率,fhn:通带上边界频率
 //wn  窗函数类型:1--海明窗,2--汉宁窗,3--布拉克曼窗
 //h   一个指针,指向返回的h(n)
 //若失败,则返回一个空指针(NULL)
 int i,n2,mid;
 double s,wc1,wc2,delay;
 float *h;
 h=(float *) malloc((n+1)*sizeof(float));
 if(!h) return NULL;
 if((n%2)==0)
 {
	 n2=n/2-1;
	 mid=1;
 }
 else
 {
	 n2=n/2;
	 mid=0;
 }
 delay=n/2.0;
 wc1=2.0*pi*fln;
 if(band>=3)
	 wc2=2.0*pi*fhn;
 switch(band)
 {  
    case 1:
		{ 
			for(i=0;i<=n2;i++)
			{ s=i-delay;
			  *(h+i)=(sin(wc1*s)/(pi*s))*window(wn,n+1,i);
			  *(h+n-i)=*(h+i);
			}
			if(mid==1)
		      *(h+n/2)=wc1/pi;
			break;
		}
	case 2:
		{ 
			for(i=0;i<=n2;i++)
			{ s=i-delay;
			  *(h+i)=(sin(pi*s)-sin(wc1*s))/(pi*s);
			  *(h+i)=*(h+i)*window(wn,n+1,i);
			  *(h+n-i)=*(h+i);
			}
			if(mid==1)
		      *(h+n/2)=1.0-wc1/pi;
			break;
		}
    case 3:
		{ 
			for(i=0;i<=n2;i++)
			{ s=i-delay;
			  *(h+i)=(sin(wc2*s)-sin(wc1*s))/(pi*s);
			  *(h+i)=*(h+i)*window(wn,n+1,i);
			  *(h+n-i)=*(h+i);
			}
			if(mid==1)
		      *(h+n/2)=(wc2-wc1)/pi;
			break;
		}
   case 4:
		{ 
			for(i=0;i<=n2;i++)
			{ s=i-delay;
			  *(h+i)=(sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s);
			  *(h+i)=*(h+i)*window(wn,n+1,i);
			  *(h+n-i)=*(h+i);
			}
			if(mid==1)
		      *(h+n/2)=(wc1+pi-wc2)/pi;
			break;
		}
 }
 return h;
}
/////////////////////////////////////////
float *DemodClass::getData(CString filename,long start_point,long num_of_points)
{
	//函数功能:将文件中的数据读到一个指针中,并返回该指针
	//filename:文件
	//start_point,起始位置
	//num_of_points,数据点数
	//若读取成功,则返加一个非空指针,否则,返回一个空指针
	CFile	inf(filename,CFile::modeRead);
	float	*fpointer;
	long    num_of_data;
    if (!inf) return NULL;
	num_of_data=inf.GetLength()/sizeof(float);
    if ((start_point<=0)||(num_of_points<=0)||
        (num_of_points>num_of_data)||
		(start_point>num_of_data)||
	    (start_point+num_of_points-1>num_of_data))
		return NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -