我想知道推荐使用的音频库是什么?
我正在尝试制作一个有助于调整乐器的小程序。(钢琴、吉他等)。我读过 ALSA 和 Marsyas 音频库。
我在想这个想法是从麦克风中采样数据,对 5-10 毫秒的块进行分析(根据我的阅读)。然后执行 FFT 以确定哪个频率包含最大峰值。
我想知道推荐使用的音频库是什么?
我正在尝试制作一个有助于调整乐器的小程序。(钢琴、吉他等)。我读过 ALSA 和 Marsyas 音频库。
我在想这个想法是从麦克风中采样数据,对 5-10 毫秒的块进行分析(根据我的阅读)。然后执行 FFT 以确定哪个频率包含最大峰值。
本指南应该有所帮助。不要将 ALSA 用于您的应用程序。使用更高级别的 API。如果您决定要使用 JACK,http://jackaudio.org/applications提供了三个乐器调音器,您可以将其用作示例代码。
Marsyas 将是执行此操作的绝佳选择,它专为此类任务而设计。
要为乐器调音,您需要做的是有一个算法来估计声音的基频 (F0)。有许多算法可以做到这一点,最新最好的算法之一是由 Alain de Cheveigne 开发的 YIN 算法。我最近在 Marsyas 中添加了 YIN 算法,使用起来非常简单。
这是您将在 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/filename",inAudioFileName); while (net->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>()) { 净->滴答(); realvec r = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); cout << r(0,0) << endl; }
此代码首先创建一个 Series 对象,我们将向其添加组件。在一个系列中,每个组件都以串行方式接收前一个 MarSystem 的输出。然后我们添加一个 SoundFileSource,您可以将 .wav 或 .mp3 文件输入其中。然后我们添加输出重叠音频块的 ShiftInput 对象,然后将其馈入 AubioYin 对象,该对象估计该音频块的基频。
然后我们告诉 SoundFileSource 我们要读取音频文件名中的文件。
然后 while 语句循环,直到 SoundFileSource 用完数据。在 while 循环中,我们获取网络已处理的数据并输出 (0,0) 元素,即基频估计值。
当您使用 Marsyas 的 Python 绑定时,这会更容易。
http://clam-project.org/ CLAM 是一个成熟的软件框架,用于音频和音乐领域的研究和应用程序开发。它提供了一个概念模型以及用于分析、合成和处理音频信号的工具。
他们有一个很棒的 API、漂亮的 GUI 和一些完成的应用程序,您可以在其中看到所有内容。
ALSA 现在是 linux 的默认标准,因为内核驱动程序包含在内核中并且 OSS 被贬值。然而,ALSA 用户空间还有其他选择,例如jack,它似乎针对低延迟的专业类型应用程序。它的 API 似乎有一个更好的 API,虽然我没有使用过它,但我对 ALSA API 的短暂接触会让我觉得几乎任何东西都会更好。
Audacity包括频率图功能并具有内置的 FFT 滤波器。