ARM Cortex-M0中的FFT返回NaN或无穷大

时间:2015-06-24 21:29:07

标签: c arm fft cortex-m

我正在使用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的点数。

0 个答案:

没有答案