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?
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.
fuente
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.
fuente