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

📄 stucodeinfo.cpp

📁 基于MFC
💻 CPP
字号:
// StuCodeInfo.cpp: implementation of the StuCodeInfo class.
//
//////////////////////////////////////////////////////////////////////
#include "math.h"
#include "string.h"
#include "stdafx.h"
#include "ASk.h"
#include "StuCodeInfo.h"


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

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

StuCodeInfo::StuCodeInfo()
{
    n=ceil(log(16*F)/log(2));
    m=pow(2,n);
	for(int k=0;k<=16*F-1;k++)
	{
		No[k]=0.0;
	}
}

StuCodeInfo::~StuCodeInfo()
{

}


void StuCodeInfo::D_transfer_H()//产生基带信号
{
   int th;
   for(int j=0;j<=15;j++)
   {
   S0[j]=-1;
   }
	for(int i=3;i>=0;i--)
	{
		if(c/pow(10,i)>=1)
		  { 
			 th=c/pow(10, i);
			 for(int j=3;j>=0;j--)
			 {
				 if(th>=pow(2,j))
				 {
				 S0[(4*(4-i)-1)-j]=1;
				 th=th-pow(2,j);
				 }

			 }
			
		  }
		int mid=pow(10,i);
		c=c%mid;
	}
	
		    
}

void StuCodeInfo::Sample()//采样过程
{
	for(int j=0;j<=15;j++)
	{
        for(int k=0;k<=39;k++)
		{
			if(S0[j]==-1)
			{
                Sa[40*j+k]=-1;
			}
			else Sa[40*j+k]=1;
		}
	}
}



void StuCodeInfo::Lpf1()//低通滤波1
{
    double SaTem[16*F+N-1]={0.0};//卷积过程中的临时值(16*F+N-1个)
	int a=(N-1)/2;//以下是理想带通滤波器
	double hd[N]={0.0};//理想滤波器时域信号
	double RN[N]={0.0};//矩形窗
	double h[N]={0.0};//实际滤波器
	for(int k=0;k<=N-1;k++)
	{
		if (k==a) hd[k]=1.0;//////////////////////////////////////////////////////////////应为1还是0.25?
	    else hd[k]=sin((2*PI*Ft/Fs)*(k-a))/(PI*(k-a));//以上是理想低通滤波器
	}
	 for (int m=0;m<=N-1;m++)//以下是矩形窗
	 {
		 RN[m]=1.0;
	 }//以上是矩形窗
 
    for(int g=0;g<=N-1;g++)
	{
       h[g]=hd[g]*RN[g];
	}


	/////////////以下为卷积过程
	for (int i=0;i<=(16*F+N-2);i++)
	{
		if(i<=(N-2))
		{
			for(int j=0;j<=i;j++)
            SaTem[i]+=Sa[i-j]*h[j];
		}
		if(i>=(N-1)&&i<=(16*F-1))
		{
			for(int j=0;j<=i;j++)
			{
				{
					if(j>=N) continue;
				    SaTem[i]+=Sa[i-j]*h[j];
				}
			
			}
		}
		if(i>=16*F)
		{
			for(int j=0;j<=i;j++)
			{
				{
				if(j>=N||(i-j)>=16*F) continue;
				SaTem[i]+=Sa[i-j]*h[j];
				}

			}
		}
	}
	/////////////以上为卷积过程
	//////////////////////////////以下为卷积截断
	for(int j=0;j<=16*F-1;j++)
	{
		Sa[j]=SaTem[j+a]/2;
	}
	//////////////////////////////以上为卷积截断
	
}

void StuCodeInfo::Modulate() //调制函数
{
    for(int g=0;g<=16*F-1;g++ ) 
	{
        Sa[g]=Sa[g]*cos(2*PI*g*Fc/Fs);
	}
}

void StuCodeInfo::Noise()
{

	for(int i=0;i<=16*F-1;i++)
	{
		for(int j=0;j<=12;j++)
		{
		
	    double r=rand();
        double ri=(r-RAND_MAX/2)/(RAND_MAX/2);
	    No[i]+=b*ri/2;
		}
	}

}

void StuCodeInfo::Channel()//信道加噪函数
{
	for(int i=0;i<=16*F-1;i++)
	{
       Sa[i]=Sa[i]+No[i];
	}
     
}


