Reconnaissance rapide de la hauteur


8

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.df=1/T

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:

Notez les fréquences liées à partir de Wikipedia


joli dessin. ils devraient le retourner à l'envers de sorte que les symboles de clé (et le personnel musical) soient à droite. mais alors tous les numéros de fréquence et de période et MIDI seraient à l'envers.
robert bristow-johnson

Il semble que vous ayez besoin d'une détection de hauteur polyphonique au lieu d'une détection monophonique (c'est-à-dire une note à la fois). Est-ce exact?
Jazzmaniac

@Jazzmaniac Polyphonic serait certainement un plus, c'est-à-dire que le monophonique serait une restriction. Si je pouvais utiliser la FFT, j'afficherais plusieurs pics sur un diagramme fréquence-temps 2D. En revanche, si je comprends bien, les instruments à vent sont monophoniques, et le violon est assez proche de ça.
18446744073709551615

Les instruments à vent fonctionnent certainement avec des algorithmes de détection monophoniques. Les instruments à cordes (avec plus d'une corde) sont cependant délicats, et la plupart sinon tous les détecteurs monophoniques produisent des résultats peu fiables ou même inutilisables en présence de sons en décomposition provenant de cordes pas parfaitement coupées, de cordes ouvertes résonnant ou simplement de diaphonie à partir du microphone. Cela dit, la détection polyphonique est difficile. Cependant, comme vous n'avez pas vraiment besoin d'une détection de note précise mais simplement d'une détection précise de l'accordage, vous pouvez très bien trouver un algorithme approprié. Ce ne sera cependant pas un détecteur de hauteur monophonique.
Jazzmaniac

Cela peut expliquer le downvote de la réponse de RBJ, ou quelqu'un pourrait s'être offensé de son argumentaire de vente quelque peu non objectif. En tout cas, ne sautez pas trop tôt sur son vaisseau. Il existe d'autres options pour ce que vous voulez, et peut-être aussi de meilleures.
Jazzmaniac

Réponses:


9

" 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)

QX[k]=n|X[n]-X[n-k]|

Fonction de différence quadratique moyenne (ASDF)

QX[k]=n(X[n]-X[n-k])2

Fonction d'autocorrélation (AF)

RX[k]=nX[n]X[n-k]

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:

  1. vous pouvez toujours corréler le plus récent N é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.

  2. vous n'avez pas besoin de calculer la corrélation pour chaque décalage entier k. 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.

  3. lorsqu'un potentiel nul (AM_F) ou un pic (AF) est trouvé, vous pouvez calculer la corrélation pour les valeurs entières adjacentes de k.

  4. entre des valeurs entières adjacentes de k, 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.

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


1
Un commentaire sur le vote à la baisse serait apprécié. S'il y a quelque chose qui ne va pas, je veux le savoir. Cette réponse ne donne aucune recette, mais au moins il y a une liste de choses à lire (enfin, cela ne semble pas être une lecture facile, mais c'est quelque chose qui vaut mieux que rien). Veuillez ne pas supprimer cette réponse.
18446744073709551615

1
qui supprimerait la réponse? moi?
robert bristow-johnson

3

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.


deux notes: si vous voulez que votre détection de hauteur soit " rapide ", je ne recommanderais pas de le faire dans le domaine fréquentiel (à moins que peut-être si vous faites quelque chose d'un peu multi-taux avec plusieurs FFT. la raison en est que vous ne peut même pas commencer à FFT jusqu'à ce que vous obteniez tous les échantillons. pour une FFT de longueur décente (pour obtenir une résolution suffisante à faible hauteur), vous avez déjà attendu, disons, 0,1 seconde. la hauteur (et le volume) sont des mesures psychoacoustiques qui parfois corrélent bien avec les propriétés physiques comme la période (et la puissance)
.pour les

mais je viens de rencontrer mon petit script Matlab sur un coup de tom enregistré et sondé pour moi que le terrain est revenu serait une valeur de note plausible.
robert bristow-johnson
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.