2010-05-06 117 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論文。