2009-03-31 23 views
10

Ich frage mich, was ist die empfohlene Audio-Bibliothek zu verwenden?Echtzeit-Audioanalyse unter Linux

Ich versuche ein kleines Programm zu machen, das beim Stimmen von Instrumenten hilft. (Klavier, Gitarre usw.). Ich habe über ALSA & Marsyas Audiobibliotheken gelesen.

Ich denke, die Idee ist es, Daten aus dem Mikrofon zu probieren, tun Analyse auf Stücke von 5-10ms (von dem, was ich gelesen habe). Führen Sie dann eine FFT durch, um herauszufinden, welche Frequenz den größten Peak enthält.

Antwort

4

Marsyas wäre eine gute Wahl dafür, es ist genau für diese Art von Aufgabe gebaut.

Um ein Instrument abzustimmen, müssen Sie einen Algorithmus haben, der die grundlegende Frequenz (F0) eines Sounds schätzt. Es gibt eine Reihe von Algorithmen, um dies zu tun, einer der neuesten und besten ist der YIN-Algorithmus, der von Alain de Cheveigne entwickelt wurde. Ich habe kürzlich den YIN-Algorithmus zu Marsyas hinzugefügt, und es ist todschick.

Hier ist der grundlegende Code, den Sie in Marsyas verwenden würden:

 
    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; 
    } 

Dieser Code erzeugt zuerst eine Serie Objekt, das wir Komponenten hinzufügen. In einer Serie erhält jede Komponente die Ausgabe des vorherigen MarSystems in Serie. Wir fügen dann eine SoundFileSource hinzu, die Sie in einer .wav- oder .mp3-Datei einspeisen können. Wir fügen dann das ShiftInput-Objekt hinzu, das überlappende Audioabschnitte ausgibt, die dann in das AubioYin-Objekt eingegeben werden, das die Grundfrequenz dieses Audioabschnitts schätzt.

Wir sagen dann der SoundFileSource, dass wir die Datei inAudioFileName lesen möchten.

Die while-Anweisung wird dann wiederholt, bis die SoundFileSource keine Daten mehr enthält. Innerhalb der Schleife nehmen wir die Daten, die das Netzwerk verarbeitet hat, und geben das Element (0,0) aus, das die Grundfrequenzschätzung ist.

Dies ist noch einfacher, wenn Sie die Python-Bindungen für Marsyas verwenden.

2

ALSA ist eine Art der Standard-Standard für Linux jetzt aufgrund der Kernel-Treiber im Kernel enthalten und OSS wird abgeschrieben. Es gibt jedoch Alternativen zum ALSA-Benutzerbereich, wie zum Beispiel jack, der auf professionelle Anwendungen mit geringer Latenz ausgerichtet zu sein scheint. Die API scheint eine bessere API zu haben, obwohl ich sie nicht verwendet habe, meine kurze Exposition gegenüber der API von ALSA würde mich denken lassen, dass fast alles besser wäre.

5

Diese guide sollte helfen. Verwenden Sie nicht ALSA für Ihre Anwendung. Verwenden Sie eine höhere API. Wenn Sie sich entscheiden, JACK zu verwenden, können Sie mit http://jackaudio.org/applications drei Instrumenten-Tuner als Beispielcode verwenden.

0

Audacity enthält eine Frequenzdiagrammfunktion und integrierte FFT-Filter.

3

http://clam-project.org/ CLAM ist ein vollwertiges Software-Framework für Forschung und Anwendungsentwicklung in der Audio- und Musikdomäne. Es bietet ein konzeptionelles Modell sowie Werkzeuge zur Analyse, Synthese und Verarbeitung von Audiosignalen.

Sie haben eine großartige API, nette GUI und ein paar fertige Anwendungen, wo Sie alles sehen können.