6780|6

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

程序内容如下
#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库,非得让我们移植!
此帖出自51单片机论坛

最新回复

这个程序确实有问题,需要处理的数据应该放在 这两个数组里面,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 编辑 ]  详情 回复 发表于 2011-7-5 20:19
点赞 关注
 

回复
举报

20

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
怎么看也觉得void fft( uint n , uint nu)这个函数没有处理需要处理的数据(inputdata())
此帖出自51单片机论坛
 
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
没看懂,你的inputdata()这个函数是得到需要进行FFT的数据吗?
最终input[1024]里面的数据是不是0、1、2、3、……1023呢?
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 deweyled 的帖子

inputdata()里面好像用的是一些模拟数据,但是FFT里面处理的数据没有啊?
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 

这个程序确实有问题,需要处理的数据应该放在 这两个数组里面,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 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 jishuaihu 的帖子

谢谢
此帖出自51单片机论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 jishuaihu 的帖子

用了那里的程序已经成功了
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表