2011-05-28 5 views
1

Je travaille actuellement sur un programme qui analyse un fichier wav d'un musicien soliste jouant d'un instrument et détecte les notes qu'il contient. Pour ce faire, il effectue une FFT, puis regarde les données produites. Le but est de (à un certain point) produire la partition en écrivant un fichier midi. Je voulais juste obtenir quelques opinions sur ce qui pourrait être difficile à ce sujet, si quelqu'un l'a déjà essayé, peut-être quelques choses qu'il serait bon de rechercher. Pour le moment, mon plus gros problème est que toutes les notes ne sont pas une seule fréquence et que je ne peux pas encore détecter les accords; juste des notes simples. Il faut aussi qu'il y ait une pause entre les notes que je suis en train de détecter, donc je sais que l'un est terminé et l'autre a commencé. Tout commentaire à ce sujet serait également le bienvenu!Analyse audio pour partitions

C'est le code que j'utilise lorsqu'une nouvelle trame vient du signal. il recherche la fréquence qui est la plus dominante dans l'échantillon:

//Get frequency vector for power match 
     double[] frequencyVectorDoubleArray = Accord.Audio.Tools.GetFrequencyVector(waveSignal.Length, waveSignal.SampleRate); 

     powerSpectrumDoubleArray[0] = 0; // zero DC 

     double[,] frequencyPowerDoubleArray = new double[powerSpectrumDoubleArray.Length, 2]; 

     for (int i = 0; i < powerSpectrumDoubleArray.Length; i++) 
     { 
      if (frequencyVectorDoubleArray[i] > 15.00) 
      { 
       frequencyPowerDoubleArray[i, 0] = frequencyVectorDoubleArray[i]; 
       frequencyPowerDoubleArray[i, 1] = powerSpectrumDoubleArray[i]; 
      } 
     } 

    //Method for finding the highest frequency in a sample of frequency domain data 
     //But I want to filter out stuff 
     pulsePowerDouble = lowestPowerAcceptedDouble;//0;//lowestPowerAccepted; 
     int frequencyIndexAtPulseInt = 0; 
     int oldFrequencyIndexAtPulse = 0; 
     for (int j = 0; j < frequencyPowerDoubleArray.Length/2; j++) 
     { 
      if (frequencyPowerDoubleArray[j, 1] > pulsePowerDouble) 
      { 
       oldPulsePowerDouble = pulsePowerDouble; 
       pulsePowerDouble = frequencyPowerDoubleArray[j, 1]; 

       oldFrequencyIndexAtPulse = frequencyIndexAtPulseInt; 
       frequencyIndexAtPulseInt = j; 
      } 
     } 
     foundFreq = frequencyPowerDoubleArray[frequencyIndexAtPulseInt, 0]; 
+0

Avez-vous du code que vous pouvez nous montrer? –

+0

Bien sûr. Affichera. – Nyx

+0

Voir http://stackoverflow.com/questions/435533/detecting-the-fundamental-frequency – mtrw

Répondre

4

1) Il y a beaucoup (plusieurs dizaines d'années) de littérature de recherche sur l'estimation de fréquence et l'estimation de la hauteur (qui sont deux sujets différents).

2) La fréquence FFT maximale n'est pas la même que la hauteur musicale. Certains instruments de musique solo peuvent produire bien plus d'une douzaine de pics de fréquence pour une seule note, sans parler d'un accord, et avec aucun des plus grands pics à proximité du terrain musical. Pour certains instruments courants, les pics pourraient même ne pas être des harmoniques mathématiquement exactes.

3) L'utilisation de la case de crête d'une FFT courte non déroulée n'est pas un estimateur de fréquence intéressant.

4) La détection de début de note peut nécessiter une correspondance de modèle sophistiquée, en fonction de l'instrument.

+0

Salut. Merci, j'utilise maintenant une fenêtre (Hann) et j'ai pensé à des modèles markov cachés pour l'appariement de motifs. La fenêtre améliore grandement la précision des fréquences que je trouve. RE 2: c'est effectivement un problème. Actuellement, je suis en train de résoudre une partie de ce problème en recherchant les occurrences des octaves inférieures de la fréquence la plus puissante et la fréquence la plus élevée dans un ensemble d'échantillons. – Nyx

1

Vous ne voulez pas de se concentrer sur la plus haute fréquence, mais le plus bas. Chaque note de n'importe quel instrument de musique est pleine d'harmoniques. Attendez-vous à entendre le fondamental, et chaque octave au-dessus. Plus toutes les deuxième et troisième harmoniques.

Les harmoniques sont ce qui fait qu'un son de trompette diffère d'un trombone quand il joue la même note.

+0

Gardez à l'esprit cependant que souvent le fondamental sera manquant (http://en.wikipedia.org/wiki/Missing_fundamental). – mtrw

+0

Oui, le code ci-dessus ne prend que le plus fort dans l'échantillon. Plus tard je cherche s'il y a une occurrence de la fréquence inférieure de sorte que, par exemple, si je joue A4 et obtienne des données comme ceci: 440, 880, 880, 880, 880 Montrant A5 comme plus probable la note I supposera que c'est A4 parce qu'il y a au moins une occurrence de A4. Cependant, plus les notes sont basses, plus j'ai trouvé qu'il est difficile d'obtenir des occurrences parce qu'elles sont assez bruyantes. – Nyx

1

Malheureusement, ceci est un problème extrêmement difficile, certaines des raisons ont déjà été données. Je commencerais par une recherche documentaire (Google Scholar, par exemple) pour "l'identification des notes de musique".

Si ce n'est pas un projet de temps libre, méfiez-vous - j'ai vu des maîtres fondateurs sur ce banc particulier sans obtenir de résultats utiles.