|
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);
}
|
|