Hice un algoritmo de detección de tono usando HPS y estoy enfrentando un problema. Soy un principiante con el procesamiento de señales y este sitio me ayudó antes, por lo que debería preguntar.
Para tonos más altos ( eg. >C6:1046.50hz
) estoy empezando a obtener datos basura del HPS. Cuanto más alto es el tono, más basura obtengo (por basura quiero decir frecuencias que no son errores de octava ni armónicos y están alrededor de 1Hz-20Hz)
Lo que he observado empíricamente:
los resultados son peores para los tonos más altos, si el fundamental está por encima de A6 más o menos, solo obtengo datos basura.
la FFT funciona bien incluso para un tono muy alto (por multa quiero decir que su pico muestra el fundamental o uno de sus armónicos, pero no basura)
Si bajo el número de armónicos que considero para el HPS, la basura disminuye, pero eso hace que sea más difícil discriminar entre los armónicos fundamentales y los fundamentales.
Aquí está mi algoritmo:
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
Cualquier ayuda es apreciada!
ACTUALIZACIÓN 1: Entonces, hay algunas cosas más que quiero agregar:
- La frecuencia de muestreo a la que estoy grabando es 44100 Hz
- He observado que este comportamiento es apenas visible en una guitarra, pero muy visible en un piano digital (para la misma nota tocada)
Aquí está mi algoritmo hps, tal vez alguien con mayor experiencia pueda detectar un problema.
int hps(float* spectrum, int spectrumSize, int harmonics) { int i, j, maxSearchIndex, maxBin; maxSearchIndex = spectrumSize/harmonics; maxBin = 1; for (j=1; j<=maxSearchIndex; j++) { for (i=1; i<=harmonics; i++) { spectrum[j] *= spectrum[j*i]; } if (spectrum[j] > spectrum[maxBin]) { maxBin = j; } } // Fixing octave too high errors int correctMaxBin = 1; int maxsearch = maxBin * 3 / 4; for (i=2; i<maxsearch; i++) { if (spectrum[i] > spectrum[correctMaxBin]) { correctMaxBin = i; } } if (abs(correctMaxBin * 2 - maxBin) < 4) { if (spectrum[correctMaxBin]/spectrum[maxBin] > 0.2) { maxBin = correctMaxBin; } } return maxBin; }
fuente
Respuestas:
Podría ser que muy pocos parciales armónicos estén presentes en la señal en estos tonos más altos. El algoritmo HPS es bastante simple y se basa en esos armónicos superiores para seguir apilándose hasta que lo fundamental emerja del fondo. Por supuesto, deberíamos preguntarnos, ¿cuál es su frecuencia de muestreo? Si son 8000 hz, entonces solo hay espacio para 3 armónicos de un tono de 1000 hz ...
fuente
Para algunos instrumentos, el número de armónicos significativos producidos puede cambiar en diferentes rangos de tono. Los parciales de las notas más bajas y más altas para algunos instrumentos físicos pueden exhibir una mayor falta de armonía. El número de armónicos que pueden caber debajo del corte del filtro anti-alias por debajo de Fs / 2 será ciertamente menor para notas muy altas. Su estimador de tono HPS puede querer tener en cuenta esos factores.
El ataque transitorio de algunos instrumentos puede producir una banda de ruido espectral aarmónico que puede superponerse con la región de búsqueda HPS de algunos tonos o sus armónicos significativos.
Potencialmente, los armónicos de frecuencias muy altas podrían incluso envolverse alrededor de Fs / 2 si el filtro de paso bajo antes del ADC de audio no tiene una atenuación de banda de parada lo suficientemente buena.
fuente