2011-04-13 59 views
4

我從互聯網記錄每天2分鐘的無線電廣播。始終有相同的開始和結束叮噹聲。由於無線電廣播的確切時間可能會有所不同,從大約6分鐘,我必須記錄大約15分鐘的廣播。比較兩個譜圖以找到它們匹配的偏移量算法

我想確定那些鈴聲在15分鐘記錄中的確切時間,所以我可以提取我想要的音頻部分。

我已經開始了一個C#應用程序,我解碼的MP3爲PCM數據和PCM數據轉換成基於http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

頻譜我試圖對PCM數據使用的互相關算法,但該算法是非常步行10分鐘左右慢6分鐘左右,有時無法找到鈴聲的開始時間。

算法的任何想法來比較兩個匹配的譜圖?或者更好的方式來找到鈴兒的開始時間?

感謝,

更新,抱歉耽擱

首先,感謝所有anwsers其中大多數是培訓相關和或interresting想法。

我試圖實現fonzo提出的Shazam算法。但未能檢測到譜圖中的峯。這是來自三個不同記錄的起始叮鈴聲的三個光譜圖。我嘗試使用blob過濾器AForge.NET(但它未能識別峯值),模糊圖像並檢查高度差異,拉普拉斯卷積,斜率分析以檢測一系列垂直條(但錯誤太多正面)...

在這個意思中,我嘗試了Dave Aaron Smith提出的Hough算法。我在哪裏計算每列的RMS。是是是每列,它是一個O(N * M),但是M(注意一列是大約8k的樣本)。所以總的來說這並不是那麼糟糕,算法仍然需要大約3分鐘,但從未失敗。

我可以用這個解決方案,但如果可能的話,我更喜歡Shazam,因爲它是O(N)並且可能更快(也更酷)。所以你們有沒有想法算法總是檢測這些譜圖中的相同點(不一定是峯值),這要歸功於添加評論。

FFT Start Jingle 1

FFT Start Jingle 2

FFT Start Jingle 3

新更新

最後,我的算法上面解釋去了,我試圖實現Shazam的算法,但未能找到合適的譜圖中的峯值,從一個聲音文件到另一個聲音文件不是恆定的已識別點。理論上,Shazam算法是解決這類問題的方法。 Dave Aaron Smith提出的Hough算法更加穩定和有效。我分割了大約400個文件,只有20個文件無法正確分割。磁盤空間從8GB到1GB。

謝謝你的幫助。

回答

2

我不知道你是否可以使用Hough transform。你可以從開始序列的每一步開始。假設您使用10 ms步長,並且打開序列長度爲50 ms。你計算每一步的一些指標,並得到

1 10 1 17 5 

現在通過你的聲音和分析同一指標每10毫秒一步。調用此陣have_audio

8 10 8 7 5 1 10 1 17 6 2 10... 

現在創建一個新的空數組的長度一樣have_audio。稱它爲start_votes。它將包含開始序列開始的「投票」。如果您看到1,您可能會處於開幕式序列的第1或第3步,因此您從1步前開始1次投票,3次前1次開始投票。如果你看到一個10,你有兩個步驟開始前1次投票,4步前17次投票,依此類推。

所以對於例如have_audio,您votes會像

2 0 0 1 0 4 0 0 0 0 0 1 ... 

你必須在6位了不少選票,所以有開幕序列開始有一個很好的機會。

您可以通過不打擾地分析整個打開序列來提高性能。如果打開序列長度爲10秒,則可以搜索前5秒。

+2

嗨,謝謝你的迴應,今天我學到了一些東西。但我真的不知道用什麼指標來表示一部分信號。譜圖是一個數組,我可以針對不同頻率(如100)運行此算法,並對每個部分的投票進行總結。但是我想知道這個表現。 – 2011-04-13 18:23:54

+0

是的,霍夫變換用於計算機視覺,我不太瞭解音頻信號處理。對於度量標準,這是一個聰明的想法來衡量特定的頻率。 – 2011-04-15 13:18:39

1

如果您已經知道了鈴聲序列,您可以分析與序列的相關性,而不是整個15分鐘曲目之間的互相關。

要快速計算與(短)序列的相關性,我建議使用Wiener filter

編輯:維納濾波器是一種用噪聲序列定位信號的方法。在這個應用程序中,我們正在考慮任何不是「噪音」的噪音(對於讀者的問題:我們是否仍然可以假設噪音是白色的並且不相關?)。

我發現我一直在尋找的參考!我記住的公式是有點過,現在​​我會刪除)

相關頁面是Wiener deconvolution。我們的想法是,我們可以定義一個系統,其脈衝響應與叮噹聲具有相同的波形,並且我們必須在系統接收到脈衝(即:發射脈衝)的嘈雜序列中定位該點。由於叮噹聲是已知的,所以我們可以計算其功率譜H(f),並且由於我們可以假設單個叮噹聲出現在記錄的序列中,所以我們可以說未知輸入x(t)具有脈衝形狀,其功率密度S(f)在每個頻率處都是恆定的。

考慮到上面的知識,可以使用該公式來獲得播放叮噹音時其輸出最高的「單向通過」濾波器(因爲只有信號形狀像鈴聲可以通過)。

+0

嗨,謝謝你的回覆。我不確定我是否理解了我目前在完整的15分鐘曲目和10秒鐘鈴聲之間的關係。對不起,我不清楚。此外,維納濾波器似乎是一個濾除噪聲的濾波器,您是否認爲有時相關失敗的原因是由於噪聲?謝謝 – 2011-04-13 17:40:38

+0

一旦你有叮噹聲序列,你可以在10秒內分解完整的剪輯短片,並檢查叮噹聲和每個剪輯的互相關。最相關的剪輯是帶有叮噹聲的剪輯(問題:如果叮噹聲在兩個剪輯之間分開,會發生什麼?)。 – 2011-04-13 19:23:03

+0

注意:答案中的解釋與我在 – 2011-04-13 19:42:48

2

這裏是一個很好的Python包,不只是這一點:

https://code.google.com/p/py-astm/

如果你正在尋找一個特定的算法,使用良好的搜索詞是「accoustic指紋」或「感性散列」。

這裏還有一個Python包,也可用於:

http://rudd-o.com/new-projects/python-audioprocessing/documentation/manuals/algorithms/butterscotch-signatures

+0

嗨,謝謝你的回答。我檢查了py-astm的代碼,它似乎在引擎蓋下使用了交叉關聯,並且從作者的評論中看來,該算法很慢。對於另一種選擇,這很有趣。我仍在研究算法,我會爲該選項添加另一條評論。謝謝。 – 2011-04-13 20:21:53

4

有由Shazam的服務(其識別接受一個短期可能嘈雜的樣品音樂)所使用的算法的描述在這裏:http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf
根據我的理解,首先要做的是隔離譜圖中的峯值(通過一些調整來確保統一的覆蓋範圍),從初始譜圖中給出一對值(時間,頻率)的「星座」。一旦完成,將樣本星座圖與完整軌道的星座圖進行比較,方法是將樣本長度從開始到結束的窗口平移並計算相關點的數量。
然後本文描述了他們發現的技術解決方案,即使對於大量軌道也能夠快速進行比較。

+0

嗨,謝謝你的回答,我只是看了報紙。這個算法似乎完全符合我的需要,我會在測試後再添加一條評論。謝謝。 – 2011-04-14 14:06:46

相關問題