Estoy trabajando en un programa de afinación de piano y parte de él requiere detección de tono en tiempo real. Aquí está el esquema que tengo hasta ahora, que funciona hasta cierto punto, pero probablemente podría usar algún refinamiento.
Estoy capturando audio PCM mono de 44.1 kHz y 16 bits en fragmentos de 2 ^ 14 muestras. Combino las últimas 4 muestras en un búfer de 2 ^ 16 de longitud, aplico una ventana Hann al búfer y ejecuto un FFT en él. Luego, clasifico los resultados de la FFT en dos resoluciones. Primero, se agrupa en 200 cubos y luego ejecuto el algoritmo de detección de tono HPS con esta granularidad. No necesito obtener una frecuencia exacta aquí, solo quiero acercarme. Luego, se agrupa en 12000 cubos, lo que me da una resolución de 1 centavo de 10Hz a 10kHz. Una vez que conozco una frecuencia aproximada del algoritmo de 200 bin HPS, busco en ese rango del caso de 12000 bin un pico para obtener una frecuencia más exacta.
Esto parece funcionar bien para las notas en el medio del teclado. Lo que sucede con las notas bajas es aproximadamente 1.5 segundos de identificación errónea de la nota, ya que generalmente es el segundo o tercer parcial de la nota real y luego una identificación correcta de la nota.
En todas las gráficas espectrales que creé para ver qué está sucediendo, hay más ancho en los picos que esperaría. Este ancho es visualmente algo consistente desde el contenedor de 200 a 12000 contenedores. Hubiera esperado que los picos fueran más estrechos en el caso de 200 contenedores.
Por lo tanto, el procesamiento de la señal es nuevo para mí, por lo que puede haber problemas que no me gustaría preguntar, pero en términos de preguntas específicas, ¿son suficientes los tamaños de muestra para esta tarea? ¿Hann es la elección correcta de ventana? ¿Debo suavizar los datos también antes de FFT? ¿Qué tan sensible es HPS a la cantidad de contenedores? Estaba pensando que si usaba muchos contenedores, entonces la falta de armonía podría no hacer que los parciales se superpongan con sus fundamentos con el enfoque simple del algoritmo HPS de dividir por 2, 3, 4, etc.