Je travaille sur un programme de réglage de piano et une partie de celui-ci nécessite une détection de hauteur en temps réel. Voici le schéma que j'ai jusqu'à présent qui fonctionne dans une certaine mesure, mais pourrait probablement utiliser un certain raffinement.
Je capture de l'audio PCM mono, 44,1 kHz, 16 bits en morceaux de 2 à 14 échantillons. Je combine les 4 derniers échantillons dans un tampon de longueur 2 ^ 16, applique une fenêtre Hann au tampon et exécute une FFT dessus. Ensuite, je classe les résultats de la FFT dans deux résolutions. Tout d'abord, je divise en 200 compartiments, puis exécute l'algorithme de détection de hauteur HPS à cette granularité. Je n'ai pas besoin d'obtenir une fréquence exacte ici, je veux juste m'approcher. Ensuite, je divise en 12 000 seaux, ce qui me donne une résolution de 1 cent de 10 Hz à 10 kHz. Une fois que je connais une fréquence approximative à partir de l'algorithme 200 HPS bin, je recherche cette plage du cas de 12000 bin pour un pic pour obtenir une fréquence plus exacte.
Cela semble fonctionner correctement pour les notes au milieu du clavier. Ce qui se passe avec les notes basses, c'est environ 1,5s de mauvaise identification de la note comme d'habitude la 2e ou la 3e partielle de la note réelle, puis une identification correcte de la note.
Dans tous les tracés spectraux que j'ai créés pour voir ce qui se passe, il y a plus de largeur aux pics que j'attendrais. Cette largeur est visuellement quelque peu cohérente du casier de 200 casiers à 12 000 casiers. Je m'attendais à ce que les pics soient plus étroits dans le cas des 200 bacs.
Donc, le traitement du signal est nouveau pour moi, il peut donc y avoir des problèmes que je ne pense pas pouvoir poser, mais en termes de questions spécifiques, la taille des échantillons est-elle suffisante pour cette tâche? Hann est-il le bon choix de fenêtre? Dois-je également lisser les données avant la FFT? Quelle est la sensibilité de HPS au nombre de bacs? Je pensais que si j'utilisais beaucoup de bacs, l'inharmonicité ne ferait pas en sorte que les partiels chevauchent leurs principes fondamentaux avec l'approche simple de l'algorithme HPS consistant à diviser par 2, 3, 4, etc.