新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2015-12-29
- 在线时间
- 4 小时
|
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;
}
}
}
}
|
|