|
楼主 |
发表于 2008-4-27 02:39:28
|
显示全部楼层
这里是在网上搜到的--->>51的FFT例程.
下面有几行看不懂,我已做了标记....希望能有各位老师的指点...谢谢了!!
#pragma DB OE CD //------这里不清楚起什么作用??
#include<reg52.h>
#include<math.h>
#include<stdio.h>
#include<tdlib.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 size1;
uint ibitr(uint j,uint nu)
{
int b,i,j1,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;
ximag[k]=ximag;
xreal=treal;
ximag=timag;
}
}
}
/*
void LcdShow()
{
uint i;
for(i=0;i<size;i++)
{
outputreal=(uint)(outputreal/largest*64);
}
}
*/
//初始化
void RS_init(void)
{
TMOD=0x20;
TL1=0xf3;
TH1=0xf3;
PCON=0x00;
TR1=1;
SCON=0x50;
TI=1;
ET1=0;
}
/*
//测频初始化
void text_init(void)
{
EA=1;ET0=1;ET1=1;
TMOD=0x15;
TH1=0x3C;
TL1=0xAF;
TH0=0;
TL0=0;
TR0=1;
TR0=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;
TR0=1;
}
}
*/
//数组清0
void Fill(void)
{
uint i;
for(i=0;i<size;i++)
{
xreal=0;
ximag=0;
outputreal=0;
outputimag=0;
}
}
void Sinwave(void)
{
uint i;
for(i=0;i<size;i++)
{
input=sin(2.0*pi*(i)/size);
}
}
void Sqrwave(void)
{
uint i;
for(i=0;i<size/2;i++)
{
xreal=input;
}
for(;i<size;i++)
{
xreal=input;//---------------------------这里的 xreal,input 明明是数组.怎么没有下标的 [ ] 不明白??
}
}
/*
void get_size(void)
{
if((f0>=0)&&(f0<=10))size1=16;
else if((f0>10)&&(f0<=100))size1=128;
else if((f0>100)&&(f0<=1000))size1=200;
else if((f0>1000)&&(f0<=10000))size1=256;
else if((f0>10000)&&(f0<=100000))size1=300;
else if(f0>100000))size1=400;
}
*/
void input1(void)
{
int i;
input[0]=0;
for(i=1;i<size/2;i++)
{
//XBYTE[0X0000+i];
input=input[i-1]+1; //----------------------------------这里的 input 明明是数组.怎么没有下标的 [ ] 不明白??
}
for(;i<size;i++)
{
//XBYTE[0X0000+i];
input=input[i-1]-1; //----------------------------------这里的 input 明明是数组.怎么没有下标的 [ ] 不明白??
}
}
void shizhendu(float *outputreal)
{
double he=0,he2=0;
int i;
for(i=1;i<30;i++)
{
outputreal++;
he+=*outputreal*(*outputreal);
if(i==1)he2=he;
}
he2=he-he2;
he=sqrt(he2/he);
printf("shizhen du:%10.5f",he);
}
void main(void)
{
uint i,j;
//text_init();//测频
//while((TR0==0)&&(TR1==0));
//get_size();//确定点数
input1();
RS_init();//初始化
Fill();//数组清0
Sqrwave();
printf("OK");
/*
printf("\n----INPUT DATA----\n");
for(i=0;i<size;i++)
{
printf("%9.5f",input);
if((i+1)%8==0)
{printf("\n");}
}
*/
fft( size,(uint)( long(size)/long(2) ) );
for(i=0;i<size;i++)
{
outputreal=xreal;
outputimag=ximag;
}
/*
printf("\n----FFT Imag----\n");
for(i=0;i<size;i++)
{
printf("%9.5f",outputimag);
if((i+1)%8==0)
{printf("\n");}
}
printf("\n----FFT Real----\n");
for(i=0;i<size;i++)
{
printf("%9.5f",outputreal);
if((i+1)%8==0)
{printf("\n");}
}
*/
for(i=0;i<size;i++)
{
outputreal=sqrt(outputreal*outputreal+outputimag*outputimag);
if(outputreal>largest)largest=outputreal;
}
printf("\n----FFT Mod----\n");
for(i=0;i<size;i++)
{
printf("%9.5f",outputreal);
if((i+1)%4==0)
{printf("\n");}
}
//LcdShow();
/*
printf("\n----FFT Lcd----\n");
for(i=0;i<size;i++)
{
printf("%9.5f",outputreal);
if((i+1)%4==0)
{printf("\n");}
}
printf("\n");
printf("\n");
*/
for(i=0;i<size;i++)
{
printf("%2u",i);
for(j=0;j<=outputreal;j++)
{
printf("*");
}
printf("\n");
}
shizhendu(outputreal);
while(1);
} |
|