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

📄 demodclass.cpp

📁 三种模拟调制与解调的算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 DemodClass::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 DemodClass::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 DemodClass::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;
}
/////////////////////////////////////////
void DemodClass::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 DemodClass::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 DemodClass::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;
}
////////////////////////////////////
bool  DemodClass::phasedetect(float *inData,long fc,double dt,long length,CString outfile_name)

//相位检测;
//所需参数:全局变量载波频率fc;
//输入参数:输入信号指针 *inData;
//			采样时间步长 dt;
//			信号采样点数 length;
//输出参数:返回载波相位的指针 *outData。			
{
	double	a[2][2],b[2],c[2],d, x[2],filterBuffer[2],DataBeforFilter,t1,t2,k;
	long	i;
	double	fn;
	float	*outData;

    outData=(float *)malloc(length*sizeof(float));
	if(!outData) return FALSE;

	fn=fc*1.0/40.0;
	t1=0.01/fc;
	t2=1/(2*pi*fn);
	k=2*pi*fn;
 
	a[0][0]=-1*1/t2;
	a[0][1]=0;
	a[1][0]=1;
	a[1][1]=0;

	b[0]=1;
	b[1]=0;
 
	c[0]=t1/t2;
	c[1]=k/t2;

	d=0;

	filterBuffer[0]=0;
	filterBuffer[1]=0;

	for (i=0;i<length;i++)
	{ 
		*(outData+i)=c[0]*filterBuffer[0]+c[1]*filterBuffer[1];   
		DataBeforFilter=(*(inData+i))*sin(2*pi*fc*i*dt+(*(outData+i)));
		x[0]=filterBuffer[0]+dt*(a[0][0]*filterBuffer[0]+
								 a[0][1]*filterBuffer[1]+
								 b[0]*DataBeforFilter);
		x[1]=filterBuffer[1]+dt*(a[1][0]*filterBuffer[0]+
							     a[1][1]*filterBuffer[1]+
								 b[1]*DataBeforFilter);
		filterBuffer[0]=x[0];
		filterBuffer[1]=x[1];
	}
	if(putData(outData,outfile_name,length)==FALSE)
	{
		free(outData);
		return FALSE;
	}
	else 
	{
		free(outData);
		return TRUE;
	}
 }

///////////////////////////////////

⌨️ 快捷键说明

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