FFT算法在单片机中的使用&&LCD12864驱动
void clear(uchar dat) //清屏函数
{
uchar i,j,k;
uchar addr=0x80;
for(i=0;i<2;i++)
{
for(j=0;j<32;j++)
{
for(k=0;k<8;k++)
{
WriteCommandLCM(0x36);
WriteCommandLCM(0x80+j);
WriteCommandLCM(addr+k);
WriteDataLCM(dat);
WriteDataLCM(dat);
}
}
addr=0x88;
}
WriteCommandLCM(0x36);
WriteCommandLCM(0x30);
}
void heng(uchar a)
{
uchar i;
for(i=0;i<127;i++)
point(i,a);
}
void su(uchar a)
{
uchar i;
for(i=0;i<63;i++)
point(a,i);
}
void FFT()
{
int i,j,k,t,P,B,m;
complex up,down,product;
for (i=0;i<7;i++)
{
B=1< for (j=0;j {
t=1<<(6-i);
P=t*j;
for (k=j;k
complex product;
product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N);
product.img=x[k+B].real*(-1)* sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N);
x[k+B].real=x[k].real-product.real;
x[k+B].img=x[k].img-product.img;
x[k].real=x[k].real+product.real;
x[k].img=x[k].img+product.img;
}
}
}
}
void initw() //初始化旋转因子
{
int i;
for (i=0;i
}
void bitReverse() //比特反转
{
int i,j=0;
int k=0;
int q=0;
complex tmp3;
for (i=0;i
int tmp=i,tmp2=0,j;
for(j=0;j<7;j++)
tmp2+=((tmp>>j)&1)*(1<<(6-j));
if(vis[i]==0)
{
tmp3=x[i];
x[i]=x[tmp2];
x[tmp2]=tmp3;
vis[i]=1;
vis[tmp2]=1;
}
}
}
void xian(uchar x,uchar y)
{
uchar i;
for(i=63;i>=y;i--)
point(x,i);
}
//主函数
void main(void)
{
uchar ii,y;
float tmp;
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRB=0xff;
PORTB=0xff;
DDRD=0xff;
PORTD=0x00;
delayms(20);
delayms(20);
LCMInit(); //LCM初始化 //液晶初始化
delayms(100);
clear(0x00);
heng(0);
heng(63);
su(0);
su(127);
for (ii=0;ii<20;ii++)
{
x[ii].real=3;
x[ii].img=0;
}
for (ii=20;ii<128;ii++)
{
x[ii].real=0;
x[ii].img=0;
}
initw();
bitReverse();
FFT();
for(ii=64;ii<128;ii++)
{
tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));
y= 63-(int)tmp;
point(ii-64,y);
xian(ii-64,y);
}
for(ii=0;ii<64;ii++)
{
tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));
y= 63-(int)tmp;
point(ii+64,y);
xian(ii+64,y);
}
while(1);
}
评论