¿Cómo lidiar con los bajos fundamentales cuando se usa AMDF para la extracción de tono?


11

Estoy usando la función de diferencia de magnitud promedio para estimar la frecuencia fundamental de una señal de audio cuasi periódica. El AMDF se define como

Dn=1Nnk=nN1|SkSkn|

donde N es la longitud de la señal. Esta función exhibe un mínimo cuando la señal se desplaza en una cantidad igual a su período.

Este es el código que estoy usando para extraer el tono (en Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Sin embargo, estoy tratando con una señal de audio donde la frecuencia fundamental es muy baja:

espectro de la señal de audio

Como consecuencia, surge un problema de duplicación de tono: el mínimo detectado corresponde a la mitad del período de la señal (es decir, el segundo armónico):

AMDF de la señal anterior

Traté de extraer el pico más grande y no solo el primero, pero a veces este problema persiste. ¿Cómo puedo mejorar mi código y / o la función AMDF para tratar con los fundamentales bajos?


La psicoacústica y la percepción humana influyen en el tono percibido y la incertidumbre de la octava. Puede requerir experimentación para determinar bajo qué condiciones el pico AMDF más grande hace una diferencia audible.
hotpaw2

¿Qué tan bajas son sus frecuencias? ¿Hay algún ejemplo para que yo escuche?
ederwander

Respuestas:


10

Esto es lo que llamamos en el negocio de detección de tono, el " problema de octava ".

En primer lugar, cambiaría el AMDF a ASDF. Y no reduciría el tamaño de la ventana a medida que aumenta el retraso. (Además, estoy cambiando la notación a lo que considero más convencional. " " es una señal de tiempo discreto).x[n]

La función de diferencia cuadrática promedio (ASDF) de en la vecindad de la muestra x [ n 0 ] es:x[n]x[n0 0]

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

es lafunción y, si k es par, entonceskfloor()k .k2=k+12=k2

Ahora, ampliar la plaza y lo que consideran las sumas parecen como (no es que N se va hasta el infinito, pero para darle una idea de si N es grande). El ASDF está directamente relacionado con la autocorrelación. Es esencialmente la autocorrelación al revés. Estos pasos te los dejo a ti. Echa un vistazo a esta respuesta.NN N

Así que ahora considere esta "autocorrelación" de longitud finita (en la vecindad de la muestra ) definida desde el ASDF:x[n0]

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

dónde

Rx[0,n0]1Nn=0N1(x[n+n0N2])2

Como y Q x [ k , n 0 ] 0 para todos los rezagos k , eso significa que R x [ k , n 0 ] R x [ 0 , n 0 ] para todos los rezagos k .Qx[0,n0]=0Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Supongamos por un minuto que es periódica con el período P (y P resulta ser un número entero), luegox[n]PP

x[n+P]=x[n]n

y y R x [ m P , n 0 ] = R x [ 0 , n 0 ] R x [ k , n 0 ] para cualquier número entero de períodos ( m es un entero). Entonces obtienes un pico en k = 0 y en k igual a cualquier otro múltiplo de P si xQx[mP,n0]=0Rx[mP,n0]=Rx[0,n0]Rx[k,n0]mk=0kP es periódico. Si x [ n ] noesperfectamente periódico, lo que podríamos esperar es el pico más grande en k = 0 , otro pico (pero ligeramente más pequeño) en k = P (el período que estamos buscando) y picos progresivamente más pequeños para múltiplos más grandes de P .x[n]x[n]k=0k=PP

Entonces, el problema de la octava surge por un par de razones. En primer lugar, no es necesariamente un número entero. Ese es un problema de interpolación, no es un gran problema. P

La segunda razón y el problema más difícil es el de las subarmónicas . Tenga en cuenta que está escuchando un agradable tono periódico a exactamente A-440 Hz y suena como un A que está 9 semitonos por encima del medio C. Ahora suponga que alguien agrega a ese tono una amplitud muy pequeña (como 60 dB) A -220? ¿Cómo sonará y matemáticamente cuál es el período "verdadero"?


Elegir el pico "correcto" para el período.

Supongamos que ejecuta su nota a través de un filtro de bloqueo de CC, de modo que la media de es cero. Resulta que hace que la media de la autocorrelación R x [ k , n 0 ] para cada n 0 también sea cero (o cercana a ella si N es grande). Eso significa que R x [ k , n 0 ] debe sumar (sobre k ) para ser aproximadamente cero, lo que significa que hay tanta área sobre cero como debajo.x[n]Rx[k,n0]n0NRx[k,n0]k

De acuerdo, entonces representa la potencia de x [ n ] en las proximidades alrededor de n = n 0 y no debe ser negativa. R x [ k , n 0 ] nunca excede R x [ 0 , n 0 ] pero puede llegar a ser tan grande cuando x [ n ] es periódico. R x [ P , n 0 ]Rx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n] si x [ n + P ] = x [ n ] . Entonces, si x [ n ] es periódica con el período P y tiene un montón de picos separados por P y tiene una idea de qué tan altos deberían ser esos picos. Y si el componente DC de R x [ k , n 0 ] es cero, eso significa que entre los picos,debetener valores negativos.Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]

