Estoy tratando de averiguar cómo (si es posible) extraer los componentes de frecuencia de una muestra de audio arbitraria (típicamente música) de manera similar a FFT, pero en mi investigación sobre el algoritmo FFT, estoy aprendiendo que sufre algunos restricciones severas para este propósito.
Hay 3 problemas que presenta la FFT:
Debido a que la resolución del contenedor FFT es equivalente al tamaño de su ventana, para lograr una precisión bastante razonable (digamos 1 Hz), necesita una ventana irrazonablemente larga (digamos 1 segundo). Esto significa que no puede detectar transitorios o frecuencias recién introducidas rápidamente. También significa que el problema no se puede resolver con una CPU más rápida y una frecuencia de muestreo más alta: la restricción está intrínsecamente ligada al tiempo.
Los humanos perciben la frecuencia logarítmicamente, pero los contenedores FFT están espaciados linealmente. Por ejemplo, una diferencia de 20 Hz en el extremo inferior de nuestra audición es enorme , mientras que una diferencia de 20 Hz en el extremo superior es imperceptible. Entonces, para obtener la precisión que requerimos a bajas frecuencias, tenemos que calcular mucho más de lo que requerimos a altas frecuencias.
Algunos de estos problemas pueden resolverse interpolando entre contenedores FFT. Esto puede funcionar para mucho audio musical, porque las frecuencias a menudo estarán separadas bastante y, por lo tanto, no se filtrará más de 1 frecuencia en un par de contenedores. Pero este no siempre será el caso, particularmente para sonidos inarmónicos como instrumentos de percusión. Entonces la interpolación es realmente solo una conjetura.
Por lo que entiendo del algoritmo DFT / FFT, las salidas (amplitudes de bin) son efectivamente la correlación del seno / coseno en la frecuencia de cada bin. Me sorprende que si el algoritmo pudiera rediseñarse de modo que las frecuencias del depósito se distribuyan de manera no lineal (es decir, correlacionamos un conjunto diferente de senos / cosenos), entonces podríamos lograr una resolución psicoacústicamente igual en todas las frecuencias. ¿Es esto posible, o es un sueño imposible basado en mi comprensión incompleta de las matemáticas involucradas?
Supongo que también podría resolver el problema con la fuerza bruta, correlacionando senos / cosenos en cada frecuencia que me interese. No estoy demasiado al tanto de las matemáticas aquí. es posible? ¿Qué tipo de eficiencia? ¿Resolvería mi problema?
¿Existe una forma diferente de lograr una descomposición de frecuencia más precisa y en tiempo real de una señal? La eficiencia de la CPU es una preocupación, pero no la principal. Estoy parcialmente interesado en saber si en teoría se puede hacer. Sin embargo, algo que sea factible en tiempo real en una máquina de escritorio moderna sería ideal.
Respuestas:
Como comenté en una publicación anterior, el método de análisis de frecuencia de tiempo conocido como "transformada de Fourier a corto plazo" es equivalente a un banco de filtros, analizando su señal x . Para una ventana de análisis dada w n , de tamaño N , el filtro a la frecuencia k / N es:X x wn N k/N
Para las ventanas de análisis habituales (Hann, Hamming o incluso un rectángulo), esto corresponde a un filtro de paso bajo, con una frecuencia de corte de alrededor de , que se "desplaza" al bin de frecuencia (gracias a la compleja modulación exponencial) , por lo tanto, conduce a un filtro de paso de banda.k1 / N k
En este punto, para responder directamente a su preocupación por reflejar la percepción humana, algunas personas derivaron la ["transformación Q constante" (CQT)] [Brown91]. Se basa en el mismo principio que el FT, en su interpretación del banco de filtros. Sin embargo, los centros no están linealmente espaciados como para un FT "normal", sino que están separados por log2. La escala está entonces estrechamente relacionada con una escala musical occidental: si uno elige , entonces obtenemos 12 frecuencias por octava (¿suena una campana? :-)), y el ancho de banda se establece en, por ejemplo,f k + 1 = 2 1 / 12 f kFk Fk + 1= 21 / 12Fk . También puede elegir otros centros, según sus necesidades.21 / 12- 12Fk
Puede encontrar implementaciones del CQT aquí y allá, una reciente del Prof. Klapuri, que viene con un inverso bastante decente aquí . El grupo Audio de Telecom ParisTech también tiene una implementación del Prof. Prado, pero aún no lo he probado.
[Brown91] J. Brown, "Cálculo de una transformación espectral Q constante", Journal of the Acoustical Society of America, 1991, 89, 425-434
EDITAR 20121014: algunas respuestas y comentarios a sus preguntas (de bryhoyt).
Solo ideas generales sobre sus propios comentarios a la pregunta principal: Parece que le interesan muchas aplicaciones que, para mí, no son problemas triviales para abordar. El "modelado de timbre" me parece más relacionado con el reconocimiento de voz o similares, para los cuales la resolución o precisión de tono o frecuencia no es un gran problema (considere cómo se calculan los MFCC).
Considere también cuántos investigadores importantes ( F. Pachet y el equipo de repmus en IRCAM, Francia , por citar algunos) están trabajando en el tema de la improvisación automática y el acompañamiento: la tarea no es imposible, pero requiere experiencia en muchas áreas. Para resumir, un sistema típico necesita imitar el sistema auditivo humano (al menos), implementar la percepción de sonido / música / tono / ritmo, conocer la teoría de la música y tomar decisiones basadas en las estimaciones de todos los pasos anteriores. La transformación de Fourier, o cualquier representación de señal, es solo un paso (pequeño) hacia el objetivo final, y potencialmente, en mi opinión, el mejor entendido hasta ahora.
Dicho esto, todavía existe la posibilidad de que todos estén mirando mucho más allá de lo que realmente sucede, ¡y que usted pueda acabar con una solución simple y elegante! ¡No olvides publicarlo una vez que esté listo! :-)
Respuesta corta: ¡lee mi tesis sobre estimación de melodías!
Para elaborar un poco más: muchos algoritmos de estimación de tono van más allá de las limitaciones del FT, gracias a los supuestos sobre los sonidos a procesar. Esperamos que las notas de los sonidos naturales (voz humana, oboe, saxo, piano ...) sean más complejas que las sinusoides individuales. La mayoría de los sonidos agudos son más o menos armónicos, lo que significa que pueden modelarse como sumas de sinusoides cuya frecuencia es un múltiplo de la frecuencia fundamental.
Por lo tanto, es útil tener en cuenta estos armónicos al estimar el tono, ya que existen métodos que utilizan funciones de detección como sumas espectrales, productos espectrales o funciones de autocorrelación. Alguien comenzó un tema relacionado recientemente.
Como se dijo anteriormente, con una ventana de 0.005s, puede esperar algo así como 200Hz de "fuga de frecuencia". Eso es realmente un problema solo cuando tienes 2 sinusoides con frecuencias que están más cerca de 200Hz, de modo que el FT no podrá mostrar que son 2 sinusoides diferentes. Bueno, estamos lejos de su 0.5% (por cierto, ¡un semitono está al 6% de la frecuencia!) Y 0.005s es realmente un poco pequeño para su propósito. Sin embargo, si desea proporcionar una estimación cada 0.005s, aún puede procesar fotogramas superpuestos más largos, como generalmente se hace en el procesamiento de voz / música. ¿Es eso lo que realmente quieres?
Por último, tenga en cuenta que existen otras formas de calcular una representación en tiempo y frecuencia de un sonido, considere, por ejemplo, los bancos de filtros gammatone. La ventaja de la CQT que mencioné anteriormente es que hay software tanto para la transformación como para su inversión. Personalmente, todavía me quedo con el STFT, sin embargo, por su simplicidad y porque, hasta ahora, nunca necesité una mejor resolución en bajas frecuencias, incluso para la separación de la fuente.
[Schoerkhuber2010] Schoerkhuber, C. y Klapuri, A., "Caja de herramientas de transformación Constant-Q para procesamiento de música", 7ma Conferencia de computación de sonido y música, Barcelona, España, 2010.
fuente
Primero, con el enfoque clásico de la transformación de Fourier a corto plazo, existen alternativas a la interpolación, en particular técnicas que utilizan la información de fase para recuperar la frecuencia instantánea ( vea esta pregunta ) que puede proporcionarle con mucha precisión la posición de un pico espectral sin un aumento del tamaño de FFT. El inconveniente, como dijiste correctamente, es que no estás aumentando la capacidad del sistema para discriminar picos adyacentes, pero esto ya es una gran mejora en comparación con el uso de la frecuencia central del índice FFT bin.
Existe otro enfoque de fuerza bruta que funciona: "sondear" sus señales con exponenciales complejas en ventanas (wavelets de Gabor). Estos se caracterizan por una frecuencia central, un tiempo central y un ancho de banda (que mide cómo se distribuye la wavelet en el tiempo o en la frecuencia). Tendrá que evaluar muchas, muchas, muchas correlaciones entre su señal y estas wavelets en la cantidad de desplazamientos, frecuencias y anchos de banda que desee. El resultado será el mismo que un STFT "en mosaico" muy flexible en el que se selecciona un tamaño de ventana óptimo para cada rango de tiempo y cada banda de frecuencia. Además del costo computacional, la desventaja es que no hay un algoritmo eficiente ni un algoritmo causal (necesitará conocer tantas muestras de antemano como la wavelet más larga en su diccionario). Si quieres experimentar con estas técnicas,MPTK .
Estos son computacionalmente caros, pero pueden funcionar en línea, con ventanas cortas si los pedidos de modelos y / o el ruido son bajos.
fuente
Frecuencia o tono? Ya hay toneladas de trabajos de investigación y libros sobre la percepción del tono humano. Pero, IIRC, los humanos tienden a ser malos para "extraer" frecuencias con precisión a menos que sean un tono fundamental. Y los picos de frecuencia múltiples dentro de una "banda crítica" tienden a ser percibidos como ruido. Por lo tanto, cualquier método con "precisión casi humana" también puede incluir algunas fallas de estimación perceptiva humana.
Un FFT es solo un banco de filtros que no son óptimos para muchos propósitos, a menos que la ortogonalidad y la invertibilidad sean requisitos. Son posibles otros bancos de filtros si no los necesita (y la percepción humana claramente no), como un banco de filtros de frecuencia MEL. Una vez que se identifica un pico de frecuencia mediante un banco de filtros de frecuencia MEL, un análisis adicional por interpolación FFT o técnicas de codificador de fase puede ser útil para refinar una estimación de frecuencia de cualquier pico de frecuencia espectral aislado.
Tenga en cuenta que ninguna de estas técnicas de filtrado utilizadas en el mismo lapso de datos en el dominio del tiempo recopila más información, en comparación con una FFT. Lo que está sucediendo en realidad podría ser la pérdida de información para que coincida mejor con la "inexactitud" o anomalías del sistema auditivo humano.
Y la estimación de tono de un conjunto de frecuencias es un problema completamente diferente, nuevamente un tema con muchos trabajos de investigación y capítulos en libros sobre audiología y demás.
La última parte de su pregunta sobre el rendimiento puede ser una pista falsa. Hoy en día, se pueden hacer docenas de FFT y docenas de diferentes bancos de filtros en un procesador de teléfono celular. Dadas las bibliotecas FFT muy eficientes disponibles de los proveedores de CPU, una FFT con miles de contenedores de "exceso" puede ser más eficiente que un banco de filtros significativamente más pequeño pero más ingenuo.
fuente
Hay muchas alternativas, pero depende de lo que esté haciendo. Físicamente, diría que nuestros oídos se parecen más a un banco de filtros paralelos que a un FFT, lo que les da una buena resolución de tiempo, y un proceso llamado "enfoque" les da una buena resolución de frecuencia. Entonces, en algunos casos, teóricamente podrías usar un banco de filtros, pero esto requiere mucho procesamiento y te deja con una gran cantidad de datos para procesar.
Es posible ver wavelets como un conjunto de filtros particularmente eficientes y relacionados. El problema con las wavelets para el análisis musical y de audio es que generalmente solo te dan una resolución de 1 octava (aunque puedes hacer varias cosas al respecto, realmente no he visto que las wavelets sean particularmente útiles en audio).
Otro enfoque es utilizar ventanas FFT superpuestas. Puede aumentar la resolución de frecuencia de la FFT mirando no solo la información de magnitud, sino también la información de fase. Esto le permite usar ventanas mucho más cortas de lo que podría usar, lo que resulta en un mejor rendimiento y una mejor resolución de tiempo. Las ventanas superpuestas son difíciles de volver a sintetizar correctamente, y hacer demasiados supuestos sobre la fase también puede ser peligroso. Sea como fuere, este tipo de trucos son probablemente el elemento básico para resolver problemas complejos de análisis de frecuencia de tiempo.
También hay otras herramientas para aplicaciones específicas.
fuente