【问题标题】:Compare two spectogram to find the offset where they match algorithm比较两个频谱图以找到它们匹配算法的偏移量
【发布时间】:2011-04-13 15:26:18
【问题描述】:

我每天录制来自互联网的 2 分钟广播。总是有相同的开始和结束的叮当声。由于广播的确切时间可能在 6 分钟左右不等,因此我必须录制大约 15 分钟的广播。

我希望确定这些叮当声在 15 分钟记录中的确切时间,以便我可以提取我想要的音频部分。

我已经启动了一个 C# 应用程序,我将 MP3 解码为 PCM 数据,并将 PCM 数据转换为基于 http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx 的频谱图

我尝试对 PCM 数据使用互相关算法,但该算法非常慢,大约 6 分钟,步长为 10 毫秒,有时它无法找到叮当声的开始时间。

有什么算法可以比较两个频谱图进行匹配吗?还是找到叮当声开始时间的更好方法?

谢谢,

更新,抱歉耽搁了

首先,感谢所有回答者,他们中的大多数都是相关或有趣的想法。

我尝试实现 fonzo 提出的 Shazam 算法。但未能检测到频谱图中的峰值。这是来自三个不同记录的起始铃声的三个频谱图。我尝试了 AForge.NET 与 blob 过滤器(但它无法识别峰值),模糊图像并检查高度差异,拉普拉斯卷积,斜率分析,检测一系列垂直条(但有太多错误正)...

同时,我尝试了 Dave Aaron Smith 提出的 Hough 算法。我在哪里计算每列的 RMS。是的,是每一列,它是 O(N*M) 但 M

我可以采用那个解决方案,但如果可能的话,我更喜欢 Shazam,因为它是 O(N) 并且可能更快(也更酷)。多亏了添加评论

新更新

最后,我采用了上面解释的算法,我尝试实现 Shazam 算法,但未能在频谱图中找到适当的峰值,即从一个声音文件到另一个声音文件的识别点不是恒定的。理论上,Shazam 算法是这类问题的解决方案。 Dave Aaron Smith 提出的 Hough 算法更加稳定有效。我拆分了大约 400 个文件,其中只有 20 个无法正确拆分。磁盘空间从 8GB 到 1GB。

谢谢你的帮助。

【问题讨论】:

    标签: c# algorithm audio comparison spectrogram


    【解决方案1】:

    这里有一个关于 shazam 服务使用的算法的描述(它可以识别给定一个简短的可能嘈杂的样本的音乐):http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf
    据我了解,首先要做的是隔离频谱图中的峰值(进行一些调整以确保均匀覆盖),这将从初始频谱图中给出一对值(时间;频率)的“星座”。完成后,通过将样本长度的窗口从头到尾平移并计算相关点的数量,将样本星座与完整轨道的星座进行比较。
    然后,该论文描述了他们发现的技术解决方案,即使在大量曲目的情况下也能够快速进行比较。

    【讨论】:

      【解决方案2】:

      我想知道您是否可以使用Hough transform。您将从对开场序列的每个步骤进行编目开始。假设您使用 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 位有很多选票,所以开场顺序很有可能从第 6 位开始。

      您可以通过不费心分析整个开场序列来提高性能。如果开场序列是 10 秒长,您可以只搜索前 5 秒。

      【讨论】:

      • 您好,感谢您的回复,我今天学到了一些东西。但我真的不知道可以使用什么指标来表示信号的一部分。频谱图是一个数组,我可以针对不同的频率(例如 100)运行该算法,并对每个部分的投票求和。但是我想知道性能。
      • 是的,霍夫变换用于计算机视觉,我对音频信号处理了解不多。这是一个聪明的主意,虽然可以测量特定的频率。
      【解决方案3】:

      这是一个很好的 python 包,它可以做到这一点:

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

      如果您正在寻找特定的算法,可以使用“声学指纹”或“感知散列”这样的搜索词。

      这是另一个也可以使用的 python 包:

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

      【讨论】:

        【解决方案4】:

        如果您已经知道叮当声序列,则可以分析与序列的相关性,而不是整个 15 分钟曲目之间的互相关性。

        为了快速计算与(短)序列的相关性,我建议使用Wiener filter

        编辑:维纳滤波器是一种在有噪声的序列中定位信号的方法。在这个应用程序中,我们将任何“不叮当”的东西都视为噪声(读者的问题:我们仍然可以假设噪声是白色的并且不相关吗?)。

        (我找到了我要找的参考资料!我记得的公式有点不对劲,我现在就删除它们)

        相关页面为Wiener deconvolution。我们的想法是,我们可以定义一个系统,其脉冲响应h(t) 具有与叮当声相同的波形,并且我们必须在噪声序列中定位系统接收到脉冲(即:发出叮当声)的点。

        既然知道叮当声,我们可以计算它的功率谱H(f),并且由于我们可以假设在记录的序列中出现了单个叮当声,我们可以说未知输入x(t)具有脉冲形状,其功率密度S(f)在每个频率下都是恒定的。

        根据上面的知识,您可以使用公式获得一个“Jingle-pass”过滤器(即只有形状像铃铛的信号才能通过),它在播放铃铛时输出最高。

        【讨论】:

        • 您好,感谢您的回复。我不确定我是否理解我目前在完整的 15 分钟曲目和 10 秒叮当声之间关联的第一部分。对不起,我不清楚。此外,维纳滤波器似乎是一种去除噪声的滤波器,您是否认为有时相关失败的原因是因为噪声?谢谢
        • 一旦你有了叮当声序列,你可以将整个剪辑分割成 10 秒较短的剪辑,并检查叮当声和每个剪辑的互相关性。最相关的剪辑是带有叮当声的剪辑(问题:如果叮当声被分成两个剪辑会发生什么?)。
        • 注意:答案中的解释与我在评论中建议的方法不同
        • 谢谢。实际上我目前正在这样做,但步骤是 10 毫秒而不是 10 秒,剪辑长度为 10 秒,因此它们重叠。然而,有时算法无法返回好的答案。我仍然会尝试你的建议,也许我可以得到 n 个最好的较短剪辑,并以更小的步骤重新执行算法。谢谢。
        • 如果您有时间,也可以尝试构建 jingle-pass 滤波器:作为线性滤波器,它不应该造成效率问题。
        猜你喜欢
        • 2019-12-26
        • 2013-03-14
        • 2018-05-14
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多