用AD采样后对电压进行FFT变换。在网上找了很多算法无非都是这样的差不多的。假如用STM3210ZET6 12位AD采样 1024个点,采样频率1024HZ.
这个函数的输入是个结构体表示的是一个复数,而我做AD采样后的是一个12位的值,请问下各位如何将AD采样后的值转换成这个函数输入所需要的。或者哪位有其他算法的代码求分享下。谢谢了!!!
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;
}
}
}
}
|