Bibliothèque .NET pour identifier les pas

J’aimerais écrire un programme simple (de préférence en C #) auquel je chante une hauteur en utilisant un micro et le programme identifie la note de musique correspondant à cette hauteur.


Merci beaucoup pour vos réponses rapides. Je clarifie:

Je voudrais une bibliothèque (de préférence .NET) qui identifierait les notes que je chante. J’aimerais qu’une telle bibliothèque:

  1. Identifie une note lorsque je chante (une note de la gamme chromatique).
  2. Me dit combien je suis loin de la note la plus proche.

J’ai l’intention d’utiliser une telle bibliothèque pour chanter une note à la fois.

L’élément crucial de ce problème est la transformation de Fourier rapide. Cet algorithme transforme une forme d’onde (votre note chantée) en une dissortingbution de fréquence. Une fois que vous avez calculé la FFT, vous identifiez la fréquence fondamentale (généralement la fréquence avec l’amplitude la plus élevée dans la FFT, mais cela dépend un peu de la courbe de réponse en fréquence de votre microphone et du type de son écouté par votre microphone).

Une fois que vous avez trouvé la fréquence fondamentale, vous devez rechercher cette fréquence dans une liste qui mappe les fréquences sur les notes. Ici, vous devrez régler les intervalles intermédiaires (donc, si la fréquence fondamentale de votre note chantée est de 452Hz, à quelle note correspond-elle, A ou A #?).

Ce gars sur CodeProject a un exemple de FFT en C #. Je suis sûr qu’il y en a d’autres là-bas …

Vous recherchez une estimation de fréquence ou un algorithme de détection de la hauteur . La plupart des gens suggèrent de trouver la valeur maximale de la FFT, mais ceci est trop simpliste et ne fonctionne pas aussi bien que vous ne le pensez. Si la fondamentale est manquante (une timbale, par exemple) ou si l’une des harmoniques est plus grande que la fondamentale (une trompette, par exemple), elle ne détectera pas la fréquence correcte. Spectre de la trompette:

Spectre de trompettes http://soffr.miximages.com/c%23/02284.jpg

En outre, vous gaspillez des cycles de processeur à calculer la FFT si vous recherchez uniquement une fréquence spécifique. Vous pouvez utiliser des éléments tels que l’ algorithme de Goertzel pour rechercher plus efficacement des tonalités dans une bande de fréquence spécifique.

Vous devez vraiment trouver “la première fréquence significative” ou “la première fréquence avec de fortes composantes harmoniques”, ce qui est plus ambigu que de rechercher simplement le maximum.

L’autocorrélation ou le spectre de produits harmoniques est meilleur pour trouver le vrai fondamental des instruments réels, mais si l’instrument est inharmonique (la plupart le sont), la forme de l’onde change avec le temps, et je suppose que cela ne fonctionnera pas aussi bien si vous essayez pour mesurer plus que quelques cycles à la fois, ce qui diminue votre précision.

Vous feriez généralement une transformation de Fourier sur l’entrée, puis identifieriez la fréquence la plus importante. Ce n’est peut-être pas toute l’histoire, car toute source sonore non synthétique produit un certain nombre de fréquences (elles constituent ce que l’on appelle la “couleur de ton”). Quoi qu’il en soit, cela peut être fait efficacement; il y a des autotuners en temps réel (vous ne pensiez pas qu’une star de la pop pourrait vraiment chanter, n’est-ce pas?).

Presque toutes les réponses disent de faire une FFT. J’ai écrit ce programme moi-même, et j’ai trouvé que la FFT était bonne à identifier approximativement la fréquence la plus forte, mais qu’il en résultait un “barbouillage” – il n’est pas toujours facile d’identifier avec précision les petites variations par rapport à la hauteur cible. utilisant une FFT, en particulier si l’échantillon est court.

L’approche d’Erik Kallen semble raisonnable, mais il en existe d’autres. Ce que j’ai trouvé fonctionnait assez bien, c’était l’utilisation d’une combinaison de FFT et d’un simple algorithme de détection de «passage par zéro» pour affiner la fréquence exacte du signal.

Autrement dit, comptez le nombre de fois où le signal a franchi la ligne zéro dans un intervalle donné, ajustez-le à la fréquence approximative produite par la FFT et vous obtiendrez un résultat assez précis.

Effectuer une transformation de Fourier vous donnera des valeurs pour chaque fréquence trouvée dans l’échantillon. Plus la fréquence est importante, plus la valeur est élevée. Si vous recherchez la plus grande valeur, vous trouverez votre fréquence racine, mais des harmoniques seront également présentes.

Si vous recherchez une fréquence spécifique, utiliser l’algorithme de Goertzel peut s’avérer très efficace.

J’ai déjà détecté la hauteur tonale par le passé, et la solution simple consistant à «prendre une FFT et regarder le sumt» ne fonctionne pas du tout pour la parole. J’ai eu assez de chance en utilisant l’ parsing cepstrale . Vous trouverez de nombreux articles utiles dans les publications de Lawrence Rabiner. Je recommande de commencer par “Une étude comparative des performances de plusieurs algorithmes de détection de la hauteur” .

En guise d’avertissement, il m’a probablement fallu environ 30 à 40 heures de travail pour pouvoir envoyer un fichier .wav à mon programme et le faire cracher un nombre raisonnable. J’étais aussi plus intéressé par la fréquence fondamentale de la voix d’un locuteur. Je suis sûr que traiter avec la musique va append beaucoup plus de rides.

Vous voudrez capturer votre entrée brute, accumuler quelques échantillons, puis faire une FFT sur eux. La FFT convertira vos échantillons du domaine temporel en domaine fréquentiel. Par conséquent, elle génère un peu l’histogramme de la quantité d’énergie contenue dans le signal à différentes fréquences.

Passer de cela à “la” fréquence peut être un peu difficile cependant – une voix humaine ne va pas contenir uniquement une fréquence propre. Au lieu de cela, vous aurez normalement de l’énergie à un assez grand nombre de fréquences différentes. Ce que vous ferez en général, c’est partir de la gamme de voix la plus basse et remonter à la recherche de la première fréquence (la plus basse) à laquelle l’énergie est considérablement plus élevée que le bruit de fond.

Vous devez faire une FFT de l’échantillon et ensuite parsingr cela. Les deux choses qui compliqueront votre parsing sont:

  1. Les tonalités. Si vous chantez / jouez le A à 440 Hz (A4), vous obtiendrez également une tonalité à A5 (880Hz), une voix à E6 (1320 Hz), etc. En fonction des intensités relatives aux fréquences, cette tonalité pourrait être perçue en tant que A4, A5 ou E6, et réduire le ton n’est pas simplement une question d’intensité, mais l’oreille humaine est plus compliquée que cela. Vous pouvez toutefois raisonnablement deviner que cela sera perçu comme un A.

  2. Granularité. Votre FFT aura une granularité qui ne dépend que de la durée de l’échantillon, pas de la fréquence d’échantillonnage. Si je me souviens bien, vous avez besoin d’un échantillon de deux secondes pour pouvoir obtenir une granularité de 1 Hz, ce qui est encore un peu grossier. Une façon de contourner ce problème consiste à définir trois fréquences autour de chaque pointe, à approximativement un polynôme du second degré autour de celles-ci, puis à déterminer le maximum de ce polynôme. J’ai lu un article affirmant que l’utilisation de la phase est plus précise que l’amplitude, mais je ne me souviens pas de l’endroit où je ne peux pas le citer.

Je suis ébahi par toutes les réponses suggérant l’utilisation de la FFT, étant donné que la FFT n’est généralement pas assez précise pour la détection de la hauteur. Ce peut être le cas, mais seulement avec une fenêtre FFT trop grande. Par exemple, pour déterminer le fondamental avec une précision d’un demi-ton (ce qui est nécessaire pour une détection précise de la hauteur) au-dessus du fondamental A autour du concert A (440 Hz), vous avez besoin d’une fenêtre FFT avec 524 288 éléments. 1024 est une taille beaucoup plus typique de FFT – le temps de calcul empire progressivement à mesure que la fenêtre est grande.

Je dois identifier la hauteur fondamentale des fichiers WAV dans mon synthétiseur logiciel (où un “raté” est immédiatement audible comme un instrument désaccordé) et j’ai constaté que l’autocorrélation faisait de loin le meilleur travail. Fondamentalement, je parcourt chaque note de l’échelle des 12 notes sur une plage de 8 octaves, calcule la fréquence et la longueur d’onde de chaque note, puis effectue une autocorrélation en utilisant cette longueur comme retard (une autocorrélation est le lieu où vous mesurez la corrélation). entre un dataset et le même dataset décalé d’un certain décalage).

La note avec le score d’autocorrélation le plus élevé est donc approximativement la hauteur fondamentale. Je me suis ensuite “familiarisé” avec le vrai fondamental en passant d’un demi-ton à un demi-ton sur un millième de demi-ton, pour trouver la valeur d’autocorrélation de crête locale. Cette méthode fonctionne de manière très précise et, surtout, pour une grande variété de fichiers d’instrument (cordes, guitare, voix humaines, etc.).

Ce processus est toutefois extrêmement lent, en particulier pour les fichiers WAV longs, et ne peut donc pas être utilisé tel quel pour une application en temps réel. Cependant, si vous utilisiez FFT pour obtenir une estimation approximative de la fondamentale, puis l’autocorrélation afin de cibler la valeur vraie (et que vous vous contentiez d’être moins précis qu’un millième de demi-ton, ce qui est absurdement excessif). précis), vous disposeriez d’une méthode relativement rapide et extrêmement précise.

