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

📄 tool.cpp

📁 扩展的直序扩频系统
💻 CPP
字号:
#include "Common.h"

float Gauss_rand()
{
	float random_num;
	double u1,u2;
	u1=((float)rand()+1.f)/32768.f;
	u2=((float)rand()+1.f)/32768.f;
	random_num=(float)(sqrt(-2.*log(u1))*cos(2*Pi*u2));
	return random_num;
}

void Dec2Bin(int DecData,int BinLength,int *BinData)
{
	int i,quot; 
	i=0; 
	quot=DecData; 
	for(i=0;i<BinLength;i++)
	{
		BinData[i]=quot%2;
		quot=quot/2;
	}
}

int Bin2Dec(int BinLength,int *BinData)
{
	int i,weight;
	int DecData = 0;
	for(i=0;i<BinLength;i++)
	{
		weight=1<<i;
		DecData+=BinData[i]*weight;
	}
	return(DecData);
}

int sign(float x)
{
	int y;
	if(x>=0)
		y=1;
	else
		y=-1;
	return y;
}

complex GenComplex(float Txpulse1,float Txpulse2)
{
	complex temp;
	temp.real=Txpulse1;
	temp.imag=Txpulse2;
	return temp;
}

complex ComplexMul(complex a,complex b)
{
	complex temp;
	temp.real = a.real*b.real-a.imag*b.imag;
	temp.imag = a.real*b.imag+a.imag*b.real;
	return temp;
}

complex ComplexMulR(complex a,float b)
{
	complex temp;
	temp.real = a.real*b;
	temp.imag = a.imag*b;
	return temp;
}

complex ComplexExp(float omega)
{
	complex temp;
	temp.real = (float)cos(omega);
	temp.imag = (float)sin(omega);
	return temp;
}

complex ComplexAdd(complex a,complex b)
{
	complex temp;
	temp.real=a.real+b.real;
	temp.imag=a.imag+b.imag;
	return temp;
}

complex ComplexSub(complex a,complex b)
{
	complex temp;
	temp.real=a.real-b.real;
	temp.imag=a.imag-b.imag;
	return temp;
}

complex ComplexConj(complex a)
{
	complex temp;
	temp=a;
	temp.imag=-temp.imag;
	return temp;
}

float ComplexPow(complex a)
{
	return a.real*a.real+a.imag*a.imag;
}

float ComplexPhase(complex a)
{
	float x,y,Phase;
	x=a.real;
	y=a.imag;
	if(x==0)
	{
		Phase=(float)Pi/2;
	}
	else
	{
		Phase=(float)atan(y/x);
	}

	if(x<0&&y<=0)
   		Phase=Phase-(float)Pi;
	else if(x<0&&y>0)
   		Phase=Phase+(float)Pi;
	return Phase;
}

void ExChange_Complex(complex *A,complex *B)
{
	complex temp = {0.f,0.f};
	temp = *A;
	*A = *B;
	*B = temp;
}

complex ComplexDiv(complex a,complex b)
{
	float c;
	complex bconj,DivResult;
	c=1.f/(float)ComplexPow(b);
	bconj=ComplexConj(b);
	DivResult=ComplexMulR(ComplexMul(a,bconj),c);
	return DivResult;
}

complex ComplexDivR(complex a, float b)
{
	complex c;
	c.real = a.real/b;
	c.imag = a.imag/b;
	return c;
}

void ExChange_int(int *A, int *B)
{
	int temp = 0;
	temp = *A;
	*A = *B;
	*B = temp;
}

float GetPs(float *Signal, int Length)
{
	int i;
	float Ps=0.f;
	for(i=0;i<Length;i++)
	{
		Ps+=Signal[i]*Signal[i];
	}
	Ps/=(float)Length;
	return(Ps);
}

void FFT(complex *Signal,complex *FFTsignal,int flag,int FFTn)
{
	//if flag == 1, FFT;
	//if flag == -1, IFFT;
	int  FFTOrd = 0;
	int i=0,j=0,k=0,l=0;
	int le=0,le1=0,ip=0;
	complex temp={0.f,0.f},u={0.f,0.f},w={0.f,0.f};

	FFTOrd=0;
	while(FFTn != (0x0001<<FFTOrd)) 
		FFTOrd++;

	memcpy(FFTsignal,Signal,FFTn*sizeof(complex));
	for(i=0,j=0;i<FFTn-1;i++)
	{
		if(i<j)
		{
			temp=FFTsignal[j];
			FFTsignal[j]=FFTsignal[i];
			FFTsignal[i]=temp;
		}
		k=FFTn/2;
		while(k<=j)
		{
			j-=k;
			k/=2;
		}
		j+=k;
	}

	le=1;
	for(l=0;l<FFTOrd;l++)
	{
		le*=2;
		le1=le/2;
		u.real=1.0f;
		u.imag=0.0f;
		w.real=(float)(cos(Pi/le1));
		w.imag=(float)(-flag*sin(Pi/le1));
		for(j=0;j<le1;j++)
		{
			for(i=j;i<FFTn;i+=le)
			{
				ip=i+le1;
				temp=ComplexMul(FFTsignal[ip],u);
				FFTsignal[ip]=ComplexSub(FFTsignal[i],temp);
				FFTsignal[i]=ComplexAdd(FFTsignal[i],temp);
			}
			u=ComplexMul(u,w);
		}
	}

	if(flag==-1)
	{
		for(i=0;i<FFTn;i++)
		{
			FFTsignal[i].real/=(float)(FFTn);
			FFTsignal[i].imag/=(float)(FFTn);
		}
	}
}










⌨️ 快捷键说明

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