搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2008-4-26 11:27:18 | 显示全部楼层 |阅读模式
目前正在学习!!!略略了解了一下DFT\FFT,请问高手们用来FFT计算的信号是怎样得来的??实数与虚数...对于方波与正弦波来讲是否一样的:是不是点与点之间的计数值?还是连续计数值??如果是计数值又如何变成实数部分与虚数部分的值?

出0入0汤圆

 楼主| 发表于 2008-4-26 12:00:39 | 显示全部楼层
各位大虾们:

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

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

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

出0入0汤圆

发表于 2008-4-26 20:37:30 | 显示全部楼层
先在论坛里搜下有关资料吧.

出0入0汤圆

 楼主| 发表于 2008-4-27 02:10:24 | 显示全部楼层
有问~~有答~~也许才是论坛的真谛所在吧...我希望看到的是问题的解答.谢谢了老师们!!!

出0入0汤圆

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

出0入0汤圆

发表于 2008-4-30 14:07:23 | 显示全部楼层
代码是错误的。。。。
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 明明是数组.怎么没有下标的 [ ] 不明白??
    }
}

你到KEIL编译器上试一下,编译不过去

出0入0汤圆

 楼主| 发表于 2008-5-1 04:54:08 | 显示全部楼层
嗯~~谢谢了~~~

出0入0汤圆

发表于 2008-5-15 20:26:53 | 显示全部楼层
你使用单片机来进行FFT的吗?

出0入0汤圆

 楼主| 发表于 2008-6-29 03:05:41 | 显示全部楼层
由于数学底子薄,现正在努力奋斗中...FFT算法的书都看了N遍了...目前还是没有什么突破.不过不会放弃!!!
以前搞的那个产品原想用FFT来算的,现用我的土办法解决了.谢谢各位的支持!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 22:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表