2011-09-21 11 views
5

He visto varias preguntas de FFT aquí, pero estoy confundido en parte de la implementación. En lugar de realizar la FFT en tiempo real, quiero hacerlo sin conexión. Digamos que tengo los datos brutos en float[] audio. La frecuencia de muestreo es 44100, por lo que audio[0] to audio[44099] contendrá 1 segundo de audio. Si mi función FFT maneja las ventanas (por ejemplo, Hanning), ¿simplemente pongo todo el buffer audio en la función de una vez? O, ¿tengo que cortar el audio en trozos de 4096 (el tamaño de mi ventana) y luego ingresarlo en la FFT que luego realizará la función de ventana en la parte superior?FFT - ¿Cuándo mirar?

+1

Sin duda, esto depende de las características específicas de la biblioteca FFT que se están usando. – Mankarse

+0

Esta pregunta es una mejor opción para dsp.stackexchange.com. ¿Debería ser movido? –

+0

@Mankarse - Sí, lo siento, debería haber sido más específico. Tenía tres libs de FFT diferentes y no estaba seguro de cuál iba a usar. Decidí usar el que está en el marco Accelerate de Apple. – Skoder

Respuesta

2

Es posible que deba copiar sus datos de entrada en un búfer separado y obtenerlos en el formato correcto, p. si su FFT está en su lugar, o si requiere datos complejos intercalados (reales/imaginarios). Sin embargo, si su rutina de FFT puede tomar una entrada puramente real y no está en su lugar (es decir, no destructiva), entonces puede simplemente pasar un puntero a los datos de muestra originales, junto con un parámetro de tamaño apropiado.

Normalmente para 1 s de audio, p. Ej. habla o música, elegiría un tamaño de FFT que corresponde a un fragmento de audio razonablemente estacionario, p. 10 ms o 20 ms. Por lo tanto, a 44.1 kHz, su tamaño de FFT podría ser 512 o 1024. Luego generaría espectros sucesivos avanzando a través de su buffer y haciendo una nueva FFT en cada punto de inicio. Tenga en cuenta que es una práctica común superponer estos buffers sucesivos, generalmente en un 50%. Entonces, si N = 1024 su primera FFT sería para las muestras 0..1023, la segunda sería para las muestras 512..1535, luego 1024..2047, etc.

+0

Gracias por la ayuda Paul. Voy a utilizar el marco Accelerate de Apple, que creo que realiza una FFT en el lugar, así que creo que necesito manipular los datos en un buffer separado. Entonces, si tengo una canción que tiene 180 segundos de duración, simplemente repito el buffer como se describe y realizo la FFT hasta N = 7938000 (44100 * 180). – Skoder

+2

Si el nombre de la función termina en "ip", está en su lugar, p. 'vDSP_fft_zrip'. Así que sí, copie cada fragmento de datos de entrada en un búfer FFT adecuado, aplique una función de ventana (por ejemplo, Hann), aplique FFT, calcule el espectro de potencia o lo que quiera hacer, almacene y/o muestre el espectro de potencia para este fragmento, siga adelante al próximo fragmento ... –

+1

Vea también: http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

El tamaño del fragmento o la longitud de la ventana que elija controla la resolución de frecuencia y la resolución de tiempo del resultado de FFT. Tienes que determinar qué quieres o qué trade-off hacer.

Las ventanas más largas le dan una mejor resolución de frecuencia, pero peor resolución de tiempo. Ventanas más cortas, viceversa. Cada contenedor de resultados de FFT contendrá un ancho de banda de frecuencia de aproximadamente 1 a 2 veces la frecuencia de muestreo dividida por la longitud de FFT, dependiendo de la forma de la ventana (rectangular, von Hann, etc.), no solo de una sola frecuencia. Si toda su porción de datos está estacionaria (el contenido de frecuencia no cambia), es posible que no necesite ninguna resolución de tiempo, y puede obtener una "resolución" de frecuencia de 1 a 2 Hz en su 1 segundo de datos. Promediar múltiples ventanas cortas de FFT también puede ayudar a reducir la varianza de sus estimaciones espectrales.

+0

No estoy seguro si está familiarizado con él, pero estoy tratando de crear algo similar a AudioSurf (este video muestra un buen ejemplo de reconocimiento de tempo de aproximadamente 20 segundos en http://www.youtube.com/watch?v= 2EsVyEnhxWY). AudioSurf preprocesa el audio en lugar de hacerlo en tiempo real y no estaba muy seguro de cómo se hizo esto. – XSL

+0

@SSL - ¿Por qué estás buscando una FFT de solo 1 segundo de datos para el reconocimiento de tempo? O si se trata de algo que va más allá de la pregunta original de OP, quizás deba hacer su propia pregunta nueva sobre SO. – hotpaw2

+0

Estaba más allá de la pregunta original, pero tenía curiosidad sobre lo mismo que OP. No necesito la información ahora mismo, así que crearé un nuevo hilo cuando cruce ese puente. – XSL

2

La elección de si se debe calcular una FFT en todo el conjunto de datos (en el caso del OP, 44100 muestras que representan 1 segundo de datos) o si se debe hacer una serie de FFT sobre subconjuntos más pequeños del conjunto de datos completo. depende de los datos y del propósito de la FFT.

Si los datos son relativamente estáticos espectralmente en todo el conjunto de datos, entonces una FFT sobre todo el conjunto de datos es probablemente todo lo que se necesita.

Sin embargo, si los datos son dinámicos espectralmente sobre el conjunto de datos, entonces múltiples FFT deslizantes sobre subconjuntos pequeños de los datos crearían una representación de frecuencia de tiempo más precisa de los datos.

El siguiente diagrama muestra el espectro de potencia de una guitarra acústica que reproduce una nota A4. La señal de audio se muestreó a 44.1 KHz y el conjunto de datos contiene 131072 muestras, casi 3 segundos de datos. Este conjunto de datos se multiplicó previamente con una función de ventana de Hann.

Guitar spectrum, Hann window, 131072 samples

La trama abajo muestra el espectro de potencia de un subconjunto de 16384 muestras (de 0 a 16383) tomados del conjunto de datos completo de la nota de guitarra A4 acústica. Este subconjunto también se pre-multiplicó con una función de ventana de Hann.

Guitar spectrum, Hann window, 16384 samples

Aviso cómo la distribución de energía espectral del subconjunto es significativamente diferente de la distribución de energía espectral de la serie de datos completa.

Si extrajésemos subconjuntos del conjunto completo de datos, usando un marco de muestra deslizante 16384 y calculamos el espectro de potencia de cada cuadro, crearíamos una imagen precisa de tiempo-frecuencia del conjunto completo de datos.

Referencias:

datos de la señal de audio real, la función Hann ventana, parcelas, FFT, y el análisis espectral se realizaron aquí:

Fast Fourier Transform, spectral analysis, Hann window function, audio data