Question

Avec des ressources limitées telles que les processeurs plus lents, la taille du code et de la RAM, la meilleure façon de détecter la hauteur d'une note musicale, similaire à un accordeur électronique ou un logiciel ferait?

Dois-je utiliser:

  • FFT Kiss
  • FFTW
  • Discrete Wavelet Transform
  • autocorrelation
  • zéro analyse de croisement
  • filtres d'octave espacées

autre?

En un mot, ce que je suis en train de faire est de reconnaître une seule note de musique, deux octaves en dessous du milieu C à stridente, jouées sur un instrument (raisonnable). Je voudrais être à moins de 20% du demi-ton - autrement dit, si l'utilisateur joue trop plat ou trop forte, je dois distinguer cela. Cependant, je ne vais pas besoin de la précision requise pour le réglage.

Était-ce utile?

La solution

Si vous n'avez pas besoin que beaucoup de précision, une FFT pourrait être suffisante. le morceau de l'audio en premier afin que vous obtenez des pics bien définis, puis trouver la première importante pic.

largeur Bin = fréquence d'échantillonnage / taille FFT:

plage de 20 Hz à 7 kHz, de sorte qu'un le taux d'échantillonnage de 14 kHz serait suffisant. Le prochain taux d'échantillonnage "standard" est 22050 Hz.

La taille de la FFT est ensuite déterminée par la précision que vous voulez. sortie FFT est linéaire en fréquence, alors que les tons musicaux sont logarithmiques en fréquence, donc la pire précision de cas sera à basses fréquences. Pour 20% d'un demi-ton à 20 Hz, vous avez besoin d'une largeur 1,2 Hz , ce qui signifie une longueur de FFT de 18545 . La mise sous tension suivante de deux est 2 15 = 32768. Ceci est de 1,5 secondes de données, et prend le processeur de mon ordinateur portable 3 ms à calculer.

Cela ne fonctionnera pas avec les signaux qui ont un « manque fondamentale », et conclusion la « première importante » pic est un peu difficile (depuis sont souvent plus élevés que les fondamentale), mais vous pouvez trouver un moyen qui convient à votre situation.

