从实时audioinput每分钟节拍
我想编写一个简单的C#应用程序来监视线路inputaudio,并给我当前(好,滚动平均)每分钟的节拍。
我见过这个gamedev文章 ,这是绝对没有帮助。 我经历了,试图实现他在做什么,但它只是不工作。
我知道必须有大量的解决scheme,因为很多DJ软件都是这样做的,但是我找不到任何开源库或者自己做的说明。
用滑动窗口计算功率谱FFT:取1024个样本:
double[] signal = stream.Take(1024);
将其馈送到FFTalgorithm:
double[] real = new double[signal.Length]; double[] imag = new double[signal.Length); FFT(signal, out real, out imag);
你会得到一个真实的部分和一个想象的部分。 不要扔掉虚部。 对想像中的实体做同样的事情。 虽然真实的部分是真实的π/ 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个采样的功率谱。 频谱的第一部分是低频部分,而频谱的最后部分是高频部分。
如果你想在stream行音乐中findBPM,你应该把重点放在低音上。 您可以通过将功率谱的下半部分相加来拾取低音强度。 使用哪个数字取决于采样频率:
double bassIntensity = 0; for (i=8; i < 96; i++) bassIntensity += real[i];
现在再次做同样的事情,但移动窗口256个样本,然后再计算一个新的光谱。 现在,您将计算每256个采样的低音强度。
这是您的BPM分析的一个很好的input。 当低音安静时,你没有节拍,当它很响时,你有节拍。
祝你好运!
有一个叫Dancing Monkeys的优秀项目,它可以通过程序从音乐中产生DDR舞步。 它所做的大部分工作是基于(必然非常准确的)节拍分析,他们的项目文件详细描述了各种节拍检测algorithm及其对任务的适用性。 它们包括对每个algorithm的原始论文的参考。 他们还发布了解决scheme的matlab代码。 我相信你们之间可以find你需要的东西。
这一切都可在这里: http : //monket.net/dancing-monkeys-v2/Main_Page
我不知道如何实现这一点,但从audio工程的angular度来看,你需要先过滤。 低音鼓点击将是第一个检查。 一个低通滤波器可以给你大约200Hz以下的任何东西,给你一个非常清晰的低音鼓图像。 门也可能是必要的,以清除其他谐波低的仪器杂波。
旁边的检查将是网罗的命中。 你必须EQ这个。 从圈套的“裂缝”是从记忆1.5KHZ左右,但你需要明确的闸门这一个。
接下来的挑战将是制定一个时髦的节拍algorithm。 你将如何编程find节拍1? 我想你会跟踪以前的节拍,并使用匹配的东西或其他模式。 所以,你可能需要几个酒吧才能准确find节拍。 然后是像4/4,3/4,6/8这样的计时问题,哇,我无法想象准确地做到这一点会需要什么! 我相信这对audio硬件/软件公司来说是值得的。
这绝不是一个简单的问题。 我会尽力只给你一个概述。
你可以做的是如下所示:
- 计算例如5毫秒的信号的平均(均方根)响度。 (从来没有做过这个,我不知道什么是一个好的块大小。)
- 采用FFTalgorithm对“阻塞”信号进行傅里叶变换。
- 在变换后的信号中find具有最大幅值的分量。
傅里叶变换基本上是一种计算信号中所有频率的强度的方法。 如果你通过“阻止”信号做到这一点,节拍的频率将是最强的。
也许您需要首先应用滤波器,以专注于特定频率(如低音),这些频率通常包含有关BPM的大部分信息。
我发现这个库似乎有一个非常坚实的实施检测节拍每分钟 。 http://soundtouchdotnet.codeplex.com/
它基于http://www.surina.net/soundtouch/index.html ,在很多DJ项目中使用http://www.surina.net/soundtouch/applications.html
首先,Hallgrim所生产的不是功率谱密度函数。 任何信号中的统计周期可以通过自相关函数提取出来。 自相关信号的傅立叶变换是功率谱密度。 PSD中除0Hz外的主要峰值将对应于信号中的有效周期(以Hz为单位)…
最简单的方法就是让用户用节拍敲击一个节奏的button,然后计算分频次数除以时间。
我build议检查低音audio库和BASS.NET包装。 它有一个内置的BPMCounter类。
有关此特定function的详细信息,请访问http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm 。