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