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

2023-12-11

我每天通过互联网录制 2 分钟的广播。总是有相同的开始和结束歌曲。由于广播的确切时间可能会有所不同,或多或少有 6 分钟,因此我必须录制大约 15 分钟的广播。

我希望确定这些歌曲在 15 分钟记录中出现的确切时间,这样我就可以提取我想要的音频部分。

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

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

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

Thanks,

更新,抱歉延迟了

首先,感谢所有答案,其中大多数都是相关和/或有趣的想法。

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

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

我可以采用该解决方案,但如果可能的话,我更喜欢 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。

感谢您的帮助。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