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

如何解决比较两个频谱图以找到与算法匹配的偏移量

| 我每天录制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的磁盘空间。 谢谢你的帮助。     

解决方法

我想知道您是否可以使用霍夫变换。您将从分类打开序列的每个步骤开始。假设您使用10毫秒的步长,打开序列的长度为50毫秒。您在每个步骤上计算一些指标并获得
1 10 1 17 5
现在,遍历您的音频,并分析每个10毫秒的步长以获取相同的指标。将此数组称为“1ѭ”
8 10 8 7 5 1 10 1 17 6 2 10...
现在创建一个新的空数组,其长度与length1ѭ相同。称呼
start_votes
。开头序列的开头将包含\“ votes \”。如果看到1,则可能处于开始顺序的第1步或第3步,因此您对1步之前的开始顺序有1票,对3步开始的开始顺序有1票。如果看到10,则对2步前开始的开幕序列有1票,对于4步前是17票,依此类推。 因此,对于example1ѭ,您的
votes
看起来像
2 0 0 1 0 4 0 0 0 0 0 1 ...
您在第6位有很多票,因此很有可能在此开始开局。 您可以不花时间分析整个打开顺序来提高性能。如果打开顺序是10秒长,则可以搜索前5秒。     ,此处介绍了shazam服务使用的算法(该算法可识别出可能带有短噪音的样本中的音乐):http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf 据我了解,首先要做的是隔离频谱图中的峰值(进行一些调整以确保均匀的覆盖范围),这将从初始频谱图中得出一对“时间” /“频率”的“星座图”。一旦完成,通过从开始到结束平移样本长度的窗口并计算相关点的数量,将样本星座图与完整轨道的星座图进行比较。 然后,本文介绍了他们发现即使有大量音轨也能够快速进行比较的技术解决方案。     ,这是一个很好的python软件包,它可以做到这一点: https://code.google.com/p/py-astm/ 如果您正在寻找一种特定的算法,则可以使用的良好搜索词是“声学指纹”或“感知哈希”。 这是另一个也可以使用的python软件包: http://rudd-o.com/new-projects/python-audioprocessing/documentation/manuals/algorithms/butterscotch-signatures     ,如果您已经知道叮当声序列,则可以分析与序列的相关性,而不是分析完整15分钟音轨之间的互相关性。 为了快速计算(短)序列的相关性,我建议使用维纳滤波器。 编辑:维纳滤波器是一种在噪声序列中定位信号的方法。在此应用程序中,我们正在考虑将“非叮当声”作为噪声(读者的问题:我们是否仍可以假设噪声为白色且不相关?)。 (我找到了所需的参考!我记得的公式有些偏离,我现在将其删除) 相关页面是维纳反卷积。这个想法是,我们可以定义一个系统,该系统的脉冲响应
h(t)
具有与叮当相同的波形,并且我们必须以嘈杂的顺序定位系统已接收到脉冲的点(即:发出了叮当声)。 既然知道了叮当声,我们就可以计算出它的功率谱
H(f)
,并且我们可以假设单个叮当声出现在记录的序列中,我们可以说未知输入input10ѭ具有脉冲形状,其功率密度
S(f)
是恒定的。在每个频率。 根据上述知识,您可以使用该公式获得一个“叮当声通过”滤波器(例如,只有形状像叮当声的信号可以通过),当播放叮当声时其输出最高。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-