2015-05-17 4 views
0

Я использую приведенный ниже код в Unreal Engine 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; 
} 
+0

Многих дубликаты на SO уже, смотрите, например, http://stackoverflow.com/questions/4914832/how-to-get-the-fundamental-frequency-from-fft?rq=1 –

ответ

1

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

+0

Думаю, я должен неправильно интерпретировать данные. FFT - это просто алгоритм для ускорения ДПФ, верно? DFT-бит соответствует частоте, а значение в этом бункере соответствует амплитуде? Когда я пытаюсь получить частоту от этого, ища бин с максимальной амплитудой, это не кажется правильным. Если я сделаю высокий звук, не должен ли пик оставаться в более высоких ячейках? Я иногда получаю пики в нижних ящиках. – Jiexi

+0

@Jiexi: Это действительно зависит от расположения данных, которые выбрала ваша конкретная реализация FFT. В некоторых реализациях есть часть постоянного тока (частота 0) в среднем бункере, а абсолютная частота увеличивается в обоих направлениях (абсолютная частота, так как БПФ будет отображать частоты и их зеркальные частоты (в большинстве случаев отрицательные)). Или иногда БПФ будет размещать реальную и сложную часть в любой половине. Вы не указали фактический код FFT, поэтому я могу указать только в общем направлении решения. – datenwolf