Limites du spectre de produits harmoniques dans la détection de hauteur


10

J'ai créé un algorithme de détection de hauteur en utilisant HPS et je suis confronté à un problème. Je suis un débutant en traitement du signal et ce site m'a aidé avant, donc je pensais que je devrais demander.

Pour les hauteurs ( eg. >C6:1046.50hz), je commence à obtenir des données d'ordures du HPS. Plus la hauteur est élevée, plus j'obtiens d'ordures (par ordures, je veux dire des fréquences qui ne sont pas des erreurs d'octave ni des harmoniques et sont d'environ 1 Hz à 20 Hz)

Ce que j'ai empiriquement observé:

  1. les résultats sont les pires pour les hauteurs, si le fondamental est au-dessus de A6 ou plus, je n'obtiens que des données de poubelle.

  2. la FFT fonctionne très bien même pour une hauteur très élevée, (je veux dire par là que son pic montre soit la fondamentale soit l'une de ses harmoniques, mais pas les ordures)

  3. si je diminue le nombre d'harmoniques que je prends en considération pour le HPS, les ordures diminuent, mais cela rend plus difficile la discrimination entre le fondamental et les harmoniques.

Voici mon algorithme:

->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS

Toute aide est appréciée!

MISE À JOUR 1: Donc, il y a quelques autres choses que je veux ajouter:

  1. La fréquence d'échantillonnage sur laquelle j'enregistre est de 44100 Hz
  2. J'ai observé que ce comportement est à peine visible sur une guitare, mais très visible sur un piano numérique (pour la même note jouée)
  3. Voici mon algorithme hps, peut-être qu'une personne ayant une plus grande expérience peut détecter un problème.

    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;
    }
    

1
Quel est votre taux d'échantillonnage? Quel filtre anti-aliasing avez-vous devant l'ADC?
Martin Thompson

Mon taux d'échantillonnage d'enregistrement est de 44100 Hz, désolé de ne pas l'avoir mentionné auparavant.
Valentin Radu

1. Vous devez tracer les spectres intermédiaires et les produits utilisés dans le calcul HPS et voir d'où proviennent les mauvaises valeurs. 2. La guitare et le piano sont inharmoniques , ce qui empêchera les pics de s'aligner parfaitement. Je ne sais pas quel effet cela aurait, mais HPS suppose des spectres parfaitement harmoniques.
endolith

Réponses:


3

Il se peut que trop peu de partiels harmoniques soient présents dans le signal à ces hauteurs plus élevées. L'algorithme HPS est assez simple et repose sur ces harmoniques supérieures pour continuer à s'empiler jusqu'à ce que la fondamentale émerge de l'arrière-plan. Bien sûr, nous devrions nous demander quel est votre taux d'échantillonnage? Si c'est 8000 hz, alors il n'y a de la place que pour 3 harmoniques d'une hauteur de 1000 hz ...


J'enregistre à 44100 Hz, mais votre réponse m'a quand même fait réfléchir. Peut-être que c'est quelque chose de lié et je devrais décider du nombre d'harmoniques à considérer dans mes hps en fonction du nombre de pics que j'ai trouvés dans ma FFT d'origine. Une autre chose que j'ai observée, c'est que cela fonctionne beaucoup mieux avec des instruments à cordes qu'avec mon piano électrique, est-ce parce que les harmoniques sont hebdomadaires dans le cas du piano?
Valentin Radu

@mindnoise: Les instruments à cordes frottées sont harmoniques, tandis que les instruments à cordes pincées ou frappées ont en.wikipedia.org/wiki/Inharmonicity . Je ne sais pas si cela fait partie du problème
endolith

@endolith pourrait être notamment dû au fait que: "moins les cordes sont élastiques (c'est-à-dire plus elles sont courtes, épaisses et rigides), plus elles présentent d'harmonie ." et je reçois l'erreur exactement sur ces types de chaînes (notes élevées). En fait, le fondamental est toujours la fréquence la plus forte de ma FFT lorsque le bogue se produit, donc cela a certainement à voir avec les harmoniques ou l'algorithme hps, mais je ne sais pas pourquoi j'obtiens des ordures de 20 à 50 Hz pour un fondamental de 1500 hz. affichera l'algorithme hps.
Valentin Radu

1
@mindnoise: "L'inharmonicité affecte en grande partie les notes les plus basses et les plus hautes du piano ... Les cordes les plus basses, qui devraient être les plus longues, sont plus limitées par la taille du piano. Le concepteur d'un piano court est obligé d'utiliser des cordes épaisses pour augmenter la densité de masse et sont donc entraînées dans l'inharmonie. Les cordes les plus hautes doivent être sous la plus grande tension, mais doivent également être minces pour permettre une faible densité de masse. La résistance limitée de l'acier oblige le concepteur de piano à utiliser très court des cordes dont les courtes longueurs d'onde génèrent ainsi une inharmonicité. "
endolith

2

Pour certains instruments, le nombre d'harmoniques significatives produites peut varier sur différentes plages de hauteur. Les partiels des notes les plus basses et les plus hautes de certains instruments physiques peuvent présenter une plus grande inharmonicité. Le nombre d'harmoniques pouvant tenir en dessous de la coupure du filtre anti-alias en dessous de Fs / 2 sera certainement plus faible pour les notes très hautes. Votre estimateur de hauteur HPS voudra tenir compte de ces facteurs.

Le transitoire d'attaque de certains instruments peut produire une bande spectrale de bruit aharmonique qui peut chevaucher la région de recherche HPS de certains hauteurs ou leurs harmoniques significatives.

Potentiellement, les harmoniques de très hautes fréquences pourraient même envelopper Fs / 2 si le filtre passe-bas avant l'ADC audio n'a pas une atténuation de bande d'arrêt suffisamment bonne.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.