2013-06-04 78 views
0

目前我在Tizen IDE上工作。KissFFT输出返回nan值?

我已经从MicroPhone读取输入数据并尝试对其应用FFT ......但是每当我从FFT获取nan输出。

这里是我的代码..

ShortBuffer *pBuffer1 = pData->AsShortBufferN(); 

fft = new KissFFT(BUFFER_SIZE); 

std::vector<short> input(pBuffer1->GetPointer(), 
     pBuffer1->GetPointer() + BUFFER_SIZE); // this contains audio data 
std::vector<float> specturm(BUFFER_SIZE); 

fft->spectrum(input, specturm); 

采用FFT

void KissFFT::spectrum(KissFFTO* fft, std::vector<short>& samples2, 
     std::vector<float>& spectrum) { 


    int len = fft->numSamples/2 + 1; 

    kiss_fft_scalar* samples = (kiss_fft_scalar*) &samples2[0]; 

    kiss_fftr(fft->config, samples, fft->spectrum); 

    for (int i = 0; i < len; i++) { 

     float re = scale(fft->spectrum[i].r) * fft->numSamples; 
     float im = scale(fft->spectrum[i].i) * fft->numSamples; 

     if (i > 0) 
     spectrum[i] = sqrtf(re * re + im * im)/(fft->numSamples/2); 
     else 
     spectrum[i] = sqrtf(re * re + im * im)/(fft->numSamples); 
     AppLog("specturm %d",spectrum[i]); // everytime returns returns nan output 
    } 

} 
    KissFFTO* KissFFT::create(int numSamples) { 

    KissFFTO* fft = new KissFFTO(); 
    fft->config = kiss_fftr_alloc(numSamples/2, 0, NULL, NULL); 
    fft->spectrum = new kiss_fft_cpx[numSamples/2 + 1]; 
    fft->numSamples = numSamples; 

    return fft; 
} 

缩放

static inline float scale(kiss_fft_scalar val) { 
    if (val < 0) 
     return val * (1/32768.0f); 
    else 
     return val * (1/32767.0f); 
} 

回答

1
 AppLog("specturm %d",spectrum[i]); // everytime returns returns nan output 

尝试使用%f而不是%d。

+0

没有它的不工作..有时0.0000和楠产量没有得到完美的输出 –

+0

看看这篇文章。似乎与你的问题高度相关。 [链接](http://stackoverflow.com/questions/4453372/sqrt1-0-pow1-0-2-returns-nan?rq=1) –