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

📄 fft_xgjis.c

📁 2007年全国大学生电子设计大赛
💻 C
字号:
#include"math.h"
#include"FFT_xgjis.h"
#include<c8051f120.h>
#include<flash.h>
sbit AD_RC=P0^6;
sbit AD_BUSY=P0^7;


/**********************************************************
延时函数
**********************************************************/
void delay10ns(unsigned int t)
 {
  while(--t!=0);
 }
//**************************************************   1
//函数输入:无
//函数输出:16bit的数据
//函数说明:AD采样
int ads8505(void)
        {
		 unsigned char data_L,data_H; 
		 int ads;
		 SFRPAGE   = 0x0f;
		 AD_RC=1;
		 AD_RC=0;
		 delay10ns(5);
		 AD_RC=1;
		 while(!AD_BUSY);
		 data_L=P2;
		 data_H=P3;
		 ads=data_H;
		 ads=ads<<8;
		 ads=ads+data_L;
		 return(ads);
		} 
//**************************************************   2
//函数输入:
//函数输出:将功率普存入FLASH
//函数说明:功率转换
void account_mod(int *fftnum)
   		{
		  unsigned int fdl=0;
		  unsigned int vfft;
		  float bum;
		  unsigned long bufz1;
		  unsigned long bufz2;
		  for( fdl=0;fdl<1024;fdl++)
		    {			    
				  bufz1 = abs(fftnum[fdl*2]);
				  bufz2 = abs(fftnum[fdl*2+1]);
				  bufz1 = bufz1*bufz1;
				  bufz2 = bufz2*bufz2;
				  bufz1 = bufz1+bufz2;     //算出功率值
				  bum =(float)bufz1;
				  bum = sqrt(bum);
				  vfft =(int)bum;
				  fftnum[fdl] =	vfft;
			 }                         //将模值计算出存在前全局数组的1024

           }

//**************************************************	 3
//函数输入:全局数组source
//函数输出:频谱排列的序号 调用后频谱序号按照频谱小到大排列在数组
//函数说明: 
void account_order(int *fftnum)
   		{
		  int num1,num2,re1,re2,ref;
		  unsigned char flagmp=1;
		  int buforder[1024];
		  for(num1=0;num1<1024;num1++)   //初始序列
		    {
			  buforder[num1]=num1;
			} 
		  
		  for(num1=0;(num1<1024)&&(flagmp==1);num1++)
		    {  flagmp=0;
			   
			   for(num2=0;num2<1024-num1;num2++)
			   {   re1= fftnum[buforder[num2]];
			       re2= fftnum[buforder[num2+1]];			      
			      if(re1>re2)
				  {
				       flagmp = 1;
					   ref = buforder[num2];
					   buforder[num2] = buforder[num2+1];
					   buforder[num2+1] = ref;
				  }
				}
			  }
		  for( num1=0;num1<1024;num1++)
		    {
			 fftnum[2047-num1]=buforder[num1];   
			 }

         }
//**************************************************   4
//函数输入: 全局数组source
//函数输出:各个频率分量的功率之和 --总功率(电压的平方和后开根号)
//函数说明:  返回数据为32位数据
int account_pall(int *fftnum)
       {
	      int numb;
		  float pk11;
		  unsigned long sumall=0,sumall1=0;
	      for(numb=0;numb<1024;numb++)
	       { sumall1= fftnum[numb];
		     sumall=sumall+sumall1*sumall1;
			}
		  pk11 = sumall;
		  pk11 = sqrt(pk11);
		  if(pk11>0x7fff) pk11 = 0x7fff;
		  numb = (int)pk11; 
		 return(numb);
		}
//**************************************************	5
//函数输入: 全局数组source
//函数输出:信号的失真度
//函数说明:  返回数据为32位浮点数据
float shizhd(int *fftnum)
{
  int nums,nums1;
  long re1,sum1;
  int fftn;
  float sun1,sun2,r;
  sun1 = 0;
  sun2 = 0;
  sum1 = 0;
  nums = fftnum[1024];
  for(nums1=0;nums1<1024;nums1++)
   {
      if((nums+fftnum[1024])<1024)
	    {
		  nums=nums+fftnum[1024];
		  re1=fftnum[nums];
		  re1=re1*re1;
		  sum1=sum1+re1;
		 }
	  else 
	     break;
	}
	sun1 = sum1;
	sun1 = sqrt(sun1);
	fftn = fftnum[fftnum[1024]];
	sun2 = fftn ;
	r= sun1/sun2;
	return(r);
}
//**************************************************	  6
//函数输入: 排序后频率分量的位置。 0-1023表示自然顺序;1024-2047表示排序后位置
//函数输出: 该频率分量的功率值	 Dbm
//函数说明:  返回数据为32位浮点数据  频率的分贝数。
float account_dbm(int volt0,unsigned int K_ff)
{
  float pa0,pa1,pa;
  pa0 = volt0;
  pa1 = K_ff;
  pa  = log10(2*pa0/pa1)*20+log10(20)*10;
  return (pa);
}
//**************************************************	7
//函数输入: 全局数组source
//函数输出: 判断输入信号的周期性,若为周期则返回周期值,若为非周期则返回0;
//函数说明:  返回数据为32位浮点数据  周期毫秒数。
float cyc_jud(int *fftnum)
{
  float cyc1,cyc2;
  cyc1 = account_pall(fftnum);
  cyc1 = cyc1/1024;
  cyc2 = fftnum[fftnum[1024]];
 if(cyc2/cyc1>10)return(fftnum[1024]);
 else  return(0);
}
//**************************************************	8
//函数输入: 全局数组source
//函数输出: 判断输入信号的频率分量个数;
//函数说明:  返回数据unint 。
 unsigned int fnum_jud(int *fftnum)
{
   unsigned int fyc1,fyc2;
   fyc2 =fftnum[fftnum[1024]];
   fyc2 = fyc2/512;
   for(fyc1=0;fyc1<1024;fyc1++)
   {
     if(fftnum[fftnum[fyc1+1024]]<fyc2) break;
   }

   return(fyc1);
}
//**************************************************	9
//函数输入: 全局数组source
//函数输出: 各频率分量的均方根;  带入频率转换函数就可以转换出DBm数
//函数说明:  返回数。
int sum_fp(int *fftnum)
{
   int fyc1,fyc2 ;
   unsigned long fycc1=0,fycc2=0;
   float fycc;
   fycc1=0;
   fycc2=0;
   fyc2 = fnum_jud(fftnum) ;
   for(fyc1=0;fyc1<fyc2;fyc1++);
			{ fycc1= fftnum[fftnum[fyc1+1024]];
		     fycc2=fycc2+fycc1*fycc1;
			}
		fycc = fycc2;
		fycc = sqrt(fycc);
	//	if(fycc>0x7fff) fycc = 0x7fff;
		fyc1 = (int)fycc; 
	    return(fyc1);
}
   
     







































⌨️ 快捷键说明

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