tagblender likes hashtags for followers app signal-processing fft detection pitch vdsp

signal-processing - hashtags - tags for likes instagram 2017



Análisis Cepstral para detección de tono. (5)

Estoy buscando para extraer tonos de una señal de sonido.

Alguien en el IRC me acaba de explicar cómo el hecho de tomar una doble FFT logra esto. Específicamente:

  1. tomar FFT
  2. tomar registro del cuadrado de valor absoluto (se puede hacer con la tabla de búsqueda)
  3. tomar otra FFT
  4. tomar valor absoluto

Estoy intentando esto usando vDSP

No puedo entender cómo no encontré esta técnica antes. Hice mucha caza y haciendo preguntas; Varias semanas por valor. Más al punto, no puedo entender por qué no lo pensé.

Estoy tratando de lograr esto con la biblioteca vDSP. Parece que tiene funciones para manejar todas estas tareas.

Sin embargo, me pregunto acerca de la precisión del resultado final.

Anteriormente he utilizado una técnica que recorre los intervalos de frecuencia de una FFT única para los máximos locales. Cuando encuentra uno, usa una técnica astuta (el cambio de fase desde la última FFT) para ubicar con mayor precisión el pico real dentro del contenedor.

Me preocupa que esta precisión se pierda con esta técnica que presento aquí.

Supongo que la técnica podría usarse después de la segunda FFT para obtener el fundamento con precisión. Pero parece que la información se pierde en el paso 2.

Dado que este es un proceso potencialmente complicado, ¿podría alguien con algo de experiencia simplemente revisar lo que estoy haciendo y verificar que esté sano?

Además, he oído que hay una técnica alternativa que consiste en ajustar una cuadrática sobre contenedores adyacentes. ¿Es esto de precisión comparable? Si es así, lo preferiría, ya que no implica recordar las fases del contenedor.

Entonces, preguntas:

  • ¿Tiene sentido este enfoque? ¿Se puede mejorar?
  • Estoy un poco preocupado por el componente "log square"; Parece que hay una función vDSP para hacer exactamente eso: vDSP_vdbcon. Sin embargo, no hay ninguna indicación de que precalcula una tabla de registro, supongo que no, ya que la función FFT requiere una función explícita de cálculo previo para ser llamada y pasada a ella. Y esta función no.
  • ¿Hay algún peligro de que los armónicos sean recogidos?
  • ¿Hay alguna manera astuta de hacer que vDSP saque el máximo, primero el más grande?
  • ¿Alguien puede indicarme alguna investigación o literatura sobre esta técnica?

  • la pregunta principal: ¿es lo suficientemente precisa? ¿Se puede mejorar la precisión? Me acaba de decir un experto que la precisión NO ES suficiente. ¿Es este el final de la línea?

Pi

PD: Me ENOJO tanto cuando quiero crear etiquetas, pero no puedo. : | He sugerido a los mantenedores que DEBEN realizar un seguimiento de los intentos de etiquetas, pero estoy seguro de que me ignoraron. Necesitamos etiquetas para vDSP, aceleración de framework, análisis cepstral


¿Qué hay de malo con tu técnica existente que te interesa una nueva? No creo que un cepstrum te dé un tono más preciso, si ese es el objetivo. Sin embargo, te ayudará con los fundamentos suprimidos . Supongo que podrías usar el cepstrum para acercarte, luego volver a la primera FFT (que mantendría en su forma original) y luego aplicar tu técnica de astucia al cubo al que te dirige el cepstro.

En cuanto al ajuste cuadrático, Ted Knowlton hace referencia a este documento , que apareció recientemente en otra pregunta de SO, pero nunca lo he usado.

Debo añadir que la técnica de ajuste cuadrático, al menos como se indica en la referencia de Knowlton, depende del uso de una ventana rectangular en la primera FFT. Como Paul R explicó en otra de sus preguntas, si está realizando el procesamiento de audio, debe usar una ventana de Hann o Hamming en la primera FFT. Así que supongo que un algoritmo general podría verse así:

  • Tomar el búfer del dominio del tiempo x , hacer una copia w ventana w
  • Sx = FFT(x) , Sw = FFT(w)
  • c = Log of square magnitude of Sw
  • Cx = FFT(c)
  • Estimar fundamental (y quizás armónicos) usando Cx
  • Usa Sw para hacer trucos de fase astuta en recipientes fundamentales (o armónicos superiores)
  • Y / o use Sx para hacer un ajuste cuadrático del bin alrededor del fundamental (o armónico superior)

