Limitaciones del espectro de productos armónicos en la detección de tono

10

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:

  1. 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.

  2. 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)

  3. 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:

  1. La frecuencia de muestreo a la que estoy grabando es 44100 Hz
  2. He observado que este comportamiento es apenas visible en una guitarra, pero muy visible en un piano digital (para la misma nota tocada)
  3. 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;
    }
    
Valentin Radu
fuente
1
¿Cuál es su frecuencia de muestreo? ¿Qué filtro anti-alias tienes antes del ADC?
Martin Thompson, el
Mi frecuencia de muestreo de grabación es 44100 Hz, lo siento, no lo mencioné antes.
Valentin Radu el
1. Debe trazar los espectros intermedios y los productos utilizados en el cálculo de HPS y ver de dónde obtiene los valores incorrectos. 2. La guitarra y el piano son inarmónicos , lo que hará que los picos no se alineen perfectamente. No estoy seguro de cuánto efecto tendría esto, pero HPS supone un espectro perfectamente armónico.
endolito el

Respuestas:

3

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

Matt M.
fuente
Estoy grabando a 44100 Hz, pero aún así su respuesta me hizo pensar en ello. Tal vez sea algo relacionado y debería decidir cuántos armónicos considerar en mis hps dependiendo de cuántos picos encontré en mi FFT original. Otra cosa que he observado es que funciona mucho mejor con instrumentos de cuerda que con mi piano eléctrico, ¿podría ser esto porque los armónicos son semanales en el caso del piano?
Valentin Radu
@mindnoise: los instrumentos de cuerda con arco son armónicos, mientras que los instrumentos de cuerda pinchados o golpeados tienen en.wikipedia.org/wiki/Inharmonicity . No estoy seguro si eso es parte del problema
endolito el
@endolith podría ser especialmente porque: "Cuanto menos elásticas son las cuerdas (es decir, cuanto más cortas, gruesas y rígidas son), más inarmonía exhiben ". y obtengo el error exactamente en ese tipo de cadenas (notas altas). En realidad, el fundamental es siempre la frecuencia más fuerte en mi FFT cuando ocurre el error, por lo que definitivamente tiene que ver con los armónicos o el algoritmo hps, sin embargo, no estoy seguro de por qué obtengo basura de 20-50hz por un fundamental de 1500 hz. publicará el algoritmo hps.
Valentin Radu
1
@mindnoise: "La falta de armonía afecta en gran medida las notas más bajas y más altas del piano ... Las cuerdas más bajas, que tendrían que ser las más largas, están más limitadas por el tamaño del piano. El diseñador de un piano corto se ve obligado a usar cuerdas gruesas para aumentar la densidad de masa y, por lo tanto, se conduce a la falta de armonía. Las cuerdas más altas deben estar bajo la mayor tensión, pero también deben ser delgadas para permitir una baja densidad de masa. La resistencia limitada del acero obliga al diseñador del piano a usar muy corto cadenas cuyas longitudes de onda cortas generan así falta de armonía ".
endolito el
2

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.

hotpaw2
fuente