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?