La nota (or higher harmonic) aplica si de hecho se han suprimido los fundamentos.

Y mencioné esto en tu otra pregunta, pero ¿qué te hace pensar que el registro requiere una tabla de búsqueda? ¿Por qué no llamar a la función de registro? Imagino que el tiempo que tardan dos FFT (O (n * logn)) empequeñece cualquier otro procesamiento que pueda hacer.


El análisis de Cepstrum es una forma de procesamiento homomórfico, explicado en el libro "Discrete-Time Signal Processing" de Oppenheim & Schafer. Alguna vez se pensó que era útil para separar la frecuencia del excitador de un sobre de for- mación (tal vez todavía lo es, no lo sé). Parece funcionar mejor cuando se le da una ventana bastante larga de datos estacionarios.

Pero el análisis Cepstral no está destinado a la precisión de la estimación de frecuencia. En realidad es una forma de análisis con pérdida. Pero podría ser útil para encontrar la frecuencia fundamental de un tren de armónicos donde el componente espectral de frecuencia fundamental puede ser comparativamente débil o incluso faltante.

El análisis del codificador de fase (no tan astuto, ya que la técnica ha existido durante tal vez medio siglo) es mejor en la estimación de la frecuencia para un pico dado, suponiendo que elija el pico correcto (no necesariamente el más fuerte), el espectro del pico es estacionario Ambos marcos FFT y el fundamental no faltan completamente en el espectro.

La interpolación cuadrática o parabólica puede ser una buena opción si la transformación de la función de ventana se asemeja a una parábola. La interpolación de zinc funciona mejor con ventanas rectangulares.


Está bien, vamos a pasar uno por uno:

Estoy buscando extraer tonos de una señal de sonido.

Aunque no soy un experto y he tenido una capacitación formal mínima, creo que conozco la mejor respuesta a este problema. He realizado muchas búsquedas, lecturas y experimentos en los últimos años. Mi consenso es que el método de autocorrelación es, con mucho, el mejor detector de tono en términos de compensación entre precisión, complejidad, robustez de ruido y velocidad. A menos que tenga algunas circunstancias muy específicas, casi siempre recomendaría usar la autocorrelación. Más sobre esto más adelante, déjame responder tus otras preguntas.

Lo que describe es un "análisis cepstral", que es un método utilizado principalmente para extraer el tono del habla . El análisis de Cepstral se basa totalmente en la abundancia y la fuerza de los armónicos de su señal. Si, por ejemplo, pasases una onda sinusoidal pura a través del análisis cepstral, obtendrías resultados terribles. Sin embargo, para el habla, que es una señal compleja, hay un gran número de armónicos. (los armónicos, por cierto, son elementos de la señal que oscilan en múltiplos de la frecuencia fundamental, es decir, el tono que percibimos). El análisis Cepstral puede ser robusto para detectar el habla con una frecuencia fundamental faltante . Es decir, supongamos que trazaste la función sin (4x) + sin (6x) + sin (8x) + sin (10x) . Si nos fijamos en eso, está claro que tiene la misma frecuencia que la función sin (2x). Sin embargo, si aplica el análisis de fourier a esta función, el contenedor correspondiente a sin (2x) tendrá una magnitud cero . Por lo tanto, se considera que esta señal tiene una "frecuencia fundamental faltante", porque no contiene la sinusoide de la frecuencia que consideramos que es. Por lo tanto, simplemente elegir el pico más grande en la transformada de Fourier no funcionará en esta señal.

Anteriormente he utilizado una técnica que recorre los intervalos de frecuencia de una FFT única para los máximos locales. cuando encuentra uno, usa una técnica astuta (el cambio de fase desde la última FFT) para ubicar con mayor precisión el pico real dentro del contenedor.

Lo que estás describiendo es la técnica del vocoder de fase para medir con mayor precisión la frecuencia de un parcial dado. Sin embargo, la técnica básica de seleccionar el contenedor más grande le causará problemas si usa una señal con un componente de frecuencia fundamental débil o faltante.

