MAc*_*man 11 linux audio signal-processing real-time alsa
我想知道推荐使用的音频库是什么?
我正在尝试制作一个有助于调整乐器的小程序.(钢琴,吉他等).我读过有关ALSA和Marsyas音频库的文章.
我想这个想法是从麦克风中采样数据,对5-10ms的块进行分析(从我读过的内容).然后执行FFT以确定哪个频率包含最大峰值.
本指南应该有所帮助.不要将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 绑定时,这会更加容易。
| 归档时间: |
|
| 查看次数: |
11233 次 |
| 最近记录: |