Avez-vous vu cette question? Transformation de Fourier rapide en C #

Il semble que cela puisse vous aider.

Je pense que vous voulez cette question: Détection de la hauteur en temps réel avec FFT

Si vous voulez juste le résultat – je veux utiliser le logiciel, il existe un programme appelé SingAndSee qui ne fait que cela. C’est environ 25 £

Étant donné que vous avez affaire à une source monophonique, la plupart de vos hauteurs détectées avec une FFT devraient être liées de manière harmonique, mais vous n’êtes pas vraiment assuré que la fondamentale soit la plus forte. En fait, pour de nombreux instruments et certains registres de voix, ce ne sera probablement pas le cas. Il doit cependant être le plus bas des pas harmoniquement liés (en multiples entiers de la fondamentale) détectés.

Peut-être que cette bibliothèque entièrement gérée de codeplex est appropriée pour vous: Realtime C # Pitch Tracker

Author énumère les avantages suivants de l’auto-corrélation et de son implémentation d’algorithme:

  1. Vite. Comme mentionné ci-dessus, l’algorithme est assez rapide. Il peut facilement effectuer 3000 tests de pitch par seconde.

  2. Précis. L’écart mesuré par rapport à la fréquence réelle est inférieur à + -0,02%.

  3. Précision sur une large gamme de niveaux d’entrée. Comme l’algorithme utilise les ratios de différents pics et non des valeurs absolues, il rest précis sur une très large plage de niveaux d’entrée. Il n’ya aucune perte de précision dans la plage d’entrée -40 dB à 0 dB.

  4. Précis sur toute la plage de fréquences. La précision rest élevée sur toute la gamme de fréquences détectées, d’environ 50 Hz à 1,6 kHz. Cela est dû à l’interpolation appliquée lors du calcul des échantillons pour les fenêtres glissantes.

  5. Précis pour tout type de forme d’onde. Contrairement à beaucoup d’autres types d’algorithmes de détection de la hauteur, cet algorithme n’est essentiellement pas affecté par les formes d’onde complexes. Cela signifie que cela fonctionne avec des voix masculines et féminines de tout type, ainsi qu’avec d’autres instruments tels que des guitares, etc. Le seul impératif étant que le signal soit monophonique, les accords ne peuvent pas être détectés. Ce détecteur de hauteur fonctionnera bien comme accordeur de guitare très réactif.

  6. Ne compte pas sur les résultats précédents. Cet algorithme est suffisamment précis pour ne pas nécessiter de résultats antérieurs. Chaque résultat de hauteur est une toute nouvelle valeur calculée. Les algorithmes de hauteur qui suivent la hauteur en “se verrouillant” sur la hauteur souffrent du problème suivant: s’ils détectent une mauvaise hauteur (généralement une octave trop haute ou trop basse), ils continueront à se tromper lors de nombreux tests ultérieurs.

Pour convertir le signal de domaine temporel provenant du microphone, vous devez utiliser une transformée de Fourier discrète (DFT) ou une transformation de Fourier rapide (FFT). La FFT fonctionnera plus rapidement mais le code sera beaucoup plus complexe (une TFD peut être réalisée en 5 à 10 lignes de code). Une fois cette opération terminée, vous devez mapper les fréquences fondamentales sur les notes. Malheureusement, il existe plusieurs schémas de mappage en fonction du système de syntonisation utilisé. Le plus commun d’entre eux est Equal Temperament. Fréquences ici . L’article de Wikipedia sur Equal Temprement donne également des informations sur Equal tempérament.

Lorsque vous utilisez des mathématiques à quatre niveaux, vous devez savoir comment les fréquences sont gérées et idéalement, effectuez un filtrage anti-aliasing avant la transformation et veillez également à la reflection de la fréquence lors de l’exécution d’une transformation. En raison du théorème de Nyquists, vous devrez échantillonner le contenu du microphone au moins deux fois plus rapidement que la fréquence maximale, c.-à-d. pour une fréquence maximale de 10Hz, vous devez échantillonner à 20Hz.

D3D11 contient une implémentation FFT