2013-09-21 1 views
3

Я пытаюсь настроить 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:

Конечной целью данного проекта является сделать дактилоскопию аудио, как можно ближе к реальному времени, насколько это возможно, так мне нужны результаты как можно более точным - таким образом пересекающиеся. Для этого я думаю, что я мог бы отбросить всю часть от обратного к очистке.

ответ

1

Вы не на самом деле нуждаетесь в для перекрытия - обычно кадры перекрываются, чтобы обеспечить более высокое разрешение на оси времени, например. для построения спектрограмм или для оценки времени начала записи. Вы могли бы просто заставить ваш код работать без перекрытия на данный момент, поскольку он менее сложный, а затем решить, нужно ли вам более высокое разрешение на временной оси позже.

Если вы решили, что хотите добавить перекрытие, то вам нужно будет сохранить кусок предыдущего буфера (например, 50%), а затем для каждого нового буфера вы будете обрабатывать два полных буфер следующим образом:

  • процесс в прошлом 50% от старого буфера + первых 50% нового буфера
  • процесса 100% нового буфера
  • сохранить последние 50% новый буфер для следующей итерации

для различного перекрытия на применяется аналогичная логика.

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

+0

См. Обновление по вопросу. Спасибо –

+0

OK - см. Последнюю часть моего ответа о том, как сделать перекрытие. –

+0

Я думаю о снижении частоты дискретизации примерно до 16 кГц вместо типичного 44,1 кГц. это должно позволить мне добавить большее перекрытие без значительного увеличения ширины полосы обработки. в любом случае попробуем это и дадим вам знать, как это происходит. –