Linux中的实时音频分析

MAc*_*man 11 linux audio signal-processing real-time alsa

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

我正在尝试制作一个有助于调整乐器的小程序.(钢琴,吉他等).我读过有关ALSA和Marsyas音频库的文章.

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

joe*_*ker 5

指南应该有所帮助.不要将ALSA用于您的应用程序.使用更高级别的API.如果您决定使用JACK,http://jackaudio.org/applications有三个乐器调音器,您可以将其用作示例代码.


小智 4

Marsyas 将是执行此操作的绝佳选择,它正是为此类任务而构建的。

为了调音乐器,您需要做的是有一个算法来估计声音的基频 (F0)。有多种算法可以做到这一点,最新、最好的算法之一是由 Alain de Cheveigne 开发的 YIN 算法。我最近将 YIN 算法添加到 Marsyas,并且使用它非常简单。

以下是您在 Marsyas 中使用的基本代码:

  三月系统管理器 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 我们想要读取 AudioFileName 中的文件。

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

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