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

📄 t1.cpp

📁 同样是浮点型的fft算法一样为vc开发的
💻 CPP
字号:
//信道探测

#include "stdio.h" 
#include "string.h"
#include "math.h"
#include "stdlib.h"

const double pi=3.14159;
const short Num=512;
const short M=1024;
const short Len=8;


struct xi
     {
       short real;
       short imag;
     };


void main() 
{ 
    int i,j;
	int fr[Num];
	for (i=0;i<Num;i++)
	{
		fr[i]=2500+5000*i;
	}

	//计算sinad发送连续正弦波,持续时间为Long*200us
    short carry[M/2*Len];//正弦波
	short *carry1=(short *)malloc(sizeof(short)*M/2*Len*Num);
    short *sigsinad=(short *)malloc(sizeof(short)*M/2*Len*Num);//检测sinad时的发送信号
    struct xi *fsig=(struct xi *)malloc(sizeof(struct xi)*M/2*Len*Num);//信道探测,发送信号的频谱
    struct xi *sig1=(struct xi *)malloc(sizeof(struct xi)*Len*Num);
	int psig[Num];//计算信号功率



  
	//计算sinad时的发送信号
    for (i=0;i<M/2*Len*Num;i++)
	{
        *(sigsinad+i)=0;
		*(carry1+i)=0;
	}
	for (i=0;i<Num;i++)
	{
		psig[i]=0;

	}

    //连续发送正弦波
	for (i=0;i<Num;i++)
	{
		for (j=0;j<M/2*Len;j++)
		{
			carry[j]=(short)(sin(2*pi*fr[i]*j*0.000000390625)*pow(2,15));
            *(carry1+M/2*Len*i+j)=carry[j];
		}
   
        for (j=0;j<M/2*Len*Num;j++)
		{
			*(sigsinad+j)=*(sigsinad+j)+*(carry1+j);
			*(carry1+j)=0;
		}

	}
 
    //计算各频段内混合信号的功率
	for (i=0;i<M/2*Len*Num;i++)
	{
		(fsig+i)->real=*(sigsinad+i);
		(fsig+i)->imag=0;
	}
      	

    
    
	int l,m,k,n1,n2;
	double e;
	short c,c1,s,s1,t,tr,ti;
	short *p=(short *)malloc(sizeof(short)*M/2*Len*Num/2);
    short *p1=(short *)malloc(sizeof(short)*M/2*Len*Num/2);
	for(j=1,i=1;i<25;i++)
	{
		m=i;
		j=2*j;
		if(j==Num*M/2*Len)
			break;
	}
	n1=Num*M/2*Len-1;
	for(j=0,i=0;i<n1;i++)
	{
		if(i<j)
		{
			tr=(fsig+j)->real;
			ti=(fsig+j)->imag;
			(fsig+j)->real=(fsig+i)->real;
			(fsig+j)->imag=(fsig+i)->imag;
			(fsig+i)->real=tr;
			(fsig+i)->imag=ti;
		}
		k=Num*M/2*Len/2;
		while(k<(j+1))
		{
			j=j-k;
			k=k/2;
		}
		j=j+k;
	}

	n1=1;
	for (l=1;l<=m;l++)
	{
		n1=2*n1;
		n2=n1/2;
		e=pi/n2;
		c=1;
		s=0;
		c1=(short)(cos(e)*pow(2,15));
		s1=-1*(short)(sin(e)*pow(2,15));
 	    *p=32767;
		*p1=0;


		for(i=0;i<Num*M/2*Len;i+=n1)
		{
				k=i+n2;
				tr=(fsig+k)->real;
				ti=(fsig+k)->imag;
				(fsig+k)->real=((long)(fsig+i)->real-tr)>>1;
				(fsig+k)->imag=((long)(fsig+i)->imag-ti)>>1;
				(fsig+i)->real=((long)(fsig+i)->real+tr)>>1;
				(fsig+i)->imag=((long)(fsig+i)->imag+ti)>>1;
		}
            
		c=c1;
		s=s1;
		*(p+1)=c;
		*(p1+1)=s;
		printf("%d ",c);

		for(j=1;j<n2/2;j++)
		{
			for(i=j;i<Num*M/2*Len;i+=n1)
			{
					k=i+n2;
					tr=((long)c*(fsig+k)->real-(long)s*(fsig+k)->imag)>>16;
					ti=((long)c*(fsig+k)->imag+(long)s*(fsig+k)->real)>>16;
					(fsig+k)->real=((fsig+i)->real>>1)-tr;
					(fsig+k)->imag=((fsig+i)->imag>>1)-ti;
					(fsig+i)->real=((fsig+i)->real>>1)+tr;
					(fsig+i)->imag=((fsig+i)->imag>>1)+ti;
			}
			
			t=c;
			c=((long)t*c1-(long)s*s1)>>15;
			s=((long)t*s1+(long)s*c1)>>15;
			*(p+j+1)=c;
			*(p1+j+1)=s;
			printf("%d ",c);
		}

		if(n2/2>0)
		{
		for(j=n2/2;j<n2;j++)
		{
			c=-*(p+n2-j);
			s=*(p1+n2-j);
			for(i=j;i<Num*M/2*Len;i+=n1)
			{
					k=i+n2;
					tr=((long)c*(fsig+k)->real-(long)s*(fsig+k)->imag)>>16;
					ti=((long)c*(fsig+k)->imag+(long)s*(fsig+k)->real)>>16;
					(fsig+k)->real=((fsig+i)->real>>1)-tr;
					(fsig+k)->imag=((fsig+i)->imag>>1)-ti;
					(fsig+i)->real=((fsig+i)->real>>1)+tr;
					(fsig+i)->imag=((fsig+i)->imag>>1)+ti;
			}
		
			printf("%d ",c);
		}
		}		
		printf("\n");
        //printf("%d, %d ", (fsig+k)->real,(fsig+k)->imag);
	    printf("\n");
	}
	for (i=0;i<Num*M/2*Len;i++)
	{
	    (fsig+i)->real=(fsig+i)->real<<6;
	    (fsig+i)->imag=(fsig+i)->imag<<6;
	}

    for (i=0;i<Num;i++)
	{
		for (j=0;j<Len*Num;j++)
		{
			(sig1+j)->real=(fsig+j+i*Len*Num)->real;
			(sig1+j)->imag=(fsig+j+i*Len*Num)->imag;
		}
		for (j=0;j<Len*Num;j++)
		{
            psig[i]=psig[i]+(long)(sig1+j)->real*(sig1+j)->real+(long)(sig1+j)->imag*(sig1+j)->imag;
		}
		psig[i]=psig[i]/(Num*M/2*Len);
	
	}

    //for(i=0;i<Num;i++)
		//printf("%d ",psig[i]);

	free(carry1);
	free(sigsinad);
	free(fsig);
	free(sig1);
	free(p);
	free(p1);
}

⌨️ 快捷键说明

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