如何从Tizen上的实时FFT中获得最准确的音频数据?

How do I get most accurate audio frequency data possible from real time FFT on Tizen?

本文关键字:数据 音频 Tizen FFT 实时      更新时间:2023-10-16

目前我正在开发Tizen IDE。

我已经从麦克风读取输入数据并对其应用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;
}

fft->config中应该有一些关于FFT大小的参数,如2048,4096,即2的幂。如果你增加这个值,你可以在频率上得到更高的分辨率。