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:
la source
Réponses:
" 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? "
Oui il y a. ou sont. il existe de nombreuses meilleures façons de faire la détection de hauteur musicale en temps réel qui sont bien, bien mieux que d'exécuter une FFT.
considérer :
Fonction de différence d'amplitude moyenne (AMDF)
Fonction de différence quadratique moyenne (ASDF)
Fonction d'autocorrélation (AF)
notez que je joue vite et librement avec les limites de la somme.
Notez également qu'aucune hypothèse n'est formulée concernant la forme d'onde, les passages par zéro ou d'autres passages par seuil. la seule hypothèse est que lorsque le décalagek est approximativement une période (ou deux périodes ou un autre multiple entier de la durée de la période), x [ n ] ressemble beaucoup x [ n - k ] . la seule hypothèse est donc que la hauteur tonale est liée à la fréquence fondamentale d'une fonction périodique ou presque périodique (ce que j'appelle "quasi-périodique").
mon préféré est ASDF (et c'est un secret commercial à peine voilé que je viens d'annoncer à tout le monde, mais les gens sur comp.dsp le savaient déjà). ce sont tous des domaines temporels, AMDF et ASDF sont très similaires et ASDF ressemble à une version inversée de l'AF. vous recherchez des valeurs nulles dans AMDF ou ASDF ou des pics dans AF qui correspondent à des longueurs de période potentielles de l'entrée quasi-périodique.
voici quelques autres astuces:
vous pouvez toujours corréler le plus récentN échantillons contre certains N échantillons retardés de k . de cette façon, vous traitez les données les plus récentes possibles dans l'application en temps réel.
vous n'avez pas besoin de calculer la corrélation pour chaque décalage entierk . en fait, comme vous aimez la fréquence logarithmique, l'espacement pour les plus grandsk pourrait être plus grand que l'espacement pour les plus petits k .
lorsqu'un potentiel nul (AM_F) ou un pic (AF) est trouvé, vous pouvez calculer la corrélation pour les valeurs entières adjacentes dek .
entre des valeurs entières adjacentes dek , vous pouvez effectuer une interpolation pour déterminer l'emplacement du pic avec une précision d'échantillon fractionnaire. je ne vous dirai pas comment. utilise ton imagination.
l'astuce (et c'est la sauce secrète où s'appliquent les secrets commerciaux et les brevets IVL) est de choisir le pic correct ou nul lorsqu'il y a plusieurs candidats. le choix du pic incorrect ou nul entraînera une "erreur d'octave". je ne vais pas vous dire comment faire ça. utilise ton imagination.
envoyez-moi un e-mail et nous pourrons discuter des conditions contractuelles si vous souhaitez que je vous conçoive un détecteur de hauteur de pied. beaucoup mieux que YIN, qui, à mon avis, fonctionne comme de la merde.
la source
J'ai déjà répondu à votre question ici: /programming/33667275/fast-frequency-measurement/33678202#33678202
Mais, en résumé, dans certaines circonstances, vous pouvez interpoler un résultat FFT à une résolution plus fine que l'espacement des cases FFT, vous permettant ainsi d'utiliser une fenêtre de données plus courte pour une meilleure résolution temporelle.
Mais la fréquence FFT n'est pas la fréquence de tangage. Et pour certains instruments de musique (ceux qui produisent des harmoniques légèrement inharmoniques), la fonction d'auto-corrélation (ou ses parents tels que AMDF) n'est pas non plus la fréquence. C'est parce que la hauteur est un phénomène psychoacoustique.
la source