J'ai besoin de détecter la hauteur (mesurer la fréquence du signal) pendant que les musiciens jouent de la musique, donnant un avertissement s'ils sont désaccordés, mais la musique est un peu trop rapide pour la FFT (Fast Fourier Transform).
Ci-dessous, j'essaie de donner une description technique du problème.
Les musiciens jouent de la musique à 90-140 bpm. Cela signifie qu'il y a 90-140 groupes de notes par minute, jusqu'à 8 (plus fréquemment, jusqu'à 4) notes dans chaque groupe (60/140/8 = 0,0536 sec, 60/90/4 = 0,167 sec), qui Autrement dit, les notes peuvent changer au rythme de 6 à 19 notes par seconde.
La musique utilise une échelle logarithmique (voir l'image ci-jointe): la plage entre, disons, 440Hz et 880Hz est divisée en 12 notes, dont seulement 7 sont utilisées pour la mélodie. (Fondamentalement, ils utilisent uniquement les touches blanches du piano; lorsqu'ils veulent changer la fréquence de départ, ils utilisent certaines des touches noires et n'utilisent pas certaines touches blanches.) Autrement dit, la fréquence de chaque note suivante est multipliée par 2 ^ (1/12) = 1,05946.
Pour compliquer les choses, la fréquence A (La) peut varier de 438 à 446 Hz. Les instruments à cordes peuvent en théorie être accordés, tandis que les instruments à vent dépendent de la température et de l'humidité de l'air, de sorte que la fréquence se trouve être renégociée par les musiciens lors de la vérification du son.
Parfois, les musiciens et les chanteurs font des erreurs de fréquence, ils appellent cela "faux". Ils veulent un appareil qui les informerait de telles "erreurs de désaccord". Ils ont des tuners, mais les tuners nécessitent de jouer le même son pendant environ 1 seconde avant de commencer à montrer quoi que ce soit. Cela fonctionne pour le réglage, mais ne fonctionne pas pendant la lecture de la musique.
Très probablement, le tuner fait de la FFT, et en raison de la formule attend 1 seconde pour obtenir la résolution de 1 Hz.
Pour A = 440Hz, la différence de fréquence entre deux notes est de 440 * 0,05946 = 26,16 Hz, pour obtenir cette résolution de fréquence, il faut utiliser un temps d'acquisition de 0,038 sec, c'est-à-dire à tempo = 196bpm FFT est capable de distinguer simplement deux note, à 98 bpm, il est capable de dire une erreur de désaccord de 50% à condition qu'il commence l'acquisition au moment même où la hauteur change. Si nous autorisons le changement de hauteur au cours d'une période d'acquisition, nous obtenons 49 bpm, ce qui est tout simplement trop lent. De plus, il est très souhaitable d'être plus précis sur la fréquence, par exemple, détecter une erreur de désaccord de 25% ou 12%.
Existe-t-il un moyen de mesurer la fréquence (détecter la hauteur) mieux que la FFT, c'est-à-dire avec une meilleure résolution en moins de temps d'acquisition? (Au moins 2 fois mieux, idéalement, 8-16 fois mieux.) En échange, je n'ai pas besoin de faire la distinction entre les notes d'octaves différentes, par exemple 440 et 880 peuvent être reconnus comme A. Je n'ai pas besoin de la linéarité de FFT sortie, une échelle logarithmique serait mieux. (Probablement, plus de compromis sont possibles, rien d'autre ne me vient à l'esprit en ce moment.)
Voici un très bon dessin: