【问题标题】:Calculate frequency from FFT sample?从 FFT 样本计算频率?
【发布时间】:2015-05-17 22:50:55
【问题描述】:

我在虚幻引擎 4 中使用以下代码来捕获麦克风输入并获得结果 FFT。

我无法根据此数据计算频率。

我尝试找到最大幅度并将其作为频率,但这似乎不正确。

// Additional includes:
#include "Voice.h"
#include "OnlineSubsystemUtils.h"

// New class member:
TSharedPtr<class IVoiceCapture> voiceCapture;

// Initialisation:
voiceCapture = FVoiceModule::Get().CreateVoiceCapture();
voiceCapture->Start();

// Capturing samples:
uint32 bytesAvailable = 0;
EVoiceCaptureState::Type captureState = voiceCapture->GetCaptureState(bytesAvailable);
if (captureState == EVoiceCaptureState::Ok && bytesAvailable > 0)
{
    uint8 buf[maxBytes];
    memset(buf, 0, maxBytes);
    uint32 readBytes = 0;
    voiceCapture->GetVoiceData(buf, maxBytes, readBytes);

    uint32 samples = readBytes / 2;
    float* sampleBuf = new float[samples];

    int16_t sample;
    for (uint32 i = 0; i < samples; i++)
    {
        sample = (buf[i * 2 + 1] << 8) | buf[i * 2];
        sampleBuf[i] = float(sample) / 32768.0f;
    }

    // Do fun stuff here

    delete[] sampleBuf;
}

【问题讨论】:

标签: c++ fft frequency-analysis unreal-engine4


【解决方案1】:

我没有看到要在您的代码 sn-p 中执行傅立叶变换。无论如何,使用 DFT 给定 N 个样本,平均采样频率为 R,对应于 bin k 的频率为 k· R/2N

【讨论】:

  • 我想我一定是误解了数据。 FFT 只是一种更快获得 DFT 的算法,对吧? DFT bin对应于频率,该bin中的值对应于幅度?当我尝试通过查找具有最大幅度的 bin 来从中获取频率时,它似乎不正确。如果我发出高音,峰值不应该保留在较高的 bin 中吗?我有时会在较低的垃圾箱中看到峰值。
  • @Jiexi:这实际上取决于您的特定 FFT 实现发出的数据布局。一些实现在中间 bin 中具有 DC 部分(频率 0),并且绝对频率在两个方向上上升(绝对频率,因为 FFT 将显示频率及其镜像频率(在大多数情况下为负))。或者有时 FFT 会将实数部分和复数部分放在任何一半中。您没有显示实际的 FFT 代码,所以我只能指出解决方案的大致方向。
猜你喜欢
  • 2021-03-09
  • 2014-12-18
  • 2020-05-22
  • 1970-01-01
  • 2013-04-10
  • 2012-11-11
  • 2017-06-06
  • 2019-11-28
  • 2013-12-06
相关资源
最近更新 更多