2009-03-31 9 views
10

Je me demande quelle est la bibliothèque audio recommandée à utiliser?Analyse audio en temps réel sous Linux

J'essaye de faire un petit programme qui aidera au réglage des instruments. (Piano, Guitare, etc.). J'ai lu à propos de ALSA & bibliothèques audio Marsyas.

Je pense que l'idée est d'échantillonner des données du microphone, faire l'analyse sur des morceaux de 5-10ms (d'après ce que j'ai lu). Ensuite, effectuez une FFT pour déterminer quelle fréquence contient le plus grand pic.

Répondre

4

Marsyas serait un excellent choix pour ce faire, il est construit exactement pour ce genre de tâche.

Pour régler un instrument, vous devez avoir un algorithme qui estime la fréquence fondamentale (F0) d'un son. Il existe un certain nombre d'algorithmes pour cela, l'un des plus récents et meilleurs est l'algorithme YIN, qui a été développé par Alain de Cheveigne. J'ai récemment ajouté l'algorithme YIN à Marsyas, et l'utiliser est mort simple.

Voici le code de base que vous utiliseriez dans Marsyas:

 
    MarSystemManager mng; 

    // A series to contain everything 
    MarSystem* net = mng.create("Series", "series"); 

    // Process the data from the SoundFileSource with AubioYin 
    net->addMarSystem(mng.create("SoundFileSource", "src")); 
    net->addMarSystem(mng.create("ShiftInput", "si")); 
    net->addMarSystem(mng.create("AubioYin", "yin")); 

    net->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName); 

    while (net->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>()) { 
    net->tick(); 
    realvec r = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); 
    cout << r(0,0) << endl; 
    } 

Ce code crée d'abord un objet de la série que nous allons ajouter des composants à. Dans une série, chacun des composants reçoit la sortie du système MarSystem précédent en série. Nous ajoutons ensuite un SoundFileSource, que vous pouvez charger dans un fichier .wav ou .mp3 dans. Nous ajoutons ensuite l'objet ShiftInput qui génère des morceaux d'audio qui se chevauchent, qui sont ensuite introduits dans l'objet AubioYin, qui estime la fréquence fondamentale de ce morceau d'audio.

Nous indiquons ensuite à SoundFileSource que nous voulons lire le fichier dans NomFichierAudio.

L'instruction while effectue ensuite une boucle jusqu'à ce que SoundFileSource ne dispose plus de données. A l'intérieur de la boucle , nous prenons les données que le réseau a traitées et sortons l'élément (0,0), qui est l'estimation de fréquence fondamentale .

Ceci est encore plus facile lorsque vous utilisez les liaisons Python pour Marsyas.

2

ALSA est en quelque sorte la norme par défaut pour linux, car les pilotes du noyau inclus dans le noyau et l'OSS sont dépréciés. Cependant, il existe des alternatives à l'espace utilisateur ALSA, comme jack, qui semble être destiné aux applications de type professionnel à faible latence. Son API semble avoir une API plus belle, même si je ne l'ai pas utilisée, ma brève exposition à l'API ALSA me ferait penser que presque tout irait mieux.

5

Cette guide devrait aider. N'utilisez pas ALSA pour votre application. Utilisez une API de niveau supérieur. Si vous décidez d'utiliser JACK, http://jackaudio.org/applications dispose de trois syntoniseurs d'instruments que vous pouvez utiliser comme exemple de code.

0

Audacity inclut une caractéristique de tracé de fréquence et possède des filtres FFT intégrés.

3

http://clam-project.org/ CLAM est un framework logiciel à part entière pour la recherche et le développement d'applications dans le domaine audio et musical. Il propose un modèle conceptuel ainsi que des outils pour l'analyse, la synthèse et le traitement de signaux audio.

Ils ont une excellente API, une interface graphique agréable et quelques applications terminées où vous pouvez tout voir.

Questions connexes