比较两个频谱图以找到它们匹配算法的偏移量

我每天录制2分钟的互联网广播。总是有

相同的开始和结束叮当声。由于广播的确切时间可能会有所不同

,大约需要6分钟,因此我必须录制大约15分钟的广播。

我希望确定15分钟

录音中这些杂音的确切时间,以便提取所需的音频部分。

我已经启动了一个C#应用程序,在其中我将MP3解码为PCM数据并将PCM数据

转换为基于http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx的声谱图

我尝试对PCM数据使用互相关算法,但是该算法

在6分钟左右的时间中非常慢,步长为10ms,并且在某些情况下无法

找到铃声开始时间。

对两个频谱图进行匹配比较的算法有什么想法吗?还是

找到铃声开始时间的更好方法?

谢谢,

更新,抱歉,延迟

首先,感谢所有的答案,其中大多数都是

无关紧要的想法。

我尝试实现fonzo提出的Shazam算法。但是未能

检测到光谱图中的峰。这是

来自三个不同记录的起始铃声的三个频谱图。我尝试使用带有斑点滤镜的AForge.NET

(但未能识别峰值),模糊图像并检查

高度差,拉普拉斯卷积,斜率分析以检测一系列

竖线(但错误太多)正)…

同时,我尝试了Dave Aaron Smith提出的Hough算法。

我在哪里计算每列的RMS。是是每一列都是O(N * M),

但M << N(注意,一列大约是8k的样本)。因此,总体来说

还算不错,算法仍然需要3分钟左右的时间,但绝不会失败。

我可以采用该解决方案,但如果可能的话,我希望使用Shazam,

因为它的O(N)可能更快(并且也更凉爽)。大家

都想出一种算法,可以始终检测那些

频谱图中的相同点(不必是峰值),这要感谢添加注释。

新更新

最后,我继续使用上面解释的算法,尝试实现

Shazam算法,但未能在声谱图中找到合适的峰,即

从一个声音文件到另一个声音文件的不恒定点。从

理论上讲,Shazam算法是解决此类问题的方法。

Dave Aaron Smith提出的Hough算法更稳定,更有效。我

拆分了大约400个文件,但其中只有20个未能正确拆分。

从8GB到1GB的磁盘空间。

谢谢你的帮助。

回答:

我想知道您是否可以使用霍夫变换。您将从分类打开序列的每个步骤开始。假设您使用10毫秒的步长,打开序列的长度为50毫秒。您在每个步骤上计算一些指标并获得

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,则对2步前的开幕序列有1票,对于4步前有17票,

依此类推。

因此,对于该示例have_audio,您votes将看起来像

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

您在第6位有很多票,因此很有可能在此开始开局。

您可以不必费心分析整个打开顺序来提高性能。如果打开序列的时间为10秒,则可以搜索前5秒。

以上是 比较两个频谱图以找到它们匹配算法的偏移量 的全部内容, 来源链接: utcz.com/qa/422898.html

回到顶部