打印
[STM32F1]

stm32做FFT变换

[复制链接]
10694|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
892953881|  楼主 | 2015-12-29 21:02 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
用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;
                        }
                }
        }   
}




沙发
892953881|  楼主 | 2015-12-29 22:38 | 显示全部楼层
734774645 发表于 2015-12-29 22:25
上图中,数组下标X对应的谐波频率为:N×Fs/256=N×6400/256=N*25Hz.lBUFMAG[2] 对应 2×25 =50Hz谐波幅值 ...

真是非常感谢了!!!写的这么详细,只是有点遗憾你放的源码包无法下载。

使用特权

评论回复
板凳
892953881|  楼主 | 2016-1-2 12:40 | 显示全部楼层
734774645 发表于 2015-12-29 22:25
上图中,数组下标X对应的谐波频率为:N×Fs/256=N×6400/256=N*25Hz.lBUFMAG[2] 对应 2×25 =50Hz谐波幅值 ...

3Q,在你的帮助下问题解决了

使用特权

评论回复
地板
892953881|  楼主 | 2016-1-10 21:30 | 显示全部楼层
对于我自己贴的那个FFT的函数,函数的输入是复数,有人告诉我说,把电压值放在实数部位,虚数为0带进去计算。不知有没有人知道不是是这样的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

42

帖子

2

粉丝