2009-03-31 15 views
10

Zastanawiam się, jaka jest zalecana biblioteka audio do użycia?Analiza audio w czasie rzeczywistym w systemie Linux

Próbuję zrobić mały program, który pomoże w strojeniu instrumentów. (Fortepian, gitara, itp.). Przeczytałem o bibliotekach audio ALSY & Marsyas.

Myślę, że pomysł polega na próbkowaniu danych z mikrofonu, przeprowadzaniu analiz w porcjach 5-10 ms (z tego, co przeczytałem). Następnie wykonaj FFT, aby dowiedzieć się, która częstotliwość zawiera największy pik.

Odpowiedz

4

Marsyas byłby świetnym wyborem do zrobienia tego, jest zbudowany specjalnie do tego rodzaju zadań.

Do dostrajania instrumentu należy użyć algorytmu, który szacuje podstawową częstotliwość dźwięku (F0) . Istnieje wiele algorytmów, aby to zrobić, jednym z najnowszych i najlepszych jest algorytm YIN, który został opracowany przez Alaina de Cheveigne. Niedawno dodałem algorytm YIN do Marsyas, a użycie go jest proste.

Oto podstawowy kod, który trzeba zastosować w Marsjaszem:

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

Ten kod najpierw tworzy szereg obiektów, które dodamy do komponentów. W serii każdy ze składników odbiera dane wyjściowe poprzedniego systemu MarSystem w postaci szeregowej. Następnie dodajemy SoundFileSource, który można nakarmić w pliku .wav lub .mp3 w. Następnie dodajemy obiekt ShiftInput, który wyprowadza zachodzące na siebie fragmenty audio, które następnie są przesyłane do obiektu AubioYin, który szacuje podstawową częstotliwość tego fragmentu audio.

Następnie przekazujemy SoundFileSource, że chcemy odczytać plik wAudioFileName.

Instrukcja while zapisuje się w pętli, aż do wyczerpania danych SoundFileSource. Wewnątrz pętli pobieramy dane przetwarzane przez sieć i wyprowadzamy element (0,0), który jest podstawową estymatą częstotliwości .

Jest to jeszcze łatwiejsze, gdy używasz powiązań Python dla Marsyas.

2

ALSA jest rodzajem standardowego standardu dla Linuksa teraz ze względu na sterowniki jądra wchodzące w skład jądra i OSS, które są amortyzowane. Istnieją jednak alternatywy dla przestrzeni użytkownika ALSA, takie jak jack, która wydaje się być skierowana do aplikacji profesjonalnych o małym opóźnieniu. Wygląda na to, że API ma ładniejszy interfejs API, chociaż go nie używałem, moja krótka interakcja z API ALSA sprawiłaby, że niemal wszystko byłoby lepsze.

5

Ta pomoc powinna być dostępna pod adresem guide. Nie używaj ALSA do swojej aplikacji. Użyj interfejsu API wyższego poziomu. Jeśli zdecydujesz, że chcesz używać JACK, to masz trzy tunery instrumentów, które możesz wykorzystać jako przykładowy kod.

0

Audacity zawiera funkcję wykresu częstotliwości i ma wbudowane filtry FFT.

3

http://clam-project.org/ CLAM to pełnoprawne środowisko programistyczne do badań i rozwoju aplikacji w domenie audio i muzycznej. Oferuje model koncepcyjny oraz narzędzia do analizy, syntezy i przetwarzania sygnałów audio.

Mają świetne API, ładny interfejs graficzny i kilka gotowych aplikacji, w których można zobaczyć wszystko.