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

📄 try_fft.c

📁 在51单片机上实现的FFT处理,最多可以到200点的
💻 C
字号:
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <absacc.h>

#define uchar unsigned char
#define uint  unsigned int
//#define size 128
const float pi=3.1416;
float xdata xreal[size];
float xdata ximag[size];
float xdata outputreal[size];
float xdata outputimag[size];
float xdata input[size];
float xdata largest=0;
//#define 
uint f0;
uchar t1h,t1l;
uchar i=20;
uchar j=0,k=0;
uchar size;

 uint ibitr(uint j,uint nu)
 {
  int b,j1,i,j2;
  j1=j;
  b=0;
  for(i=1;i<=nu;i++)
  {
   j2=j1/2;
   b=b*2+(j1-2*j2);
   j1=j2;
  }
  return(b);
 }

void fft( uint n , uint nu)
 {
   float treal,timag,arg,c,s;
   uint   p,n2,nu1,l,i,j,k,kn2;

   n2=n;
   nu1=nu;

   for (l=0;l<nu;l++)
   {
      nu1=nu1-1;
      n2=n2/2;
      k=0;
      while(k+n2<n)
      {
       for(i=0;i<n2;i++)
       {
	j=k>>nu1;
	p=ibitr(j,nu);
	arg=6.28315*p/n;
	c=cos(arg);
	s=sin(arg);
	kn2=k+n2;
	treal=xreal[kn2]*c-ximag[kn2]*s;
	timag=ximag[kn2]*c+xreal[kn2]*s;
	xreal[kn2]=xreal[k]-treal;
	ximag[kn2]=ximag[k]-timag;
	xreal[k]=xreal[k]+treal;
	ximag[k]=ximag[k]+timag;
	k=k+1;
       }
       k=k+n2;
      }
   }
   for(k=0;k<n;k++)
   {
    i=ibitr(k,nu);
    if(i>k)
    {
     treal=xreal[k];
     timag=ximag[k];
     xreal[k]=xreal[i];
     ximag[k]=ximag[i];
     xreal[i]=treal;
     ximag[i]=timag;
    }
   } 
   
  }

void LcdShow()
{
    uint i;
    for(i=0;i<size;i++)
   {
     outputreal[i]=(uint)(outputreal[i]/largest*64);
   }

}


void RS_init (void)   //初始化
{   TMOD=0x20;
    TL1=0xfd;
    TH1=0xfd;
    PCON=0x00;
    TR1=1;
    SCON=0x50;
    TI=1;
}

void text_init(void)   //测频初始化
{
   EA=1;ET0=1;ET1=1;
TMOD=0x15;                       
TH1=0x3C;
TL1=0xaf;
TH0=0;
TL0=0;
TR0=1;
TR1=1;
}

 
void timer0(void) interrupt 1 using 2
 {
    j=j+1;
    TH0=0;
    TL0=0;
    TR0=1;
 }

void timer1(void) interrupt 3 using 1
 { 
   TH1=0x3c;
   TL1=0xaf;
   i=i-1;
   if(i==0)
   {
     i=20;
     TR0=0;
     t1h=TH0;
     t1l=TL0;
     j=0;
     f0=(65535*j+t1h*256+t1l);
     TH0=0;
     TL0=0;
     TR1=0;
   }
 }


void Fill(void)  //数组清零
{   uint i;
    for(i=0;i<size;i++)
    {   xreal[i]=0;
	    ximag[i]=0;
        outputreal[i]=0;
        outputimag[i]=0;
    }
}

void Sinwave(void)
{ uint i;
  for (i=0;i<size;i++)
  {
    input[i] = sin(2.0 * pi * (i) / size);
  }
}

void Sqrwave(void)
{ uint i;
  for (i=0;i<size/2;i++)
  {
    xreal[i] = input[i];
  }
  for (;i<size;i++)
  {
    xreal[i] = input[i];
  }
}


void get_size(void)
{
 if((f0>=0)&&(f0<=10))size=16;
  else if((f0>10)&&(f0<=100))size=128;
  else if((f0>100)&&(f0<=1000))size=200;
  else if((f0>1000)&&(f0<=10000))size=256;
  else if((f0>10000)&&(f0<=100000))size=300;
  else if(f0>100000)size=400;
}

void input(void)
{
  int i;
  for(i=0;i<size;i++)
  {
   input[i]=XBYTE[0x0000+i];
  }
}

void main(void)
{ 
  uint i,j;
  text_init();  //测频 
  while(!(TR0==0)&&(TR1==0));
  get_size();  //确定点数
  input();
  RS_init();  //初始化
  Fill();  //数组清零
  
  Sqrwave();

  printf("\n----INPUT DATA-----\n");
   for(i=0;i<size;i++)
   {
    printf("%9.5f",input[i]);
    if((i+1)%8==0)
    {printf("\n");}
   }

  fft(size,(uint)(log(size)/log(2)));
  
  for(i=0;i<size;i++)
  {
   outputreal[i]=xreal[i];
   outputimag[i]=ximag[i];
  }

  printf("\n------FFT Imag--------\n");
   for(i=0;i<size;i++)
   {
    printf("%9.5f",outputimag[i]);
    if((i+1)%8==0)
    {printf("\n");}
   }

   printf("\n--------FFT Real--------\n");
   for(i=0;i<size;i++)
   {
    printf("%9.5f",outputreal[i]);
    if((i+1)%8==0)
    {printf("\n");}
   }

   for (i=0;i<size;i++)
   {
   outputreal[i] = sqrt (outputreal[i]* outputreal[i]+outputimag[i]*outputimag[i]);
   if (outputreal[i]>largest) largest=outputreal[i];
   }

   printf("\n------FFT Mod--------\n");
   for(i=0;i<size;i++)
   {
    printf("%9.5f",outputreal[i]);
    if((i+1)%8==0)
    {printf("\n");}
   }

   LcdShow();

   printf("\n------For Lcd--------\n");
   for(i=0;i<size;i++)
   {
    printf("%9.1f",outputreal[i]);
    if((i+1)%8==0)
    {printf("\n");}
   }
  
   printf("\n");
   printf("\n");

   for(i=0;i<size;i++)
   {  printf("%2u",i);
      for(j=0;j<=outputreal[i];j++)
      {   printf("*");
      }
          printf("\n");
   }


   while(1);

}


⌨️ 快捷键说明

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