Autocorrélation et le spectre des produits harmoniques sont mieux à trouver le vrai fondamental pour une place vague de l'un des harmoniques, mais je ne pense pas qu'ils traitent aussi bien avec inharmonicité , et la plupart des instruments comme le piano ou la guitare sont inharmoniques (harmoniques sont un peu forte de ce qu'ils devraient être). Cela dépend vraiment de votre situation, cependant.

En outre, vous pouvez économiser encore plus de cycles de processeur en calculant seulement dans une bande de fréquences d'intérêt spécifique, en utilisant le Chirp-Z transformer .

Je suis Rédigés quelques méthodes différentes en Python à des fins de comparaison.

Autres conseils

Si vous voulez faire la reconnaissance de hauteur en temps réel (et précis à 1/100 de demi-ton), votre seul espoir est l'approche de passage à zéro. Et il est un faible espoir, désolé de le dire. Passage à zéro peut estimer pas de seulement quelques longueurs d'onde de données, et il peut être fait avec une puissance de traitement de smartphone, mais ce n'est pas particulièrement précis, comme des erreurs minuscules dans la mesure des longueurs d'onde entraînent des erreurs importantes dans la fréquence estimée. Des appareils tels que les synthétiseurs de guitare (qui déduisent le pas d'une corde de guitare avec seulement quelques longueurs d'onde) travaillent en quantifiant les mesures aux notes de l'échelle. Cela peut fonctionner à vos besoins, mais sachez que fonctionne passage à zéro grand avec des formes d'ondes simples, mais a tendance à travailler de moins en moins bien avec plus des sons d'instruments complexes.

Dans mon application (un synthétiseur logiciel qui fonctionne sur les smartphones) J'utilise des enregistrements de notes d'instruments simples comme matière première pour la synthèse wavetable, et pour produire des notes à un pas particulier, je dois connaître le pas fondamental d'un enregistrement, précis à 1/1000 d'un demi-ton (je vraiment besoin de précision 1/100, mais je suis sur ce TOC). L'approche de passage à zéro est beaucoup trop imprécis pour cela, et les approches FFT sont soit trop imprécises ou trop lent (ou les deux parfois).

La meilleure approche que j'ai trouvé dans ce cas est d'utiliser autocorrelation. Avec vous devinez autocorrelation essentiellement le terrain et mesurer l'auto-corrélation de votre échantillon à cette longueur d'onde correspondant. En balayant la gamme d'emplacements plausibles (par exemple A = 55 Hz à travers A = 880 Hz) par demi-tons, je localiser le pas le plus corrélé, puis faire une analyse plus finement grainée dans le quartier de ce pas pour obtenir un valeur plus précise.

L'approche mieux pour vous dépend entièrement de ce que vous essayez de l'utiliser pour.

Je ne connais pas toutes les méthodes que vous mentionnez, mais ce que vous choisissez devrait dépendre principalement de la nature de vos données d'entrée. Est-ce que vous analysez les sons purs, ou que votre source d'entrée comporte plusieurs notes? Est la parole une caractéristique de votre entrée? Y at-il des limites à la durée pendant laquelle vous devez goûter l'entrée? Êtes-vous en mesure de troquer une certaine précision pour la vitesse?

Dans une certaine mesure ce que vous choisissez dépend aussi si vous souhaitez effectuer vos calculs dans temps ou . La conversion d'un séries chronologiques à une représentation de fréquence prend du temps, mais mon expérience a tendance à donner de meilleurs résultats.

autocorrélation compare deux signaux dans le domaine temporel. Une mise en œuvre naïve est simple mais relativement coûteux à calculer, car il faut differentiation sage paire entre tous les points dans les signaux originaux et décalés dans le temps, suivi de la différenciation pour identifier les points de retournement dans la fonction d'auto-corrélation, puis sélection du minimum correspondant à la fréquence fondamentale. Il existe des méthodes alternatives. Par exemple, Différenciation Magnitude moyenne est une forme très pas cher de autocorrelation, mais la précision souffre. Toutes les techniques d'auto-corrélation courent le risque d'erreurs d'octave, puisque les pics autres que la fondamentale existe dans la fonction.

des points de passage à zéro est simple et directe, mais de rencontrer des problèmes si vous avez de multiples formes d'onde présentes dans le signal.

En fréquence l'espace, des techniques basées sur FFT peut être assez efficace pour vos besoins. Un exemple est la technique de spectre de produit harmonique, qui compare le spectre de puissance du signal avec des versions sous-échantillonnées à chaque harmonique, et identifie le terrain en multipliant les spectres ensemble pour produire un pic net.

Comme toujours, il n'y a pas de remplacer les essais et le profilage de plusieurs techniques, afin de déterminer de façon empirique ce qui fonctionnera le mieux pour votre problème et les contraintes.

Une réponse comme celui-ci ne peut rayer la surface de ce sujet. Ainsi que les liens précédents, voici quelques références pertinentes pour aller plus loin.

Dans mon projet, danstuner , je pris le code Audacity . Il a essentiellement pris une FFT, puis a trouvé la puissance de pointe en mettant une courbe cube sur la FFT et de trouver le pic de cette courbe. Fonctionne très bien, même si je devais garder contre octave saut.

Voir Spectrum.cpp .

Le passage par zéro fonctionnera pas, car un son typique a des harmoniques et des passages à zéro beaucoup plus que la fréquence de base.

Quelque chose que j'expérimenté avec (comme un projet parallèle à domicile) était le suivant:

  1. Exemple avec le son ADC quel que soit le taux d'échantillonnage dont vous avez besoin.
  2. détecter les niveaux des pics positifs et négatifs à court terme de la forme d'onde (fenêtre coulissante ou similaire). C'est à dire. un détecteur d'enveloppe.
  3. Faire une onde carrée qui passe au niveau haut lorsque la forme d'onde passe à l'intérieur de 90% (ou plus) de l'enveloppe positive et passe au niveau bas lorsque la forme d'onde passe à l'intérieur de 90% de l'enveloppe négative. C'est à dire. une onde carrée de suivi avec hystérésis.
  4. Mesurer la fréquence de cette onde carrée avec des calculs comptage / temps linéaire vers l'avant, en utilisant autant d'échantillons que vous avez besoin pour obtenir la précision requise.

Cependant, je trouve que des entrées de mon clavier électronique, pour certains sons d'instruments, il a réussi à ramasser 2 × la fréquence de base (octave suivante). Ce fut un projet de côté et je n'eu le temps de mettre en œuvre une solution avant de passer à d'autres choses. Mais je pensais qu'il avait promis comme étant beaucoup moins de charge CPU que FFT.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top