我想知道推荐使用的音频库是什么?
我正在尝试制作一个有助于调整乐器的小程序。 (钢琴,吉他等)。我读过有关ALSA和Marsyas音频库的文章。
我的想法是从麦克风中采样数据,对5-10ms的块进行分析(从我读过的内容)。然后执行FFT以确定哪个频率包含最大峰值。
我想知道推荐使用的音频库是什么?
我正在尝试制作一个有助于调整乐器的小程序。 (钢琴,吉他等)。我读过有关ALSA和Marsyas音频库的文章。
我的想法是从麦克风中采样数据,对5-10ms的块进行分析(从我读过的内容)。然后执行FFT以确定哪个频率包含最大峰值。
Marsyas将是一个很好的选择,它是为这种任务而建的。
要调整仪器,您需要做的是使用估算基波的算法 声音的频率(F0)。有许多算法可以做到这一点,这是最新和最好的算法之一 是YIN算法,由Alain de Cheveigne开发。我最近添加了YIN算法 到Marsyas,使用它很简单。
以下是您在Marsyas中使用的基本代码:
MarSystemManager mng; //包含所有内容的系列 MarSystem * net = mng.create(“系列”,“系列”); //使用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我们想要读取文件inAudioFileName。
然后while语句循环,直到SoundFileSource用完数据。在里面 循环,我们获取网络已处理的数据并输出(0,0)元素,即 基频估计。
当您使用Marsyas的Python绑定时,这会更容易。
这个 指南 应该有所帮助不要将ALSA用于您的应用程序。使用更高级别的API。如果你决定使用JACK, http://jackaudio.org/applications 有三个仪器调谐器,您可以使用它们作为示例代码。
http://clam-project.org/ CLAM是一个完整的软件框架,用于音频和音乐领域的研究和应用程序开发。它提供了概念模型以及用于分析,合成和处理音频信号的工具。
他们有一个很棒的API,漂亮的GUI和一些完成的应用程序,你可以看到一切。
由于内核驱动程序包含在内核中并且OSS被折旧,因此ALSA现在是linux的默认标准。但是,有ALSA用户空间的替代品,如 插口,这似乎是针对低延迟专业类型的应用程序。它的API似乎有一个更好的API,虽然我没有使用它,我对ALSA API的简短介绍会让我觉得几乎任何东西都会更好。
大胆 包括频率绘图功能,并具有内置FFT滤波器。