void StuCodeInfo::Bpf()//带通滤波
{
    double SaTem[16*F+N-1]={0.0};//卷积过程中的临时值(16*F+N-1个)
	int a=(N-1)/2;//以下是理想带通滤波器
	double hd[N]={0.0};//理想滤波器时域信号
	double RN[N]={0.0};//矩形窗
	double h[N]={0.0};//实际滤波器
	for(int k=0;k<=N-1;k++)
	{
	    if (k==a) hd[k]=1.0;///////////////////////////////////////////////////////////////////////////////////////应为1还是0.25?
	    else hd[k]=(sin(2*PI*Fbc*(k-a)/Fs)-sin(2*PI*Fbf*(k-a)/Fs))/(double)(PI*(k-a));//以上是理想带通滤波器
	}
	 for (int m=0;m<=N-1;m++)//以下是矩形窗
	 {
		 RN[m]=1.0;
	 }//以上是矩形窗
 
    for(int g=0;g<=N-1;g++)
	{
       h[g]=hd[g]*RN[g];
	}


	/////////////以下为卷积过程  
	for (int i=0;i<=(16*F+N-2);i++)
	{
		if(i<=(N-2))
		{
			for(int j=0;j<=i;j++)
            SaTem[i]+=Sa[i-j]*h[j];
		}
		if(i>=(N-1)&&i<=(16*F-1))
		{
			for(int j=0;j<=i;j++)
			{
				{
					if(j>=N) continue;
				   SaTem[i]+=Sa[i-j]*h[j];
				}
			
			}
		}
		if(i>=16*F)
		{
			for(int j=0;j<=i;j++)
			{
				{
				if(j>=N||(i-j)>=16*F) continue;
			SaTem[i]+=Sa[i-j]*h[j];
				}

			}
		}
	}
	/////////////以上为卷积过程
	//////////////////////////////以下为卷积截断
	for(int j=0;j<=16*F-1;j++)
	{
		Sa[j]=SaTem[j+a]/2;
	}
	//////////////////////////////以上为卷积截断
	
}

void StuCodeInfo::Demodulate()//解调函数   
{

    for(int g=0;g<=16*F-1;g++ ) 
     Sa[g]=Sa[g]*cos(2*PI*g*Fc/Fs);
}


void StuCodeInfo::Lpf2()//低通滤波2
{
    double SaTem[16*F+N-1]={0.0};//卷积过程中的临时值(16*F+N-1个)
	int a=(N-1)/2;//以下是理想低通滤波器
	double hd[N]={0.0};//理想滤波器时域信号
	double RN[N]={0.0};//矩形窗
	double h[N]={0.0};//实际滤波器
	for(int k=0;k<=N-1;k++)
	{
		if (k==a) hd[k]=1.0;
	    else hd[k]=sin((2*PI*Ft/Fs)*(k-a))/(double)(PI*(k-a));//以上是理想低通滤波器
	}

	 for (int m=0;m<=N-1;m++)//以下是矩形窗
	 {
		 RN[m]=1.0;
	 }//以上是矩形窗
 
    for(int g=0;g<=N-1;g++)
	{
       h[g]=hd[g]*RN[g];
	}


	/////////////以下为卷积过程  
	for (int i=0;i<=(16*F+N-2);i++)
	{
		if(i<=(N-2))
		{
			for(int j=0;j<=i;j++)
            SaTem[i]+=Sa[i-j]*h[j];
		}
		if(i>=(N-1)&&i<=(16*F-1))
		{
			for(int j=0;j<=i;j++)
			{
				{
					if(j>=N) continue;
				    SaTem[i]+=Sa[i-j]*h[j];
				}
			
			}
		}
		if(i>=16*F)
		{
			for(int j=0;j<=i;j++)
			{
				{
				if(j>=N||(i-j)>=16*F) continue;
				SaTem[i]+=Sa[i-j]*h[j];
				}

			}
		}
	}
	/////////////以上为卷积过程
	//////////////////////////////以下为卷积截断
	for(int j=0;j<=16*F-1;j++)
	{
		Sa[j]=SaTem[j+a];
	}
	//////////////////////////////以上为卷积截断
	
}

void StuCodeInfo::Judge()//判决函数
{

	for (int i=0;i<=15;i++)
	{
		for(int j=0;j<=F-1;j++)
		{
            S1[i]+=Sa[j+i*F];
		}
		double g=S1[i]/F;
		if(g>=0.0)  S1[i]=1;
		else     S1[i]=-1; 
	}

}


void StuCodeInfo::DFT_FFT()
{


	for(int l=0;l<=n-1;l++)
	{
		AI[l]=0.0;
		if(l<=16*F-1)
			AR[l]=Sa[l];
        else
			AR[l]=0.0;

	}
	int i,i1,j1,j,LH,n1,k,d;
	double tr,ti,p;
	LH=n/2;
	j=LH;
	n1=n-2;
	for(i=1;i<=n;i++)
	{
		if(i<j)
		{
			i1=i;
			j1=j;
			tr=AR[i1];
			ti=AI[i1];
			AR[i1]=AR[j1];
			AI[i1]=AI[j1];
			AR[j1]=tr;
			AI[j1]=ti;
		}
		k=LH;
		while(j>=k)
		{
			j=j-k;
			k=(int)k/2;
		}
		j=j+k;
	}
	for(i=1;i<=m;i++)
	{
		d=(int)pow(2,(i-1));
		for(j=0;j<=(d-1);j++)
		{
			p=(double)(pow(2,(m-i))*j*2.0*PI/(double)n);
			for(k=j;k<=(n-1);)
			{
				double tr1,ti1;
				tr1=AR[k+d]*cos(p)+AI[k+d]*sin(p);
				ti1=AI[k+d]*cos(p)-AR[k+d]*sin(p);
				AR[k+d]=AR[k]-tr1;
				AI[k+d]=AI[k]-ti1;
				AR[k]=AR[k]+tr1;
				AI[k]=AI[k]+ti1;
				k+=2*d;
			}
		}
	}
	for(int g=0;g<=n-1;g++)
     A[g]=sqrt(pow(AR[g],2)+pow(AI[g],2));

}

⌨️ 快捷键说明

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