OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6494|回复: 6

STM32 AD采样后做FFT变换

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2015-12-29
在线时间
4 小时
发表于 2015-12-30 14:01:24 | 显示全部楼层 |阅读模式
1金钱
本人用STM32做AD采样后做FFT变换,在网上看了很多FFT变换的函数,这里的一个是下载的原子哥的代码,网上大部分都是和这个函数差不多。但是我做AD采样后的值一个12位的寄存器中读取的实数,而此函数的输入是虚数还是结构体类型的,我不知道该如何去转换成这个函数所需求的输入的形式,希望原子哥和各位大神帮帮忙,或者谁有可用的工程实例分享一下。谢谢了!!!假设采样速率1024HZ  采样1024个点。


#ifndef __FFT_H__
#define __FFT_H__  
#include <stm32f10x_lib.h>
//FFT 频谱分析
//可以执行64/128/256/512/1024等点数的FFT计算
//正点原子@SUNTEK
//2010/3/23
   
//傅里叶变换 输入和输出缓存区
typedef struct
{
float real;
float imag;
}compx;
        
#define FFT_512 //1024点的FFT
#ifdef FFT_64
#define FFT_N 64
#endif
#ifdef FFT_128
#define FFT_N 128
#endif
#ifdef FFT_256
#define FFT_N 256
#endif
#ifdef FFT_512
#define FFT_N 512
#endif
#ifdef FFT_1024
#define FFT_N 1024
#endif  
extern compx fftres[FFT_N];    //FFT数据段
void FFT(compx *xin,u16 N);//N点FFT计算函数
#endif




#include "fft.h"
#include "fft_tab.h"
//FFT 频谱分析
//可以执行64/128/256/512/1024等点数的FFT计算
//所需要的变量:
//(FFT_N+1)*8 个字节左右
//正点原子@SUNTEK
//2010/3/23  
compx fftres[FFT_N]; //FFT数据段      
//m^n函数
u32 mypow(u8 m,u8 n)
{
u32 result=1;  
while(n--)result*=m;   
return result;
}   
//快速傅里叶变换
//32/64/128/256/512/1024点的FFT
//STM32 计算1024点费时35.7ms左右@72M
//如果超频到120M,则时间只需要22ms左右了
//N:傅里叶变换的点数
//xin:输入数组大小为N+1
void FFT(compx *xin,u16 N)
{
u16 f,m,LH,nm,i,k,j,L;
u16 p;
u16 le,B,ip;         
  compx ws,t;
LH=N/2;
f=N;
for(m=1;(f=f/2)!=1;m++);//求得M的值
nm=N-2;   
j=N/2;   
for(i=1;i<=nm;i++)//码位倒置
{
  if(i<j){t=xin[j];xin[j]=xin;xin=t;}//码位家换
  k=LH;
  while(j>=k){j=j-k;k=k/2;}
  j=j+k;
}   
for(L=1;L<=m;L++) //fft  傅里叶变换
{  
  le=mypow(2,L);//用自己定义的乘方函数,效率比库函数高很多.这里如果采用移位计算,效率更高.   
  B=le/2;      
  for(j=0;j<=B-1;j++)
  {     
   p=mypow(2,m-L)*j;  //用自己定义的乘方函数,效率比库函数高很多.   
   ws.real=cos_tab[p];
   ws.imag=sin_tab[p];
   for(i=j;i<=N-1;i=i+le)//遍历M级所有的碟形
   {
    ip=i+B;   
    //执行复数乘法
    t.real=xin[ip].real*ws.real-xin[ip].imag*ws.imag;
    t.imag=xin[ip].real*ws.imag+xin[ip].imag*ws.real;
    xin[ip].real=xin.real-t.real;
    xin[ip].imag=xin.imag-t.imag;
    xin.real=xin.real+t.real;
    xin.imag=xin.imag+t.imag;
   }
  }
}   
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2015-12-29
在线时间
4 小时
 楼主| 发表于 2015-12-30 19:45:18 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-30 23:35:07 | 显示全部楼层
帮顶
回复

使用道具 举报

8

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2015-3-4
在线时间
44 小时
发表于 2016-1-2 11:02:19 | 显示全部楼层
你想多了。将你采样得到的数据,放到结构体的实数部分,虚部都是0,进行FFT,就可以了
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2015-12-29
在线时间
4 小时
 楼主| 发表于 2016-1-2 22:06:32 | 显示全部楼层
flysonet 发表于 2016-1-2 11:02
你想多了。将你采样得到的数据,放到结构体的实数部分,虚部都是0,进行FFT,就可以了

这样可以么?那我试试看。
回复

使用道具 举报

8

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2015-3-4
在线时间
44 小时
发表于 2016-1-6 11:52:07 | 显示全部楼层
买女孩的小火柴 发表于 2016-1-2 22:06
这样可以么?那我试试看。

当然可以。
回复

使用道具 举报

2

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-9-14
在线时间
36 小时
发表于 2016-6-7 13:17:42 | 显示全部楼层

请问楼主问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 15:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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