2011-02-07 21 views
5

Recientemente hice esta pregunta: How to get the fundamental frequency from FFT? (que en realidad no necesita leerlo)¿Cómo usar cepstral?

Mi duda en este momento es: cómo utilizar el algoritmo de cepstral?

Simplemente no sé cómo usarlo debido a que el único idioma que sé es ActionScript 3, y por esta razón por la que tienen pocas referencias acerca de las funciones nativas que se encuentran en C, Java, etc., y cómo debería implementarlos en AS. La mayoría de los artículos están a punto de idiomas =/ (aunque, respuestas en otros idiomas que como son bienvenidos, simplemente explicar cómo funciona el guión por favor)

Los artículos que he encontrado sobre cepstral para encontrar la frecuencia fundamental de un resultado FFT me dijo que yo debería hacer esto:

señal → FT → abs() → cuadrado → registro → FT → abs() → cepstrum cuadrado → potencia

matemáticamente: | F {log (| F {f (t)} | ²)} | ²

Información importante:

  • Estoy desarrollando un afinador de guitarra flash
  • Esta es la primera vez que estoy tratando de sonido avanzado
  • estoy usando una FFT para extraer contenedores de frecuencia de la señal que llega de usuario de micrófono, pero se quedó atascado en conseguir la frecuencia fundamental de ella

no sé:

  • Cómo aplicar un cuadrado en un ARRAY (es decir, los datos que mi FFT me da es una matriz. ¿Debería multiplicarlo solo? La depuración de ActionScript arroja errores cuando intento fftResults * fftResults)
  • Cómo aplicar el "registro". No sabría cómo aplicarlo incluso si tuviera un solo número.
  • Cuál es la diferencia entre cepstral complejo y cepstral de potencia. Además, ¿qué debo usar? Estoy tratando de desarrollar un afinador de guitarra.

Gracias!

Respuesta

1

Hay muchas maneras de encontrar la frecuencia fundamental (F0).

Para idiomas como Java, etc., hay muchas bibliotecas con ese tipo de algoritmos ya implementados (puede estudiar sus fuentes).

  • MFCC (basado en cepstral) implementado en Comirva (fuente abierta).
  • Audacity (versión beta!) (Código abierto) presenta cepstrum, autocorellation, mejorado autocorellation,
  • Yin basado en autocorrelación (example)
  • Encontrar los valores de señal máximo después de FFT

Todos estos algoritmos pueden ser muy útil para ti.Sin embargo, la manera más fácil de obtener F0 (un valor en Hz) sería usar Yin.

+0

¿Son estos métodos lo suficientemente precisos para hacer un afinador de guitarra? Quiero decir ... ¡necesito una precisión realmente alta! –

+0

Depende de muchas cosas: la calidad del micrófono, los ruidos, etc. A veces también se necesitan algunos algoritmos para eliminar el ruido. Puede ejecutar ese ejemplo de Yin: es una aplicación que captura el sonido del micrófono y muestra f0 - prueba y verificación con el sintonizador normal (¿hardware?). – mmatloka

+0

Leí la mitad de ESTO: http://recherche.ircam.fr/equipes/pcm/cheveign/ps/2002_JASA_YIN_proof.pdf parece ser algún tipo de documentación, pero me está friendo el cerebro. No quiero molestarte, pero ¿podrías decirme cómo debo implementar estas ecuaciones? En la señal, en un resultado fft, ¿y cómo? ¡Muchas gracias por su ayuda! –

6

Tenga en cuenta que la salida de una FFT es una matriz de valores complejos, es decir, cada bin = re + j*im. Creo que puedes combinar las operaciones de abs y cuadrado y calcular re*re + im*im para cada contenedor. Esto le da un único valor positivo para cada contenedor, y obviamente puede calcular el valor de registro para cada contenedor con bastante facilidad. Luego necesita hacer una segunda FFT en estos datos de log al cuadrado y nuevamente usando la salida de esta segunda FFT calculará re*re + im*im para cada bin. Luego tendrá una matriz de valores positivos que tendrán uno o más picos que representan la frecuencia o frecuencias fundamentales de su entrada.

+0

un ejemplo de una matriz que obtengo: [0.123123,0.4809,0.0498356,0,000231,82.31240987,0.1230987 ................. ....................... valor 1020, valor 1021, valor 1022, valor 1023, valor 1024]. Estos valores son solo números. No son complejos, ¿verdad? –

+0

@Lucas: depende de qué FFT en particular esté usando en cuanto a cómo se organizan los datos de entrada y salida. Algunos usarán un tipo de datos complejo, algunos intercalarán partes reales e imaginarias, y algunos tendrán todas las partes reales en la primera mitad de la matriz y las partes imaginarias en la segunda (dos matrices, de manera efectiva): es necesario leer y comprenda los documentos para su FFT elegida. –

+0

@PaulR: Al tomar FFT en N muestras se obtienen N valores que corresponden a N/2 números complejos (bins). Pero, después de calcular la magnitud cuadrada, solo me quedan valores N/2 que en FFTing nuevamente solo dan N/4 números complejos. ¿Es eso cierto? ¿Cómo calculamos la frecuencia del contenedor después de la segunda FFT? ¿Puedes corregirme/ayudarme con esto? – Ravi

2

La autocorrelación es el enfoque más fácil y lógico, y el mejor lugar para comenzar.

Para que esto funcione, comience con una autocorrelación simple, y luego, si es necesario, mejore siguiendo el esquema proporcionado por YIN. (YIN se basa en la autocorrelación con refinamientos, pero el hecho de que necesite estos refinamientos depende de los detalles de su situación.) De esta manera también puede aprender sobre la marcha en lugar de tratar de entender todo de una vez.

Aunque los enfoques FFT también pueden funcionar, son un poco más confusos. El problema es que lo que realmente buscas es el período, y esto no está bien representado por la FFT. El fundamental faltante es un buen ejemplo de esto, donde si tienes 2Hz y 3Hz, el fundamental es 1Hz, pero no está en ninguna parte en la FFT, mientras que 1Hz es obvio en una representación basada en el tiempo (por ejemplo, la autocorrelación). Añada a esto que los armónicos no son necesariamente armónicos, y de ruido, etc. ... y todos estos problemas generalmente hacen que sea mejor comenzar con un enfoque directo del problema.

+0

¿Conoces algún código de autocorrelación para mostrarme? Además, ¿la autocorrelación está basada en FFT en algún momento? –

+0

La autocorrelación es muy fácil de implementar, aunque exactamente lo que haga dependerá de las herramientas que tenga disponibles, y no conozco actionscript. La mayoría de las bibliotecas que hacen cálculos matemáticos en matrices tienen una función "correlacionar", y luego simplemente correlacionan los datos consigo mismos. Si no tiene este tipo de cosas, aquí hay un ejemplo de C++ (http://www.koders.com/cpp/fidEB813F60127CA4FA79CE6ACDF6741303707951AD.aspx?s=include). Pero es fácil escribir el suyo, solo multiplique el objeto con una versión modificada de sí mismo. – tom10

+0

Para la segunda parte de su pregunta: a veces es más rápido calcular la autocorrelación usando una FFT, pero por ahora, piense en esto simplemente como un truco de cálculo. Uno puede hacerlo de cualquier manera, con la FFT o sin ella. – tom10