Utilizando el marco de Accelerate de Apple, FFT, window Hann y Overlapping

Estoy tratando de configurar FFT para un proyecto y realmente no obtuve una image clara de las cosas … Básicamente, estoy usando Audio Units para get los datos del micrófono del dispositivo. Entonces quiero hacer FFT con esos datos. Esto es lo que entiendo hasta ahora: necesito configurar un búfer circular para mis datos. En cada búfer lleno, aplico una Hann window luego hago una FFT . Sin embargo, todavía necesito ayuda en la superposition. Para get resultados más precisos, comprendo que necesito usar esto especialmente ya que estoy usando windows. Sin embargo, no puedo encontrar nada en esto … Esto es lo que tengo hasta ahora (utilizado para la detección de tonos):

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

Entonces, ¿dónde y cómo includeía la superposition? Además, cualquier fragment de código sería más que bienvenido. Gracias

ACTUALIZAR:

El objective final de este proyecto es hacer una huella digital del audio, lo más cerca posible del time real, por lo que necesito que los resultados sean lo más precisos posible, por lo tanto, la superposition. Para este propósito, creo que podría dejar caer toda la parte de inverso a la limpieza.

En realidad, no es necesario que se superpongan; por lo general, los frameworks se superponen para proporcionar una mayor resolución en el eje del time, por ejemplo, para trazar espectrogtwigs o para estimar los times de inicio de la nota. Podría get su código trabajando sin solapamiento por ahora, ya que es less complicado, y luego decidir si necesita una mayor resolución en el eje de time más adelante.

Si decide que desea agregar solapamiento, deberá save un fragment del buffer anterior (por ejemplo, el 50%) y luego, para cada nuevo buffer, procesará dos búferes completos de la siguiente manera:

  • procesar el último 50% del buffer anterior + primer 50% del buffer nuevo
  • procesar el 100% del tampón nuevo
  • guarde el último 50% del nuevo búfer para la próxima iteración

Para diferentes porcentajes de superposition se aplica una lógica similar.

Tenga en count que el aumento de superposition más allá de un cierto punto puede volverse contraproducente ya que el ancho de banda de procesamiento requerido aumenta en gran medida con poca ganancia en resolución.