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

📄 modbaseclass.cpp

📁 三种模拟调制与解调的算法
💻 CPP
字号:
// ModBaseClass.cpp: implementation of the ModBaseClass class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mod_demod.h"
#include "ModBaseClass.h"

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

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

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

ModBaseClass::~ModBaseClass()
{

}
float *ModBaseClass::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;
    fpointer=(float *) malloc(num_of_points*sizeof(float));
	if (!fpointer) return NULL;
	if(inf.Seek(CFile::begin,(start_point-1)*sizeof(float))!=
	   (start_point-1)*sizeof(float))
	   return NULL;
    if (inf.ReadHuge(fpointer,num_of_points*sizeof(float))!=num_of_points*sizeof(float))
	{
		inf.Close();
		return NULL;
	}
	else {
		inf.Close();
		return fpointer;
	}
}
//////////////////////////////
bool ModBaseClass::putData(float *outdata,CString out_put_filename,long length)
{
	//函数功能:保存数据
	//outdata:指向待保存的数据的指针,以END_FLAG作为结束标志
	//out_put_filename:保存数据的文件名
	//length,数据长度
	//若保存成功,则返回TRUE,否则返回FALSE
	CFile outf(out_put_filename,
		       CFile::modeCreate|CFile::modeWrite);
	if (!outf) return FALSE;
	outf.WriteHuge(outdata,length*sizeof(float));
	outf.Close();
	return TRUE;
}
void ModBaseClass::fht(float *x,long n)
{
	long	i,j,k,m,l1,l2,l3,l4,n1,n2,n4;
	double	a,e,c,s,t,t1,t2;
	for(j=1,i=1;i<32;i++)
	{
		m=i;
		j=2*j;
		if(j==n)
			break;
	}
	n1=n-1;
	for(j=0,i=0;i<n1;i++)
	{
		if(i<j)
		{
			t=*(x+j);
			*(x+j)=*(x+i);
			*(x+i)=t;
		}
		k=n/2;
		while(k<(j+1))
		{
			j=j-k;
			k=k/2;
		}
		j=j+k;
	}
	for(i=0;i<n;i+=2)
	{
		t=*(x+i);
		*(x+i)=t+(*(x+i+1));
		*(x+i+1)=t-(*(x+i+1));
	}
	n2=1;
	for(k=2;k<=m;k++)
	{
		n4=n2;
		n2=n4+n4;
		n1=n2+n2;
		e=6.283185307179586/n1;
		for(j=0;j<n;j+=n1)
		{
			l2=j+n2;
			l3=j+n4;
			l4=l2+n4;
			t=*(x+j);
			*(x+j)=t+(*(x+l2));
			*(x+l2)=t-(*(x+l2));
			t=*(x+l3);
			*(x+l3)=t+(*(x+l4));
			*(x+l4)=t-(*(x+l4));
			a=e;
			for(i=1;i<n4;i++)
			{
				l1=j+i;
				l2=j-i+n2;
			    l3=l1+n2;
			    l4=l2+n2;
                c=cos(a);
				s=sin(a);
				t1=*(x+l3)*c+(*(x+l4))*s;
				t2=*(x+l3)*s-(*(x+l4))*c;
				a=(i+1)*e;
				t=*(x+l1);
			    *(x+l1)=t+t1;
				*(x+l3)=t-t1;
				t=*(x+l2);
				*(x+l2)=t+t2;
				*(x+l4)=t-t2;
			}
		}
	}
}

