当前位置:  开发笔记 > 编程语言 > 正文

实时音频输入的每分钟节拍数

如何解决《实时音频输入的每分钟节拍数》经验,为你挑选了5个好方法。

我想编写一个简单的C#应用​​程序来监听线路输入音频并给出每分钟的当前(好的,滚动平均)节拍.

我看过这个gamedev文章,这绝对没有帮助.我经历过并试图实现他正在做的事情,但它只是没有用.

我知道必须有很多解决方案,因为很多DJ软件都能做到这一点,但是我找不到任何开源库或者自己做的指示也没有任何好运.



1> Hallgrim..:

用滑动窗口计算功率谱FFT:取1024个样本:

double[] signal = stream.Take(1024);

将其输入FFT算法:

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

你会得到一个真实的部分和一个想象的部分.不要扔掉想象中的部分.对想象中的实际部分做同样的事情.虽然假想部分与真实部分是pi/2异相,但它仍然包含50%的频谱信息.

编辑:

计算功率而不是振幅,这样当声音很大时你会有一个很高的数字,而当它很安静时它会接近零:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

同样对于虚部.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

现在,您有最后1024个样本的功率谱.频谱的第一部分是低频,频谱的最后部分是高频.

如果你想在流行音乐中找到BPM,你应该专注于低音.您可以通过对功率谱的下半部分求和来获得低音强度.使用哪些数字取决于采样频率:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

现在再次执行相同操作,但在计算新光谱之前将窗口移动256个样本.现在,您最终计算出每256个样本的bassIntensity.

这是您的BPM分析的一个很好的输入.当低音安静时你没有节拍,当它很响时你就会有节拍.

祝好运!


不要丢掉想象的组件,它不仅仅是阶段!这个阶段由arctan(imag/real)给出,这对于这个问题是无用的.重要的部分,幅度,由真实的^ 2 + imag ^ 2给出,而不仅仅是真实的^ 2.
Sacha只是缩放单位的问题.在计算BPM之前,您不需要分析一分钟的样本.BPM只是一种传达信号周期的音乐方式.

2> Nick Johnson..:

有一个名为Dancing Monkeys的出色项目,它可以从音乐中逐步产生DDR舞步.它所做的大部分工作都基于(必然是非常准确的)节拍分析,他们的项目文章详细描述了各种节拍检测算法及其对任务的适用性.它们包括对每种算法的原始论文的引用.他们还为他们的解决方案发布了matlab代码.我相信你可以找到你需要的东西.

它可以在这里找到:http://monket.net/dancing-monkeys-v2/Main_Page



3> Dan Harper..:

不是我知道如何实现这一点,但从音频工程的角度来看,你需要先过滤.低音鼓点击将是第一个检查.低通滤波器可以为您提供低于200Hz的任何信号,可以为您提供非常清晰的低音鼓图像.也可能需要一个门来清除其他仪器的杂波,其谐波很低.

接下来检查将是网罗点击.你必须得到这个EQ.来自陷阱的"裂缝"距离记忆大约1.5kHz,但你需要明确控制这个.

接下来的挑战是制定一个时髦的节拍算法.你会如何以编程方式找到1?我想你会跟踪以前的节拍,并使用匹配某些东西或其他东西的模式.所以,你可能需要几个小节才能准确找到节拍.然后是时间问题,如4/4,3/4,6/8,哇,我无法想象准确地做到这一点需要什么!我相信音频硬件/软件公司值得花一些钱.



4> Thomas..:

这绝不是一个容易的问题.我会尽量给你一个概述.

你能做的是如下:

    计算信号的平均(均方根)响度,例如5毫秒.(之前从未这样做过,我不知道块大小会是多少.)

    使用FFT算法对"阻塞"信号进行傅里叶变换.

    在变换后的信号中找到具有最大幅度的分量.

傅里叶变换基本上是计算信号中存在的所有频率的强度的方式.如果你对"阻塞"信号这样做,那么节拍的频率有望成为最强的.

也许您需要首先应用过滤器,以专注于通常包含有关BPM的最多信息的特定频率(如低音).



5> eandersson..:

我发现这个库似乎有一个非常可靠的实现,用于检测每分钟节拍. http://soundtouchdotnet.codeplex.com/

它基于http://www.surina.net/soundtouch/index.html,用于相当多的DJ项目http://www.surina.net/soundtouch/applications.html

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有