¿Cómo influyen el tamaño de la ventana y la frecuencia de muestreo en la estimación del tono FFT?

8

Estoy tratando de crear un programa de detección de tono que extraiga las frecuencias de los picos en un espectro de potencia obtenido de un FFT ( fftpack). Estoy extrayendo las frecuencias máximas de mi espectro usando el primer estimador de Quinn para interpolar entre los números de bin. Este esquema parece funcionar bien bajo ciertas condiciones. Por ejemplo, usando una función de ventana rectangular con un tamaño de ventana de 1024 y una frecuencia de muestreo de 16000, mi algoritmo identifica correctamente la frecuencia de un tono puro A440como 440.06 con una segunda frecuencia parcial de 880.1. Sin embargo, en otras condiciones, produce resultados inexactos. Si cambio la frecuencia de muestreo (p. Ej., A 8000) o el tamaño de la ventana (p. Ej., A 2048), aún identifica correctamente el primer parcial como 440, pero el segundo parcial está en algún lugar alrededor de 892. El problema se vuelve aún peor para tonos inarmónicos como esos producido por una guitarra o piano.

Mi pregunta general es: ¿de qué manera la frecuencia de muestreo, el tamaño de la ventana y la función de la ventana afectan la estimación de frecuencia de los picos de FFT? Mi suposición era que el simple aumento de la resolución del espectro aumentaría la precisión de la estimación de la frecuencia pico, pero esto claramente no es mi experiencia (el relleno cero tampoco ayuda). También supongo que la elección de la función de ventana no tendrá mucho efecto porque la fuga espectral no debería cambiar la ubicación del pico (aunque, ahora que lo pienso, la fuga espectral podría influir potencialmente en la estimación de frecuencia interpolada si las magnitudes de los depósitos adyacentes a los picos aumentan artificialmente por fugas de otros picos ...).

¿Alguna idea?

Willpett
fuente

Respuestas:

8
  1. Use una ventana gaussiana: la transformación de Fourier de un gaussiano es un gaussiano
  2. Log-scale el espectro para enfatizar picos y convertir los picos gaussianos en picos parabólicos
  3. Use la interpolación parabólica para encontrar los picos verdaderos.

Tenga en cuenta que, como se menciona en §D.1, la magnitud de transformación de la ventana gaussiana es precisamente una parábola en una escala de dB. Como resultado, la interpolación del pico espectral cuadrático es exacta debajo de la ventana gaussiana. Por supuesto, en la práctica debemos eliminar las colas infinitamente largas de la ventana gaussiana, pero esto no causa mucha desviación de una parábola, como se muestra en la figura 3.30.

https://ccrma.stanford.edu/~jos/sasp/Quadratic_Interpolation_Spectral_Peaks.html

ingrese la descripción de la imagen aquí

Estimo 1000.000004 Hz para una forma de onda de 1000 Hz de esta manera: https://gist.github.com/255291#file_parabolic.py

Si tiene problemas, trace el espectro y use sus ojos para ver por qué no funciona.

endolito
fuente
2
¡Gracias! Esto tiene mucho sentido. El registro de un gaussiano es una parábola, por lo que la interpolación parabólica de los picos en un espectro de registro con ventana gaussiana es casi exacta. Después de implementar esto, obtengo estimaciones de frecuencia pico FFT consistentes en diferentes frecuencias de muestreo y tamaños de ventana. Huzzah!
willpett
@ will.pett: ¿Entonces quizás el problema fue causado por el "Primer estimador de Quinn" más que por la FFT?
endolito el
No creo que el método de interpolación haya sido completamente culpable porque la interpolación cuadrática también me dio malos resultados con ciertas funciones de ventana y frecuencias de muestreo. Creo que fue la combinación de los parámetros anteriores lo que fue importante. No estaba usando la función de ventana adecuada y no había transformado logarítmicamente mi espectro. Apuesto a que lo más importante fue la transformación logarítmica. Probablemente el protocolo estándar del que no estaba al tanto.
willpett
@endolith, gracias, lo tengo (pueden seguir preguntas)
denis
3

