📄 try_fft.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 + -