Рассчитать частоту из выборки БПФ?

Я использую приведенный ниже код в Unreal Engine 4 для захвата микрофонного входа и получения результирующего БПФ.

У меня возникли проблемы с вычислением частоты на основе этих данных.

Я пытался найти максимальную амплитуду и принять ее за частоту, но это не кажется правильным.

// 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;
}

person Jiexi    schedule 17.05.2015    source источник
comment
Уже много дубликатов на SO, см., например. stackoverflow.com/questions/4914832/   -  person Paul R    schedule 18.05.2015


Ответы (1)


Я не вижу преобразования Фурье в вашем фрагменте кода. В любом случае, используя ДПФ с заданными N отсчетами со средней частотой дискретизации R, частота, соответствующая бину k, равна k· Р/2Н

person datenwolf    schedule 18.05.2015
comment
Я думаю, я должен неправильно интерпретировать данные. БПФ — это просто алгоритм для более быстрого получения ДПФ, верно? Ячейка ДПФ соответствует частоте, а значение в этой ячейке соответствует амплитуде? Когда я пытаюсь получить из этого частоту, ища ячейку с максимальной амплитудой, это кажется неправильным. Если я издаю высокий звук, разве пик не должен оставаться в верхних ячейках? Иногда я получаю пики в нижних ячейках. - person Jiexi; 18.05.2015
comment
@Jiexi: Это действительно зависит от макета данных, который выдает ваша конкретная реализация БПФ. В некоторых реализациях часть постоянного тока (частота 0) находится в среднем бине, а абсолютная частота увеличивается в обоих направлениях (абсолютная частота, потому что БПФ покажет частоты и их зеркальные частоты (отрицательные в большинстве случаев)). Или иногда БПФ помещает действительную и сложную часть в любую половину. Вы не показали фактический код БПФ, поэтому я могу указать только общее направление решения. - person datenwolf; 18.05.2015