Linux中的实时音频分析

12

我想知道推荐使用哪个音频库?

我正在试图制作一个小程序,以帮助调音乐器(钢琴、吉他等)。我已经阅读了有关ALSA和Marsyas音频库的文章。

我的想法是从麦克风中采样数据,对5-10ms的块进行分析(根据我所读的)。然后执行FFT以确定哪个频率包含最大的峰值。

5个回答

7

这个指南应该会对你有所帮助。不要在你的应用中使用ALSA,而是使用更高级别的API。如果你决定使用JACK,http://jackaudio.org/applications中有三个乐器调音器可以用作示例代码。


4
Marsyas是做这种任务的绝佳选择。它专门为此而构建。
要调音乐器,您需要有一个算法来估计声音的基频(F0)。有许多算法可以做到这一点,最新和最好的算法之一是由Alain de Cheveigne开发的YIN算法。我最近将YIN算法添加到了Marsyas中,并且使用它非常简单。
以下是您在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()) { net->tick(); realvec r = net->getctrl("mrs_realvec/processedData")->to(); cout << r(0,0) << endl; }
此代码首先创建一个Series对象,我们将向其中添加组件。在Series中,每个组件都按序接收前一个MarSystem的输出。然后,我们添加一个SoundFileSource,您可以将.wav或.mp3文件输入其中。然后,我们添加ShiftInput对象,它输出重叠的音频块,然后将其馈送到AubioYin对象中,该对象估计该音频块的基频。
然后,我们告诉SoundFileSource我们要读取inAudioFileName文件。
while语句一直循环,直到SoundFileSource用尽数据。在while循环内部,我们获取网络处理的数据并输出(0,0)元素,即基频估计值。
如果使用Marsyas的Python绑定,则更加容易。

3

http://clam-project.org/ CLAM是一个完整的软件框架,用于音频和音乐领域的研究和应用开发。它提供了概念模型以及用于分析、合成和处理音频信号的工具。

他们有一个很棒的API,漂亮的GUI和一些完成的应用程序,你可以在这些应用程序中看到所有内容。


2

由于内核驱动程序被包含在内核中,而OSS已经过时,因此ALSA现在是Linux的默认标准。但是,有一些替代ALSA用户空间的选择,比如jack,它似乎专注于低延迟的专业应用程序。它的API看起来更好,尽管我没有使用过,但我对ALSA API的简要了解使我认为几乎任何东西都会更好。


0

Audacity包含频率图特性和内置的FFT滤波器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接