2010-05-06 142 views
7

获取波形或MP3的BPM我有一个项目,需要使用.Net(VB.Net或C#)以编程方式获取波形或MP3文件的BPM。以编程方式从.Net

有没有人知道一个二进制或库的这个或有一个代码片段引导我在正确的方向吗?

+0

这不是.net特有的,但是这个问题上有很多有用的信息和推荐算法:[如何检测bpm-of-the-by-programming](http://stackoverflow.com/问题/ 657073/how-to-detect-bpm-of-the-by-programming) – 2010-05-06 15:37:26

+0

@BS:这非常简单:您只需执行FFT(快速傅里叶变换)并分析转换后的数据(一个简单的搜索在一个数组中,寻找最大值)。我用约40行代码编写了我自己的Java中的FFT(很久以前不记得它是什么,但它很短)。这类似于通过分析汽车的噪音(例如,一种公式的汽车[但在汽车发动机的情况下,您需要知道汽车有多少个汽缸])来查找发动机在哪个RPM上转动。在那里,做到了这一点,无论是在上个世纪用Java来确定.wav BPM和汽车发动机RPMs;) – SyntaxT3rr0r 2010-05-07 14:01:25

回答

2

对于从.NET代码中获取WAV或MP3样本的部分,我使用NAudio(在CodePlex上),免费,可用于商业应用程序,没有真实文档,只是示例代码。

2

首先,如果你想用.Net做声音,我会推荐fmod,它很棒,并且有一个.Net包装器(http://www.fmod.org)。
接下来,要获得BPM,有几种方法,但我发现最有效的方法是“拍频谱”(在此描述:http://www.rotorbrain.com/foote/papers/icme2001/icmehtml.htm)。
该算法通过比较音乐的每个短样本与其他所有音素来计算相似度矩阵。一旦计算出相似性矩阵,就有可能得到每个时间间隔T的每个样本对{S(T); S(T + 1)}之间的平均相似性:这是拍频谱。拍频谱中的第一个高峰大部分时间是拍子持续时间。最好的部分是你也可以做音乐结构或节奏分析。
如果您对该领域感兴趣,我会建议阅读其他Jonathan Foote论文。