2010-06-17 11 views
14

Quiero hacer un programa que registre datos de audio usando PortAudio (tengo esta parte hecha) y luego mostrar la información de frecuencia de ese audio grabado (por ahora, Me gustaría mostrar la frecuencia promedio de cada uno de los grupos de muestras a medida que entran).Cómo extraer información de frecuencia de muestras de PortAudio usando FFTW en C

De alguna investigación que he hecho, sé que tengo que hacer una FFT. Así que busqué en Google una biblioteca para hacer eso, en C, y encontré FFTW.

Sin embargo, ahora estoy un poco perdido. ¿Qué se supone que debo hacer exactamente con las muestras que grabé para extraer información de frecuencia de ellas? ¿Qué tipo de FFT debo usar (supongo que necesitaría un 1D de datos real?)?

Y una vez que hago la FFT, ¿cómo obtengo la información de frecuencia de los datos que me proporciona?

EDIT: ahora también encontré el algoritmo de autocorrelación. ¿Es mejor? Más simple?

Muchas gracias de antemano, y lo siento, no tengo absolutamente ninguna experiencia si esto. Espero que tenga al menos un poco de sentido.

Respuesta

15

para convertir sus muestras de audio a un espectro de potencia:

  • si los datos de audio son datos enteros después convertirlo a punto
  • flotante elegir un tamaño de FFT (por ejemplo, N = 1024)
  • aplica un window function a N muestras de datos (por ejemplo Hanning)
  • utilizar una FFT-real a complejo de tamaño N para generar datos de dominio de frecuencia
  • calcular la magnitud de su fr complejo datos de dominio ecuencia (magnitude = sqrt(re^2 + im^2))
  • Convertir opcionalmente magnitud a una escala logarítmica (dB) (magnitude_dB = 20*log10(magnitude))
+1

PortAudio la posibilidad de grabar datos en formato flotador (32 bits de coma flotante). Por lo tanto, recomiendo el uso de esta sugerencia. – INS

+0

@Iulian: sí, eso sería lo más sensato, suponiendo que no tiene otro procesamiento previo que desee hacer en el dominio entero antes de generar el espectro de potencia. –

+0

Gracias, solo una más, probablemente una pregunta estúpida. He calculado todo, pero ahora digamos que quiero verificar si hay una frecuencia de 440Hz (medio A) presente en la señal. ¿Cómo puedo hacer eso? – houbysoft

Cuestiones relacionadas