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

Posted

技术标签:

【中文标题】如何从 Tizen 上的实时 FFT 获得最准确的音频数据?【英文标题】:How do I get most accurate audio frequency data possible from real time FFT on Tizen? 【发布时间】:2013-06-05 04:27:46 【问题描述】:

目前我正在开发 Tizen IDE。

我已从 microPhone 读取输入数据并对其应用 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;

【问题讨论】:

【参考方案1】:

fft-&gt;config中应该有一些关于FFT大小的参数,比如2048、4096,即2的幂。如果你增加这个值,你可以获得更多的频率分辨率。

【讨论】:

fft->config 在我的代码中是的,我的 FFT 大小为 8192 ..但问题是我得到了 nan 输出 @Sunny shah,那么 fft->numSamples 可能为 0 @Sunny shah operation sqrtf(re * re + im * im) 可能会导致溢出,你能检查一下吗?可能需要 double 类型而不是 float。

以上是关于如何从 Tizen 上的实时 FFT 获得最准确的音频数据?的主要内容,如果未能解决你的问题,请参考以下文章

具有高分辨率的实时 FFT,同时保持低延迟

如何在 iPhone 上编写实时准确的音频音序器?

macOS Sierra 上的 Tizen Studio 和 SDB

如何获得最准确的位置?

如何使用 NAudio 实时计算 FFT(ASIO 输出)

如何获得实时跟踪结果?