zhuisuoji 发表于 2008-4-26 11:27:18

用来DFT/FFT计算的信号是怎样得来的??实数部分与虚数部分...

目前正在学习!!!略略了解了一下DFT\FFT,请问高手们用来FFT计算的信号是怎样得来的??实数与虚数...对于方波与正弦波来讲是否一样的:是不是点与点之间的计数值?还是连续计数值??如果是计数值又如何变成实数部分与虚数部分的值?

zhuisuoji 发表于 2008-4-26 12:00:39

各位大虾们:

    您们好!我刚接触DFT/FFT这种算法,在网上也搜了不少相关资料,也去书城买了本<<数字信号处理教程习题分析与解答>> 程佩青 著的.

一下子也是难以吃透的.目前只能在本书中看到的是算法,也许我人笨一点,还没有看到参与运算的数是怎样得来的?

都说听君一席话胜读十年书啊
                                                   本人在看书中有了疑问~~~~~希望各位大虾不吝赐教~~~在这多谢了!!!

Chenxg 发表于 2008-4-26 20:37:30

先在论坛里搜下有关资料吧.

zhuisuoji 发表于 2008-4-27 02:10:24

有问~~有答~~也许才是论坛的真谛所在吧...我希望看到的是问题的解答.谢谢了老师们!!!

zhuisuoji 发表于 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 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);
}

luhuaren 发表于 2008-4-30 14:07:23

代码是错误的。。。。
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编译器上试一下,编译不过去

zhuisuoji 发表于 2008-5-1 04:54:08

嗯~~谢谢了~~~

zsy_zsy 发表于 2008-5-15 20:26:53

你使用单片机来进行FFT的吗?

zhuisuoji 发表于 2008-6-29 03:05:41

由于数学底子薄,现正在努力奋斗中...FFT算法的书都看了N遍了...目前还是没有什么突破.不过不会放弃!!!
以前搞的那个产品原想用FFT来算的,现用我的土办法解决了.谢谢各位的支持!!!
./emotion/em020.gif
页: [1]
查看完整版本: 用来DFT/FFT计算的信号是怎样得来的??实数部分与虚数部分...