Я пытаюсь настроить FFT
на проект и действительно не получил четкой картины о вещах ... В принципе, я использую Audio Units
, чтобы получить данные из микрофон устройства. Затем я хочу сделать FFT
по этим данным. Это то, что я понимаю до сих пор: мне нужно настроить круговой буфер для моих данных. В каждом заполненном буфере я применяю Hann window
, затем делаю FFT
. Однако мне по-прежнему нужна помощь в перекрытии. Чтобы получить более точные результаты, я понимаю, что мне нужно использовать это, потому что я использую windowing. Тем не менее, я не могу найти что-нибудь по этому поводу ... Вот что я до сих пор (используется для обнаружения основного тона):Использование ускорителя Apple, FFT, окна Hann и перекрытие
// Setup -------------
UInt32 log2N = 10; // 1024 samples
UInt32 N = (1 << log2N);
FFTSetup FFTSettings = vDSP_create_fftsetup(log2N, kFFTRadix2);
COMPLEX_SPLIT FFTData;
FFTData.realp = (float *) malloc(sizeof(float) * N/2);
FFTData.imagp = (float *) malloc(sizeof(float) * N/2);
float * hannWindow = (float *) malloc(sizeof(float) * N);
// create an array of floats to represent a hann window
vDSP_hann_window(hannWindow, N, 0);
// FFT Time ----------
// Moving data from A to B via hann window
vDSP_vmul(A, 1, hannWindow, 1, B, 1, N);
// Converting data in B into split complex form
vDSP_ctoz((COMPLEX *) B, 2, &FFTData, 1, N/2);
// Doing the FFT
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Forward);
// calculating square of magnitude for each value
vDSP_zvmags(&FFTData, 1, FFTData.realp, 1, N/2);
// Inverse FFT
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Inverse);
// Storing the autocorrelation results in B
vDSP_ztoc(&FFTData, 1, (COMPLEX *)B, 2, N/2);
vDSP_Length lastZeroCrosssing;
vDSP_Length zeroCrossingCount;
vDSP_nzcros(B, 1, N, &lastZeroCrossing, &zeroCrossingCount, N);
// Cleanup -----------
vDSP_destroy_fftsetup(FFTSettings);
free(FFTOutput.realp);
free(FFTOutput.imagp);
free(hannWindow);
Итак, где и как бы я включаю перекрытием? Кроме того, любые фрагменты кода будут более приветствуемыми. Благодаря
UPDATE:
Конечной целью данного проекта является сделать дактилоскопию аудио, как можно ближе к реальному времени, насколько это возможно, так мне нужны результаты как можно более точным - таким образом пересекающиеся. Для этого я думаю, что я мог бы отбросить всю часть от обратного к очистке.
См. Обновление по вопросу. Спасибо –
OK - см. Последнюю часть моего ответа о том, как сделать перекрытие. –
Я думаю о снижении частоты дискретизации примерно до 16 кГц вместо типичного 44,1 кГц. это должно позволить мне добавить большее перекрытие без значительного увеличения ширины полосы обработки. в любом случае попробуем это и дадим вам знать, как это происходит. –