一个网上下载的C51的FFT程序,有些不懂,好象没有处理输入数据

2019-03-24 19:54发布

程序内容如下
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <absacc.h>

#define uchar unsigned char
#define uint  unsigned int
#define size 1024
const float pi=3.1416;
float xdata xreal[size];
float xdata ximag[size];
float xdata outputreal[size];
float xdata input[size];
float xdata largest=0;

uint f0;
uchar t1h,t1l;
uchar i=20;
uchar j=0,k=0;



 uint ibitr(uint j,uint nu)
 {
  int b,j1,i,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 Fill(void)  //数组清零
{   uint i;
    for(i=0;i<size;i++)
    {   xreal=0;
    ximag=0;
        outputreal=0;
    }
}






void inputdata(void)
{
  int i;
  for(i=0;i<size;i++)
  {
   input=XBYTE[0x0000+i];
  }
}

void main(void)

  uint i,j;

  inputdata();
  
 

  fft(size,(uint)(log(size)/log(2)));
  

   for (i=0;i<size;i++)
   {
   outputreal = sqrt (xreal* xreal+ximag*ximag);
   if (outputreal>largest) largest=outputreal;
   }

  




   while(1);
   {
   }

}


怎么看也觉得void fft( uint n , uint nu)这个函数没有处理需要处理的数据(inputdata());那位大侠能解释一下啊,如果是正确的我还要移植到STM32上,搞不懂为什么不用STM32的DSP库,非得让我们移植! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
jishuaihu
2019-03-25 10:19

这个程序确实有问题,需要处理的数据应该放在 这两个数组里面,xreal[size], ximag[size]; 一个实部一个虚部。 uint ibitr(uint j,uint nu) 函数是用来做倒位序处理,void fft( uint n , uint nu) 是FFT计算用的,详细的算法你找一下FFT的算法看看吧 http://wenku.baidu.com/view/6151f6c75fbfc77da269b1ba.html这儿有一个FFT的C函数,一共三个版本,不同版本增加了部分功能。

http://wenku.baidu.com/view/e0a0f24ffe4733687e21aaba.html     http://wenku.baidu.com/view/06b15cea551810a6f52486ba.html

 

你可以去看一下! 顺便说一句,老板有DSP库不让用,应该是脑子进水了!

[ 本帖最后由 jishuaihu 于 2011-7-5 20:20 编辑 ]

一周热门 更多>