Si era "casi periódica", un ciclo de x [ n ] se parecerá mucho a un ciclo adyacente, pero no tanto como un ciclo de x [ n ] más abajo en la señal en el tiempo. Eso significa que el primer pico R x [ P , n 0 ] será mayor que el segundo en R x [ 2 P , n 0 ] o el tercer R x [ 3 P , n 0 ]x[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]. Se podría usar la regla para elegir siempre el pico más alto y esperar que el pico más alto sea siempre el primero. Pero, debido a subarmónicos inaudibles, a veces ese no es el caso. a veces el segundo o posiblemente el tercer pico es tan ligeramente más alto. Además, debido a que el período probablemente no es un número entero de muestras, pero k en R x [ k , n 0 ] es siempre un número entero, por lo que el pico verdadero probablemente estará entre los valores enteros de k . Incluso si tuviera que interpolar dónde está el pico suave (que recomiendo y la interpolación cuadrática es lo suficientemente buena), y qué tan alto es realmente entre el entero kPkRx[k,n0]kk, su alg de interpolación podría hacer un pico un poco más alto o un poco más bajo de lo que realmente es. Por lo tanto, elegir el pico más alto puede resultar en elegir espuriosamente el segundo sobre el primer pico (o viceversa) cuando realmente quería el otro.

Entonces, de alguna manera, tienes que perjudicar los picos al aumentar para que el primer pico tenga una ligera ventaja sobre el segundo, y el segundo sobre el cuarto (la próxima octava hacia abajo), etc. ¿Cómo lo haces?k

Lo haces multiplicando con una función decreciente de k de modo que el pico a k = 2 P se reduce por algún factor, con respecto a un pico idénticos en k = P . Resulta que la función de potencia (no la exponencial) hace eso. entonces calculaRx[k,n0]kk=2Pk=P

kα Rx[k,n0]

Entonces, si fuera perfectamente periódico con el período P , e ignorando los problemas de interpolación para P no entero , entoncesx[n]PP

Rx[2P,n0]=Rx[P,n0]

pero

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

El factor por el cual se reduce el pico para un tono de una octava más baja es la relación

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

Entonces, si desea darle a su primer pico un aumento del 1% sobre el segundo pico, lo que significa que no elegirá el tono para que sea el tono subarmónico, a menos que la autocorrelación del tono subarmónico sea al menos 1% más que la primera pico, resolverías para deα

2α=0.99

Esa es la forma consistente de ponderar o desestimar o perjudicar el pico correspondiente al tono subarmónico una octava por debajo.

Todavía te deja con un problema de umbral. Tienes que elegir bien . Pero esta es una forma consistente de enfatizar el primer pico sobre el segundo, que es una octava más baja, pero no tanto que si la nota realmente es una octava más baja, sino que la energía en todos los armónicos pares era fuerte, en comparación con la impar armónicos, esto aún dejará la posibilidad de elegir el segundo pico.α


1
Para responder a su última pregunta: si agrega una amplitud de 220 Hz, entonces el tono será de 220 Hz, donde 440 Hz es el primer armónico después del fundamental (matemáticamente hablando). Mi caso es similar pero también hay armónicos más altos, por lo que el fundamental faltante no es un problema desde un punto de vista perceptivo. No entiendo cómo reemplazar AMDF con ASDF podría resolver el problema de la octava
Firion

pero la otra mitad de la pregunta es * "¿cómo sonará"? responde eso y luego veamos qué quieres que haga tu detector de tono.
robert bristow-johnson

Rx[k,n0]

Si no tiene otros armónicos más altos, sino solo el de 440 Hz, y el tono de 220 Hz es lo suficientemente bajo, escuchará un tono de 440 Hz. Por encima de algún nivel (no sé cuál), escuchará también el tono de 220 Hz y, por lo tanto, un tono de 220 Hz.
firion

Hay una razón por la que dije -60 dB. ahora, ¿qué quieres que diga tu detector de tono, que es una nota de 220 Hz o 440 Hz u otra cosa?
robert bristow-johnson

0

Heurísticamente, la frecuencia fundamental del discurso sonoro estará en el intervalo [70, 400] Hz. Entonces, el primer paso sería aplicar un filtro de paso de banda para aislar aproximadamente esa banda.

En segundo lugar, puede aplicar una función de ponderación al espectro de potencia. Cerca del fundamental, el peso debe estar cerca de 1, mientras que más cerca del final de la banda, el peso debe estar cerca de 0. Esta ponderación se normaliza, por supuesto. Recomendaría algo súper lineal: cuadrático, cuártico, etc., para matar realmente las octavas.


¿Cómo puedo aplicar el peso? No sé dónde está lo fundamental. Además, mi señal es la nota de un instrumento, por lo que el rango es mayor
firion
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.