硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2841|回复: 1
收起左侧

[技术讨论] stm32做定点FFT出来的频谱图于matlab的频谱图发生偏移

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2020-9-3 20:32:54 | 显示全部楼层 |阅读模式
STM32L1因为内存限制,只能做16位定点FFT,并且FFT中转换核改为实时计算。出来数据算出频谱图后与MatLab算出来的数据产生横向偏移。大家帮忙看下原因,感谢。
下面是定点FFT实现:
short fft(COMPLEX *x){
        short shift=0;
        int i,j,k,u=0,l=0,wi=0;                               
        int SubBlockNum,SubBlockStep=1;               
        bool ov,ovd;                                                       
        COMPLEX wn,XkWn;//wn[N/2],XkWn;                                       
        //for (k=0;k<N/2;k++){                               
        //                wn[k].real=(BITTYPE)(cos(2*PI*k/N)*WNS);
        //                wn[k].imag=(BITTYPE)(sin(-2*PI*k/N)*WNS);
        //        }
        ReverseIndex(x);                                       
        for(k=N;k>1;k=(k>>1))
        {                               
                ov=0;ovd=0;                                               
                for(i=0;i<N;i++)
                {               
                        if (x[i].real>DOVS || x[i].imag>DOVS || x[i].real<-DOVS || x[i].imag<-DOVS)                               
                        {
                                ovd=1;
                                break;
                        }
                        else if (x[i].real>OVS || x[i].imag>OVS || x[i].real<-OVS || x[i].imag<-OVS)                       
                        {
                                ov=1;
                        }
                }
                if (ovd==1)
                {
                        shift+=2;
                        for(i=0;i<N;i++)
                        {
                                x[i].real=x[i].real>>2;
                                x[i].imag=x[i].imag>>2;
                        }
                }
                else if(ov==1)
                {
                        shift+=1;
                        for(i=0;i<N;i++)
                        {
                                x[i].real=x[i].real>>1;
                                x[i].imag=x[i].imag>>1;
                        }
                }
                SubBlockNum=k>>1;                               
                SubBlockStep=SubBlockStep<<1;       
                wi=0;                                                       
                for(j=0;j<SubBlockStep>>1;j++)
                {
                        for(u=j;u<N;u+=SubBlockStep)
                        {                       
                                l=u+(SubBlockStep>>1);                                               
                                wn.real=(BITTYPE)(cos(2*PI*wi/N)*WNS);
                                wn.imag=(BITTYPE)(sin(-2*PI*wi/N)*WNS);
                               
                                #if (BIT==32)                       
                                XkWn.real=(((__int64)x[l].real*wn[wi].real)>>SHN)-(((__int64)x[l].imag*wn[wi].imag )>>SHN);
                                XkWn.imag=(((__int64)x[l].imag*wn[wi].real)>>SHN)+(((__int64)x[l].real*wn[wi].imag)>>SHN);
                                #else
                                XkWn.real=((x[l].real*wn.real)>>SHN)-((x[l].imag*wn.imag)>>SHN);
                                XkWn.imag=((x[l].imag*wn.real)>>SHN)+((x[l].real*wn.imag)>>SHN);
                                //XkWn.real=((x[l].real*wn[wi].real)>>SHN)-((x[l].imag*wn[wi].imag)>>SHN);
                                //XkWn.imag=((x[l].imag*wn[wi].real)>>SHN)+((x[l].real*wn[wi].imag)>>SHN);
                                #endif

                                x[l].real=x[u].real-XkWn.real;
                                x[l].imag=x[u].imag-XkWn.imag;
                                x[u].real=x[u].real+XkWn.real;
                                x[u].imag=x[u].imag+XkWn.imag;  
                        }
                        wi+=SubBlockNum;               
                }
        }
        return (11-shift);
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107679
QQ
发表于 2020-9-4 01:41:24 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-11 17:28 , Processed in 0.237893 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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