Me preocupa que esta precisión se pierda con esta técnica que presento aquí.

En primer lugar, recuerde que la técnica del vocoder de fase solo mide con mayor precisión la frecuencia de un solo parcial. Ignora la información contenida en los parciales superiores sobre la frecuencia fundamental. En segundo lugar, dado un tamaño FFT decente, puede obtener una muy buena precisión utilizando la interpolación máxima. Alguien más aquí te ha apuntado hacia la interpolación parabólica. Yo también sugeriría esto.

Si interpola parabólicamente la FFT de un bloque de 4098 muestras de datos a 44100 Hz, con un pitch de aproximadamente 440 Hz, eso significa que estará entre el 40 ° (430.66 Hz) y el 41 ° (441.430664064) bin. Suponiendo que este artículo es aproximadamente correcto en el caso general, dice que la interpolación parabólica aumenta la resolución en más de un orden de magnitud. Esto deja la resolución en al menos 1 Hz, que es el umbral de la audición humana. De hecho, si usa una ventana gaussiana ideal, la interpolación parabólica es exacta en los picos (es correcto, exacto. Recuerde, sin embargo, que nunca puede usar una verdadera ventana Gaussiana, porque se extiende para siempre en ambas direcciones). Todavía preocupado por obtener una mayor precisión, siempre puedes rellenar la FFT. Esto significa agregar ceros al final de la FFT antes de transformar. Funciona que esto es equivalente a la "interpolación sinc" que es la función de interpolación ideal para señales de frecuencia limitada.

Supongo que la técnica podría usarse después de la segunda FFT para obtener la fundamental con precisión. Pero parece que la información se perdió en el paso 2.

Eso es correcto. La técnica del codificador de fase se basa en el hecho de que los cuadros secuenciales están conectados y tienen una relación de fase específica. Sin embargo, la magnitud logarítmica de la FFT de las tramas secuenciales no muestra la misma relación en términos de fase, por lo que sería inútil utilizar esta transformación para la segunda FFT.

  • ¿Tiene sentido este enfoque? ¿Se puede mejorar?

Sí y sí, voy a explicar la mejora en mi bit en autocorrelación al final.

  • Estoy un poco preocupado por Y el componente log cuadrado; parece que hay una función vDSP para hacer exactamente eso: vDSP_vdbcon, sin embargo, no hay indicación de que precalcula una tabla de registro; supongo que no, ya que la función FFT requiere una función de cálculo previo explícito para ser invocada y aprobada en ello. y esta función no.

No sé los detalles de la biblioteca vDSP, lo siento.

  • ¿Hay algún peligro de que los armónicos sean recogidos?

¿En tu técnica original de selección de pico del vocoder de fase? sí. ¿Con el método cepstral? no, no realmente, el punto es que considera todos los armónicos para obtener su estimación de frecuencia. Por ejemplo, digamos que nuestra frecuencia es 1. Nuestros armónicos son 2,3,4,5,6,7,8,9, etc. Tendríamos que eliminar todos los armónicos impares, es decir, dejar 2,4,6, 8, etc., y elimine la frecuencia fundamental antes de que empiece a confundirse con uno de sus armónicos.

  • ¿Hay alguna manera astuta de hacer que vDSP saque el máximo, primero el más grande?

No sé vDSP, pero en el caso general, por lo general, simplemente repites sobre todos ellos y mantienes un registro de los más grandes.

  • ¿Alguien puede indicarme alguna investigación o literatura sobre esta técnica?

El enlace que te di en un comentario me pareció bueno.

Además, this sitio web ofrece una explicación increíblemente amplia y maravillosamente amplia de los temas de DSP, que incluye todo tipo de extracción de tono, manipulación, etc., tanto de forma teórica como práctica. ( this es un enlace más general a un índice en el sitio). Siempre me encuentro volviendo a ello. A veces puede ser un poco abrumador si saltas a la mitad, pero siempre puedes seguir todas las explicaciones hasta los componentes básicos.

Ahora para autocorrelación. Básicamente, la técnica es esta: toma su señal (ventana) y demora en el tiempo diferentes cantidades. Encuentra la cantidad que mejor se adapte a tu señal original. Ese es el período fundamental. Tiene mucho sentido teórico. Estás buscando las partes repetitivas de tu señal.