bool ModBaseClass::hilbth(float *x,long n,CString out_put_filename)
{
	//希尔波特变换
	//x,指向等待进行变换的数据
	//n,数据点数
	//out_put_filename,卷积后保存输出数据的文件名
	//若成功,返回TRUE,否则,返回FALSE
	long i,n1,n2;   
	double t;

	bool flag;
	long temp_n;
	
	temp_n=1;
	while(temp_n<n) temp_n*=2;
	if(temp_n>n)
	{
		x=(float *)realloc(x,temp_n*sizeof(float));
		if(!x)
		{
			free(x);
			return FALSE;
		}
		for(i=n;i<temp_n;i++) 
			*(x+i)=0;
	    n1=n;
		n=temp_n;
		temp_n=n1;
		flag=TRUE;
	}
	else flag=FALSE;
	
	n1=n/2;
	n2=n1+1;
	fht(x,n);
	for(i=1;i<n1;i++)
	{
		t=*(x+i);
		*(x+i)=*(x+n-i);
		*(x+n-i)=t;
	}
	for(i=n2;i<n;i++)
		*(x+i)=-(*(x+i));
	*x=0.0;
	*(x+n1)=0.0;
	fht(x,n);
	t=1.0/n;
	for(i=0;i<n;i++)
		*(x+i)*=t;
	
	if(flag)
	{
		x=(float *)realloc(x,(temp_n*sizeof(float)));
		if(!x)
		{
			free(x);
			return FALSE;
		}
	}
	if(putData(x,out_put_filename,temp_n)==FALSE)
		return FALSE;
    free(x);
	return TRUE;
}
/////////////////////////////////////////
float *ModBaseClass::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;
}
////////////////////////////////////////////
double ModBaseClass::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);
}
/////////////////////////////////////////
void ModBaseClass::convold(CString hfname,CString xfname,CString yfname,long n)
{
long  i,j,m,i1,n2,len,num,nblks;
	double t;
	float *h,*r,*s,*x;
	CFile fp,fp1,fp2;
	long  x_length;
    
    fp1.Open(xfname,CFile::modeRead);
	if(!fp1)	exit(1);
	fp2.Open(yfname,CFile::modeCreate|CFile::modeWrite);
	if(!fp1)
	{
		fp1.Close();
		exit(1);
	}
	x_length=fp1.GetLength()/sizeof(float);
    x=(float *)malloc(x_length*sizeof(float));
	if(!x)
	{
		fp1.Close();
		fp2.Close();
		exit(1);
	}
	r=(float* )malloc(n*sizeof(float));
	if(!r)
	{
		free(x);
		fp1.Close();
		fp2.Close();
		exit(1);
	}
	h=(float* )malloc(n*sizeof(float));
    if(!h)
	{
		free(x);
		fp1.Close();
		fp2.Close();
		free(r);
		exit(1);
	}
	n2=n/2;
	fp.Open(hfname,CFile::modeRead);
	if(!fp)
	{
		free(x);
		fp1.Close();
		fp2.Close();
		free(r);
		free(h);
		exit(1);
	}
	m=fp.GetLength()/sizeof(float);
	if(fp.ReadHuge(h,m*sizeof(float))!=m*sizeof(float))
	{
		free(x);
		fp1.Close();
		fp2.Close();
		free(r);
		free(h);
		exit(1);
	}
	fp.Close();
	for(i=m;i<n;i++)   
	{
		h[i]=0.0;
	}
	rfft(h,n);
	s=(float* )malloc((m-1)*sizeof(float));
	if(!s)
	{
		free(x);
		fp1.Close();
		fp2.Close();
		free(r);
		free(h);
		exit(1);
	}
	for(i=0;i<m-1;i++)
	   s[i]=0.0;
	num=n-m+1;
	len=x_length;
	
	if(fp1.ReadHuge(x,len*sizeof(float))!=len*sizeof(float))
	{
		free(x);
		fp1.Close();
		fp2.Close();
		free(r);
		free(h);
		exit(1);
	}
	fp1.Close();
		nblks=floor((len-n+m)/(double)num)+1;
	for(j=0;j<nblks;j++)
	{
		for(i=0;i<num;i++)
		{
			i1=i+j*num;
			r[i]=x[i1];
		}
		for(i=num;i<n;i++)
		{
			r[i]=0;
		}		
		rfft(r,n);
		r[0]=r[0]*h[0];
		r[n2]=r[n2]*h[n2];
		for(i=1;i<n2;i++)
		{
			t=h[i]*r[i]-h[n-i]*r[n-i];
			r[n-i]=h[i]*r[n-i]+h[n-i]*r[i];
			r[i]=t;
		}
		irfft(r,n);
		
		for(i=0;i<(m-1);i++)
		{
			r[i]+=s[i];
		}
		for(i=0;i<num;i++)
		{
			i1=i+j*num;
			x[i1]=r[i];
		}
		for(i=0;i<(m-1);i++)
		{
			s[i]=r[i+num];
		}	

	}
	i1=j*num;
	fp2.WriteHuge((x+(m-1)/2),(i1-(m-1)/2)*sizeof(float));
	fp2.Write(s,(m-1)/2*sizeof(float));
   	 fp2.Close();
	free(r);
	free(s);
	free(h);
	free(x);

}
/////////////////////////////
void ModBaseClass::rfft(float *x,long n)
{
	long	i,j,k,m,i1,i2,i3,i4,n1,n2,n4;
	double	a,e,cc,ss,xt,t1,t2;
	for(j=1,i=1;i<32;i++)
	{
		m=i;
		j=2*j;
		if(j==n)
			break;
	}
	n1=n-1;
	for(j=0,i=0;i<n1;i++)
	{
		if(i<j)
		{
			xt=x[j];
			x[j]=x[i];
			x[i]=xt;
		}
		k=n/2;
		while(k<(j+1))
		{
			j=j-k;
			k=k/2;
		}
	    j=j+k;
	}
	for(i=0;i<n;i+=2)
	{
		xt=x[i];
		x[i]=xt+x[i+1];
		x[i+1]=xt-x[i+1];
	}
	n2=1;
	for(k=2;k<=m;k++)
	{
		n4=n2;
		n2=2*n4;
		n1=2*n2;
		e=6.28318530718/n1;
		for(i=0;i<n;i+=n1)
		{
			xt=x[i];
			x[i]=xt+x[i+n2];
			x[i+n2]=xt-x[i+n2];
			x[i+n2+n4]=-x[i+n2+n4];
			a=e;
			for(j=1;j<=(n4-1);j++)
			{
				i1=i+j;
				i2=i-j+n2;
				i3=i+j+n2;
				i4=i-j+n1;
				cc=cos(a);
				ss=sin(a);
				a=a+e;
				t1=cc*x[i3]+ss*x[i4];
				t2=ss*x[i3]-cc*x[i4];
				x[i4]=x[i2]-t2;
				x[i3]=-x[i2]-t2;
				x[i2]=x[i1]-t1;
				x[i1]=x[i1]+t1;
			}
		}
	}
}
////////////////////////////////////////
void ModBaseClass::irfft(float *x,long n)
{
	long i,j,k,m,i1,i2,i3,i4,i5,i6,i7,i8,n2,n4,n8,id,is;
	double a,e,a3,t1,t2,t3,t4,t5,cc1,cc3,ss1,ss3;
	for(j=1,i=1;i<32;i++)
	{
		m=i;
		j=2*j;
		if(j==n)
			break;
	}
	n2=2*n;
	for(k=1;k<m;k++)
	{
		is=0;
		id=n2;
		n2=n2/2;
		n4=n2/4;
		n8=n4/2;
		e=6.28318530718/n2;
		do
		{
			for(i=is;i<n;i+=id)
			{
				i1=i;
				i2=i1+n4;
				i3=i2+n4;
				i4=i3+n4;
				t1=x[i1]-x[i3];
				x[i1]=x[i1]+x[i3];
				x[i2]=2*x[i2];
				x[i3]=t1-2*x[i4];
				x[i4]=t1+2*x[i4];
				if(n4==1) 
					continue;
				i1+=n8;
				i2+=n8;
				i3+=n8;
				i4+=n8;
				t1=(x[i2]-x[i1])/sqrt(2.0);
				t2=(x[i4]+x[i3])/sqrt(2.0);
				x[i1]=x[i1]+x[i2];
				x[i2]=x[i4]-x[i3];
				x[i3]=2*(-t2-t1);
				x[i4]=2*(-t2+t1);
			}
			is=2*id-n2;
			id=4*id;
		}while(is<(n-1));
		a=e;
		for(j=1;j<n8;j++)
		{
			a3=3*a;
			cc1=cos(a);
			ss1=sin(a);
			cc3=cos(a3);
			ss3=sin(a3);
			a=(j+1)*e;
			is=0;
			id=2*n2;
			do
			{
				for(i=is;i<=(n-1);i=i+id)
				{
					i1=i+j;
					i2=i1+n4;
					i3=i2+n4;
					i4=i3+n4;
					i5=i+n4-j;
					i6=i5+n4;
					i7=i6+n4;
					i8=i7+n4;
					t1=x[i1]-x[i6];
					x[i1]=x[i1]+x[i6];
					t2=x[i5]-x[i2];
					x[i5]=x[i5]+x[i2];
					t3=x[i8]+x[i3];
					x[i6]=x[i8]-x[i3];
					t4=x[i4]+x[i7];
					x[i2]=x[i4]-x[i7];
					t5=t1-t4;
					t1=t1+t4;
					t4=t2-t3;
					t2=t2+t3;
					x[i3]=t5*cc1+t4*ss1;
					x[i7]=-t4*cc1+t5*ss1;
					x[i4]=t1*cc3-t2*ss3;
					x[i8]=t2*cc3+t1*ss3;
				}
				is=2*id-n2;
				id=4*id;
			}while(is<(n-1));
		}
	}
	is=0;
	id=4;
	do
	{
		for(i=is;i<n;i=i+id)
		{
			i1=i+1;
			t1=x[i];
			x[i]=t1+x[i1];
			x[i1]=t1-x[i1];
		}
		is=2*id-2;
		id=4*id;
	}while(is<(n-1));
	for(j=0,i=0;i<(n-1);i++)
	{
		if(i<j)
		{
			t1=x[j];
			x[j]=x[i];
			x[i]=t1;
		}
		k=n/2;
		while(k<(j+1))
		{
			j=j-k;
			k=k/2;
		}
		j=j+k;
	}
	for(i=0;i<n;i++)
		x[i]=x[i]/n;
}
////////////////////////////////////

⌨️ 快捷键说明

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