2011-04-13 55 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

相关问题