En la práctica, tomar la correlación con todas estas copias retrasadas de la señal es lenta. Por lo general, se implementa de esta manera (lo que es matemáticamente equivalente):

Póngalo a cero para duplicar su longitud original. Tome la FFT. Luego reemplace todos los coeficientes con su magnitud cuadrada, a excepción del primero, que estableció en 0. Ahora tome el IFFT. Divide cada elemento por el primero. Esto te da la autocorrelación. Matemáticamente, está utilizando el teorema de convolución circular (búsquelo) y el relleno cero para convertir un problema de convolución lineal en una convolución circular, que se puede resolver de manera eficiente.

Sin embargo, tenga cuidado de elegir el pico. Para retrasos muy pequeños, la señal se emparejará muy bien, simplemente porque es continua. (Quiero decir, si lo retrasas a cero, se correlaciona perfectamente con él mismo) En su lugar, elige el pico más grande después del primer cruce por cero. Puede interpolar parabólicamente la función de autocorrelación, así como con otras técnicas para obtener valores mucho más precisos.

Esto por sí solo le dará una muy buena detección de tono según todos los criterios. Sin embargo, a veces puede encontrar un problema con la reducción del tono y la duplicación de tono. Básicamente, el problema es que si una señal es repetitiva cada 1 segundo, también es repetitiva cada dos segundos. Del mismo modo, si tiene un matiz muy fuerte, es posible que la mitad del tono disminuya . Así que el pico más grande puede no ser siempre el que quieres. Una solución a este problema es el algoritmo MPM de Phillip McLeod. La idea es esta:

En lugar de elegir el pico más alto, desea elegir el primer pico que sea lo suficientemente grande como para ser considerado. ¿Cómo determinas si un pico es lo suficientemente grande como para ser considerado? Si es al menos tan alto como A *, el pico más grande, donde A es algo constante. Phillip sugiere un valor de A alrededor de 0,9, creo. En realidad, el programa que escribió, Tartini, le permite comparar varios algoritmos de detección de tono diferentes en tiempo real. Recomiendo downloading y probarlo (implementa Cepstrum, autocorrelación directa y MPM): (si tienes problemas para compilar, prueba las instrucciones here .

Una última cosa que debería mencionar es sobre ventanas. En general, cualquier ventana lisa servirá. Ventana de Hanning, ventana de Hamming, etc. Esperemos que sepas cómo abrir una ventana. También te sugiero que hagas ventanas superpuestas si quieres mediciones temporales más precisas.

Por cierto, una buena propiedad de la autocorrelación es que si la frecuencia cambia linealmente a través de la sección de ventana que está midiendo, le dará la frecuencia correcta en el centro de la ventana.

Una cosa más: lo que describí se llama función de autocorrelación sesgada . Esto se debe a que, para retrasos de tiempo más altos, la superposición entre la señal original y la versión retrasada es cada vez menor. Por ejemplo, si mira una ventana de tamaño N que ha sido retrasada N-1 muestras, verá que solo una muestra se superpone. Entonces la correlación en este retraso claramente va a ser muy cercana a cero. Puede compensar esto, sumergiendo cada valor de la función de autocorrelación por el número de muestras que se superponen para obtenerlo. Esto se llama autocorrelación imparcial . Sin embargo, en general, obtendrá peores resultados con esto, ya que los valores de retardo más altos de la autocorrelación son muy ruidosos, ya que se basan solo en unas pocas muestras, por lo que tiene sentido sopesarlos menos.

Si buscas más información, como siempre, google es tu amigo. Buenos términos de búsqueda: autocorrelación, detección de tono, seguimiento de tono, extracción de tono, estimación de tono, cepstrum, etc.


Esta respuesta debe leerse además de la publicación de Jeremy Salwen, y también para responder la pregunta sobre las literaturas.

En primer lugar, es importante considerar cuál es la periodicidad de la señal. Si la señal está más cerca de una señal completamente periódica para una ventana de análisis dada o no.

Consulte aquí una explicación detallada del término y maths en.wikipedia.org/wiki/Almost_periodic_function#Quasiperiodic_signals_in_audio_and_music_synthesis

La respuesta corta es que si para una ventana de análisis dada una señal es completamente periódica, o si la señal es casi periódica y la ventana de análisis es lo suficientemente pequeña para que se logre la periodicidad, entonces la Autocorrelación es suficiente para la tarea. Ejemplos de señales que cumplen estas condiciones son:

  • Tono sinusoidal puro.
  • Instrumentos de cuerda con sustains largos y pitch estable (sin vibrato), especialmente cierto en la parte sustain, no tan cierto en los transitorios.
  • Instrumentos de la tráquea que soplan el tiempo suficiente.

Ejemplo de señales que no cumplen con estas condiciones son:

  • Sonidos de percusión
  • Los instrumentos de cuerda o tráquea que se tocan con cada nota solo se mantienen muy cortos o cambian en poco tiempo.
  • Música compleja, o básicamente combinación de múltiples instrumentos que se tocan con diferentes tonos.

Para la detección de tono mediante autocorrelación, hay un tutorial sobre cómo se implementa en Praat:

  • www.ucl.ac.uk/~ucjt465/tutorials/praatpitch.html Paso en Praat Una breve explicación del algoritmo de detección de paso de Praat. Esto describe el algoritmo llamado ''ac''.
  • www.fon.hum.uva.nl/paul/praat.html Análisis preciso a corto plazo de la frecuencia fundamental y la relación armónicos / ruido de un sonido muestreado. Paul Boersma. Actas IFA 17: 97-110.

El documento describe en detalle el uso de autocorrelación imparcial (el término utilizado por Jeremy Salwen) para la detección de tono, también muestra que es superior a la autocorrelación sesgada para la detección de tono. Aunque se observa que los resultados de la autocorrelación son solo significativos hasta la mitad del tamaño de la ventana, no es necesario calcular la segunda mitad.

Una autocorrelación sesgada se realiza al visualizar las señales usando una ventana que se estrecha y luego hacer la autocorrelación. Esto reduce los efectos de la modulación de baja frecuencia (cambio de amplitud en una escala de tiempo lenta) que es perjudicial para la detección del tono, ya que de lo contrario las partes con mayor amplitud darán un mayor coeficiente de autocorrelación que se preferirá.

El algoritmo utilizado en el documento de Boersma se puede describir en 5 pasos:

  1. Elimine DC de la señal que va a aparecer en la ventana (x - x_avg)
  2. Ventana de la señal usando una función de ahusamiento (Él argumenta que la ventana de Hann, o mejor, la ventana de Gauss se usa para ello)
  3. Autocorrelaciona la señal.
  4. Divida la función de autocorrelación con la autocorrelación de la ventana utilizada.
  5. Selección de picos (similar a algoritmos anteriores)

Es importante tener en cuenta que la ventana irá hacia cero en ambos extremos, y la autocorrelación de la ventana también irá hacia cero. Esta es la razón por la que la segunda mitad de una autocorrelación imparcial es inútil, es una división por cero que se acerca al final de la ventana.

El siguiente es YIN: De Cheveigné, Alain y Hideki Kawahara. "YIN, un estimador de frecuencia fundamental para el habla y la música". The Journal of the Acoustical Society of America 111.4 (2002): 1917-1930.

Tal como lo entiendo, el documento YIN también demuestra que el uso de una ventana cónica tiene efectos perjudiciales en la precisión de la detección de tono. Y, curiosamente, prefiere no utilizar ninguna función de ventana que se vaya estrechando (dice algo en el sentido de que la ventana de reducción no aporta ninguna mejora a los resultados y en su lugar la complica).

El último es el SNAC y el WSNAC de Philip McLeod (ya enlazado por Jeremy Salwen):

  • Philip McLeod, Herramientas de detección de tono rápidas y precisas para análisis de música, tesis doctoral, Departamento de Ciencias de la Computación, Universidad de Otago, 2008.
  • McLeod. P, Wyvill. G, "Una forma más inteligente de encontrar el tono", Proc. Conferencia Internacional de Música de Computadores, Barcelona, ​​España, 5-9 de septiembre de 2005, pp 138-141.
  • McLeod. P, Wyvill. G, "Visualización de tono musical", Proc. Computer Graphics International, Tokio, Japón, 9-11 de julio de 2003, pp 300-303.

Se pueden encontrar en miracle.otago.ac.nz/tartini/papers.html

No he leído demasiado, pero se menciona como un método para reducir los efectos perjudiciales de la reducción gradual de la autocorrelación sesgada que es diferente en comparación con el método utilizado por Boersma. (Tenga en cuenta que no he encontrado nada acerca de MPM, así que no puedo decir nada al respecto)

Una última sugerencia es que si está haciendo un afinador de instrumentos, el método que sería más fácil y tendrá un resultado un poco mejor en comparación con la autocorrelación es mediante el uso de correlación cruzada con una señal sinusoidal pura con una frecuencia predeterminada.

Jeremy Salwen:

Es decir, supongamos que trazaste la función sin (4x) + sin (6x) + sin (8x) + sin (10x). Si nos fijamos en eso, está claro que tiene la misma frecuencia que la función sin (2x). Sin embargo, si aplica el análisis de fourier a esta función, el contenedor correspondiente a sin (2x) tendrá una magnitud cero. Por lo tanto, se considera que esta señal tiene una "frecuencia fundamental que falta", porque no contiene la sinusoide de la frecuencia que consideramos que es.

Me gustaría argumentar que aunque la señal dada es periódica en el / omega = 2, no es lo mismo que tener la misma frecuencia que la función sin (2x). El análisis de Fourier mostrará que el componente sin (2x) tiene una magnitud cero. Esto se relaciona con el punto de que existe una relación entre el tono, la frecuencia y la frecuencia fundamental de una señal, pero son diferentes e intercambiables. Es importante recordar que el tono es una medida subjetiva, que depende del ser humano como uno que lo perciba. Parece que tiene la misma frecuencia que sin (2x), así es como lo percibimos visualmente. El mismo efecto también ocurre de manera similar en el tono y la percepción del audio. el ejemplo que se me ocurrió inmediatamente es Beats, que es el tono percibido que se escucha cuando hay dos sinusoidales con frecuencias cercanas pero diferentes.


Este es un breve análisis del Cepstrum utilizado para la determinación del tono.

Primero examinemos una señal sintética.

La siguiente gráfica muestra el Cepstrum de una nota E2 sintética de estado estable, sintetizada usando un componente típico de DC cercano, un fundamental a 82.4 Hz, y 8 armónicos a múltiplos enteros de 82.4 Hz. La sinusoide sintética fue programada para generar 4096 muestras.

Observe el pico prominente sin CC a las 12.36. El ancho de Cepstrum es 1024 (la salida de la segunda FFT), por lo tanto, el pico corresponde a 1024 / 12.36 = 82.8 Hz, que está muy cerca de 82.4 Hz, la frecuencia fundamental verdadera.

Ahora examinemos una señal acústica real.

El siguiente diagrama muestra el Cepstrum de una nota E2 de guitarra acústica real. La señal no fue ventana antes de la primera FFT. Observe el pico prominente sin CC en 542.9. El ancho de Cepstrum es 32768 (la salida de la segunda FFT), por lo tanto, el pico corresponde a 32768 / 542.9 = 60.4 Hz, que está bastante lejos de 82.4 Hz de la verdadera frecuencia fundamental.

El siguiente diagrama muestra el Cepstrum de la misma nota E2 de la guitarra acústica real, pero esta vez la señal fue Hann ventana antes de la primera FFT. Observe el pico prominente sin CC a 268.46. El ancho de Cepstrum es 32768 (la salida de la segunda FFT), por lo tanto, el pico corresponde a 32768 / 268.46 = 122.1 Hz, que está incluso más lejos de 82.4 Hz de la verdadera frecuencia fundamental.

La nota E2 de la guitarra acústica utilizada para este análisis fue muestreada a 44.1 KHz con un micrófono de alta calidad en condiciones de estudio, no contiene prácticamente ningún ruido de fondo, ningún otro instrumento o voces, ni procesamiento posterior.

Esto ilustra el desafío significativo de usar el análisis Cepstral para la determinación del tono en señales acústicas reales.

Referencias

Aquí se realizaron datos de señales de audio reales, generación de señales sintéticas, gráficos, FFT y análisis Cepstral: instrumento musical cepstrum