Primero, la estimación de frecuencia pico y la estimación de tono son dos cosas diferentes. El tono es un fenómeno psicoacústico. La gente puede escuchar un tono incluso con la frecuencia fundamental perdida por completo, o relativamente débil en comparación con la mayoría de los otros picos, como en las notas bajas producidas por algunos instrumentos.

En segundo lugar, usar ninguna ventana en una FFT es equivalente a usar una ventana rectangular, que involucra tu espectro con la función Sinc. La función Sinc tiene muchas jorobas extendidas lejos del pico que se mostrarán para todas las frecuencias que no son exactamente periódicas en la longitud de FFT (también conocida como "fuga espectral"). Toda esta fuga de energía de una frecuencia fuerte interferirá con la estimación de posición de otros picos de frecuencia. Por lo tanto, una función de ventana más adecuada (Hamming o von Hann) podría ayudar a reducir esta interferencia entre los picos.

Una FFT más larga reducirá la frecuencia delta entre los centros bin, lo que debería aumentar la interpolación y, por lo tanto, la precisión de la estimación de frecuencia para espectros estacionarios. Sin embargo, si la FFT es tan larga que el espectro cambia dentro de la ventana de la FFT, todas esas frecuencias cambiadas se desenfocarán en una FFT más larga.

hotpaw2
fuente
1

Definitivamente necesita una función de ventana adecuada: los efectos de la fuga espectral varían significativamente dependiendo de cómo se relacionan el período de tono y la longitud de la ventana FFT. manchado del espectro, mientras que si tienes suerte y esta discontinuidad es pequeña, entonces el espectro resultante será mucho más limpio. Esta es probablemente la razón por la que está viendo inconsistencias cuando cambia cualquiera de sus parámetros, como el tamaño de FFT. Con una función de ventana adecuada, obtendrá un espectro constante a medida que cambia el tono.

Paul R
fuente
Ahora he probado diferentes funciones de ventana (Hamming, Blackman-Harris, Gauss, Weedon-Gauss) y todas me dan resultados muy inexactos en cualquier condición de frecuencia de muestreo / tamaño de ventana (por ejemplo, estimar la primera frecuencia parcial en 460, 488 y otros). Solo una ventana rectangular pudo identificar correctamente un pico a 440 Hz. Curiosamente, este pico es invariable en gran medida con diferentes combinaciones de frecuencia de muestreo / tamaño de ventana en una ventana rectangular, aunque el segundo parcial todavía es variable. ¿Cómo concilio estos resultados con su consejo?
Como nota al margen, también estoy usando un algoritmo de autocorrelación para comparar con la FFT. Este método (que es independiente de la función de ventana) proporciona ~ 440,4 Hz para el tono de wikipedia, mientras que el método FFT proporciona casi exactamente 440 sin una función de ventana. Me doy cuenta de que la autocorrelación no estima directamente la primera frecuencia parcial, sino más bien el "tono" psicoacústico, pero aún es interesante comparar. Al experimentar con tonos de piano, me di cuenta de que el método de autocorrelación sobreestima constantemente la primera frecuencia parcial en comparación con el método FFT.
1
Es difícil adivinar cuáles podrían ser los problemas sin ver el código, etc. ¿Ha intentado trazar el espectro de potencia para ver cómo se ven realmente los picos con / sin una función de ventana? Esto no solo debería decirle si su ventana / FFT / etc. se está comportando correctamente, sino que también puede darle una idea de por qué su algoritmo de estimación de tono está dando los resultados.
Paul R
Es extraño, porque las funciones de ventana realmente producen espectros de aspecto más limpio, con poca mancha. Sin embargo, las estimaciones de las frecuencias máximas no son correctas. Cuando uso la configuración que me da 440 Hz sin ventanas, luego cambio a una ventana de Hamming, obtengo 444,6 Hz. Con una ventana Blackman-Harris obtengo 460,9 Hz, y con una ventana gaussiana obtengo 446,4 Hz. ¿Es posible que los métodos de interpolación de picos hagan suposiciones implícitas sobre la función de ventana que podría estar violando?
willpett
No estoy realmente familiarizado con los métodos de interpolación en el artículo al que se vincula: parecen estar utilizando información de magnitud y fase en lugar de solo magnitud, pero no hubiera pensado que la ventana tendría un impacto significativo en la fase.
Paul R