我正在使用32位ARM Cortex-M0 RedBearLab nRF51822,我正在尝试开发一种函数来计算信号的FFT。
我可以使用此功能获得信号的256点FFT,但是当我尝试512点FFT(或更多)时,它会返回无限值和NaN。但是,当我在32位ARM Cortex-M4 Teensy 3.1中使用我的功能时,它可以很好地工作。
在这里,我展示了我的代码:
void fourier_transform(double samples[], const int n, const int isign) {
int nn,mmax,m,j,istep,i;
float wtemp,wr,wpr,wpi,wi,theta,tempr,tempi;
//if (n<2 || n&(n-1)) throw("n must be power of 2 in four1");
nn = n << 1;
j = 1;
for (i=1;i<nn;i+=2) {
if (j > i) {
double a = samples[j-1];
samples[j-1] = samples[i-1];
samples[i-1] = a;
double b = samples[j];
samples[j] = samples[i];
samples[i] = b;
//SWAP(data[j-1],data[i-1]); //ver o que faz
//SWAP(data[j],data[i]);
}
m=n;
while (m >= 2 && j > m) {
j -= m;
m >>= 1;
}
j += m;
}
mmax=2;
while (nn > mmax) {
istep=mmax << 1;
theta=isign*(6.28318530717959/mmax);
wtemp=sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi=sin(theta);
wr=1.0;
wi=0.0;
for (m=1;m<mmax;m+=2) {
for (i=m;i<=nn;i+=istep) {
j=i+mmax;
tempr=wr*samples[j-1]-wi*samples[j];
tempi=wr*samples[j]+wi*samples[j-1];
samples[j-1]=samples[i-1]-tempr;
samples[j]=samples[i]-tempi;
samples[i-1] += tempr;
samples[i] += tempi;
}
wr=(wtemp=wr)*wpr-wi*wpi+wr;
wi=wi*wpr+wtemp*wpi+wi;
}
mmax=istep;
}
}
samples[]
是带有我信号的数组,在FFT结束时,结果放在这里。 n
是我用来获取FFT的点数。