Linux中的实时audio分析

我想知道什么是推荐的audio库使用?

我正在尝试制作一个小程序来帮助调整乐器。 (钢琴,吉他等)。 我读过关于ALSA和Marsyasaudio库。

我认为这个想法是从麦克风采样数据,做5-10ms的分析(从我读过的)。 然后执行FFT来确定哪个频率包含最大峰值。

Marsyas将是这样做的一个很好的选择,它正是为这种任务而建立的。

为了调谐乐器,你需要做的是有一个算法来估计声音的基本频率(F0)。 有许多算法可以做到这一点,其中最新和最好的算法是由Alain de Cheveigne开发的YIN算法。 我最近添加了YIN算法给Marsyas,使用它是非常简单的。

这里是你在Marsyas中使用的基本代码:

   MarSystemManager mng;

   //一系列包含所有内容
   MarSystem * net = mng.create(“Series”,“series”);

   //使用AubioYin处理来自SoundFileSource的数据
   net-> addMarSystem(mng.create(“SoundFileSource”,“src”));
   net-> addMarSystem(mng.create(“ShiftInput”,“si”));
   net-> addMarSystem(mng.create(“AubioYin”,“yin”));

   NET-> updctrl( “SoundFileSource / SRC / mrs_string /文件名”,inAudioFileName);

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

这段代码首先创建一个我们要添加组件的Series对象。 在一个系列中,每个组件都会连续接收前一个MarSystem的输出。 然后,我们添加一个SoundFileSource,您可以在.wav或.mp3文件中输入。 然后,我们添加ShiftInput对象,输出重叠的音频块,然后馈送到AubioYin对象,该对象估计该音频块的基本频率。

然后我们告诉SoundFileSource我们要读取AudioFileName中的文件。

while语句然后循环,直到SoundFileSource用完数据。 在while循环内部,我们把网络已经处理的数据,并输出(0,0)元素,这是基本的频率估计。

当您使用Marsyas的Python绑定时,这更容易。

本指南应该有所帮助。 不要为您的应用程序使用ALSA。 使用更高级别的API。 如果您决定使用JACK,那么http://jackaudio.org/applications有三个乐器调谐器可以用作示例代码&#x3002;

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

他们有一个伟大的API,好的GUI和几个完成的应用程序,你可以看到一切。

现在,由于内核中包含内核驱动程序,并且OSS被折旧,ALSA是Linux的默认标准。 但是,ALSA用户空间有其他选择,比如插孔 ,似乎是针对低延迟专业类型的应用程序。 它的API似乎有一个更好的API,虽然我没有使用它,但是我简短地接触到ALSA API会让我觉得几乎任何东西都会更好。

Audacity包含一个频率图功能,并具有内置的FFT滤波器。