比较两个频谱图以找到与算法匹配的偏移量
|
我每天录制2分钟的互联网广播。总是有相同的开始和结束叮当声。由于广播的确切时间可能会有所不同,大约需要6分钟,因此我必须录制大约15分钟的广播。
我希望确定15分钟录音中这些杂音的确切时间,以便提取所需的音频部分。
我已经启动了一个C#应用程序,在该程序中,我基于http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx将MP3解码为PCM数据,并将PCM数据转换为频谱图。
我尝试对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的磁盘空间。
谢谢你的帮助。
没有找到相关结果
已邀请:
4 个回复
剑哎
现在,遍历您的音频,并分析每个10毫秒的步长以获取相同的指标。将此数组称为“1ѭ”
现在创建一个新的空数组,其长度与length1ѭ相同。称呼
。开头序列的开头将包含\“ votes \”。如果看到1,则可能处于开始顺序的第1步或第3步,因此您对1步之前的开始顺序有1票,对3步开始的开始顺序有1票。如果看到10,则对2步前开始的开幕序列有1票,对于4步前是17票,依此类推。 因此,对于example1ѭ,您的
看起来像
您在第6位有很多票,因此很有可能在此开始开局。 您可以不花时间分析整个打开顺序来提高性能。如果打开顺序是10秒长,则可以搜索前5秒。
藐刚
抹持奠糙驰
掏得透垦滩
具有与叮当相同的波形,并且我们必须以嘈杂的顺序定位系统已接收到脉冲的点(即:发出了叮当声)。 既然知道了叮当声,我们就可以计算出它的功率谱
,并且我们可以假设单个叮当声出现在记录的序列中,我们可以说未知输入input10ѭ具有脉冲形状,其功率密度
是恒定的。在每个频率。 根据上述知识,您可以使用该公式获得一个“叮当声通过”滤波器(例如,只有形状像叮当声的信号可以通过),当播放叮当声时其输出最高。