用来DFT/FFT计算的信号是怎样得来的??实数部分与虚数部分...
目前正在学习!!!略略了解了一下DFT\FFT,请问高手们用来FFT计算的信号是怎样得来的??实数与虚数...对于方波与正弦波来讲是否一样的:是不是点与点之间的计数值?还是连续计数值??如果是计数值又如何变成实数部分与虚数部分的值? 各位大虾们:您们好!我刚接触DFT/FFT这种算法,在网上也搜了不少相关资料,也去书城买了本<<数字信号处理教程习题分析与解答>> 程佩青 著的.
一下子也是难以吃透的.目前只能在本书中看到的是算法,也许我人笨一点,还没有看到参与运算的数是怎样得来的?
都说听君一席话胜读十年书啊
本人在看书中有了疑问~~~~~希望各位大虾不吝赐教~~~在这多谢了!!! 先在论坛里搜下有关资料吧. 有问~~有答~~也许才是论坛的真谛所在吧...我希望看到的是问题的解答.谢谢了老师们!!! 这里是在网上搜到的--->>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 uintunsigned int
#define size 128
const float pi=3.1416;
float xdata xreal;
float xdata ximag;
float xdata outputreal;
float xdata outputimag;
float xdata input;
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*c-ximag*s;
timag=ximag*c+xreal*s;
xreal=xreal-treal;
ximag=ximag-timag;
xreal=xreal+treal;
ximag=ximag+timag;
k=k+1;
}
k=k+n2;
}
}
for(k=0;k<n;k++)
{
i=ibitr(k,nu);
if(i>k)
{
treal=xreal;
timag=ximag;
xreal=xreal;
ximag=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;
for(i=1;i<size/2;i++)
{
//XBYTE;
input=input+1; //----------------------------------这里的 input 明明是数组.怎么没有下标的 [ ] 不明白??
}
for(;i<size;i++)
{
//XBYTE;
input=input-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);
} 代码是错误的。。。。
void input1(void)
{
int i;
input=0;
for(i=1;i<size/2;i++)
{
//XBYTE;
input=input+1; //----------------------------------这里的 input 明明是数组.怎么没有下标的 [ ] 不明白??
}
for(;i<size;i++)
{
//XBYTE;
input=input-1; //----------------------------------这里的 input 明明是数组.怎么没有下标的 [ ] 不明白??
}
}
你到KEIL编译器上试一下,编译不过去 嗯~~谢谢了~~~ 你使用单片机来进行FFT的吗? 由于数学底子薄,现正在努力奋斗中...FFT算法的书都看了N遍了...目前还是没有什么突破.不过不会放弃!!!
以前搞的那个产品原想用FFT来算的,现用我的土办法解决了.谢谢各位的支持!!!
./emotion/em020.gif
页:
[1]