在知网上搜索了Shazam算法,但是参考资料真是少之又少,而且感觉讲得并不是很明白,于是找到了一篇外国人写的博客,大致整理了一下其中核心的算法思想部分。

首先 附参考英文博客

其次,开始讲解

(1)对于音乐文件加滑动窗,切分数据块。滑动窗口只对一块原始信号进行傅里叶变换。数据块的大小可以通过多种方式确定。例如,我们录制了一段音乐,双声道,16-bit精度,44100Hz采样。这时1s的数据大小为441002byte2声道≈176kB。如果选择4kB当作数据块大小,则每秒钟我们需要对44块数据进行傅里叶变换。这样的切分密度足以应对大多数需求。

(2)对于每一个数据块做快速傅里叶变换。当我们对每一帧音频信号进行傅里叶变换之后,就可以开始构造音频指纹了,这是shazam整个系统中最核心的部分。构造指纹最大的挑战在于怎样从众多频率中选出区分度最大的来。直观上来说,选择具有最大幅值的频率(峰值)较为靠谱。

(3)划分频谱带,取每一频谱带中的峰值信号作为该频谱带的签名,以此来构造每一帧的指纹。幅值较大的频率跨度可能很广,从低音C(32.70Hz)到高音C(4186.01Hz)都可能出现。为了避免分析整个频谱,我们通常将频谱分成多个子带,从每个子带中选择一个频率峰值。选择如下几个子带:低音子带为30 Hz - 40 Hz, 40 Hz - 80 Hz 和80 Hz - 120 Hz (贝司吉他等乐器的基频会出现低音子带),中音和高音子带分别为120 Hz - 180 Hz 和180 Hz - 300Hz(人声和大部分其他乐器的基频出现在这两个子带)。每个子带的最大频率就构成了这一帧信号的签名,而这个签名又是整首歌指纹的一部分。

(4)将音频指纹作为音乐检索哈希表的关键字(key)保存。为了查找方便,指纹通常会作为散列表的键值,键值指向的部分包括该指纹在音乐中出现的时间和该音乐ID。下面是一个例子:

如果对一个很大的音乐库都执行上面的指纹提取操作,我们就可以构造一个该音乐库对应的指纹库。

Shazam音频指纹提取算法相关推荐

  1. 飞利浦公司音频指纹识别算法解析

    飞利浦公司音频指纹识别算法解析 一个音频指纹系统通常包括两个部分:即一个计算听觉重要特征的指纹提取算法和一个在指纹数据库中进行有效搜索的比对算法.当要识别一段未知音频时,首先按照指纹提取算法计算其音频 ...

  2. shazam 音频指纹 听歌识曲 原理(附代码)

    shazam 音频指纹 听歌识曲 原理 如何用java来实现shazam? 几天以前我读了一篇论文 :How shazam works?(shazam的工作原理) 这让我有了自己写一个java版本的s ...

  3. 音频指纹的算法--飞利浦解决方案

    这个音频指纹暂时用来做同源音频聚类,判断歌曲是否是同一源的, 这里先介绍下飞利浦的方案-------A Highly Robust Audio Fingerprinting System,这个算法是在 ...

  4. 基于音频指纹的听歌识曲系统

    听歌识曲,我想大家都不陌生.虽然不同的厂商识别率不同(可能是因为版权的原因),但是每个音乐APP都会有这么一个功能.我们以扣扣音乐为例,扣扣音乐听歌识曲功能比较丰富,不仅有基本的听歌识曲还有哼唱识别, ...

  5. matlab音频基频的提取,(620512681) 自相关基频提取算法的MATLAB实现

    第31卷总第80期 西北民族大学学报(自然科学版) V01.31.No.4 1 0年1 2 0 2月 Journal of Nonhw铭t University for Nationalities(N ...

  6. wav2midi 音乐旋律提取算法 附可执行demo

    前面提及过,音频指纹算法的思路. 也梳理开源了两个比较经典的算法. https://github.com/cpuimage/shazam https://github.com/cpuimage/Aud ...

  7. 基于音频指纹技术的微信“摇一摇搜歌”和QQ音乐“听歌识曲”

    摘要: 逛商场时想知道广播里放的好听的歌是什么?听到音乐想跟着唱,想不起歌词怎么办?这些问题都通过微信"摇一摇搜歌"和QQ音乐"听歌识曲"帮您解决! 逛商场时想 ...

  8. RDKit|分子指纹提取、相似性比较及应用

    文章目录 一.分子指纹提取 1.Topological Fingerprints 2.MACCS 3.Atom Pairs and Topological Torsions 4.Morgan Fing ...

  9. 二进制SCA指纹提取黑科技:Go语言逆向技术

    摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...

最新文章

  1. 【图论专题】Floyd算法及其扩展应用
  2. Fiddler抓包使用教程-断点调试
  3. 趣谈网络协议笔记-二(第十六讲上)
  4. 从零开始编写一个vue插件
  5. 科普向--详解JavaScript中的数据类型
  6. 网页特效java代码,美化网页常用特效代码
  7. MyEclipse断点调试不可用解决办法
  8. 人工智障学习笔记——机器学习(8)K均值聚类
  9. jdbc 3种获得mysql插入数据的自增字段值的方法_JDBC 3种获得mysql插入数据的自增字段值的方法...
  10. Linux tmp目录自动清理 及解决方法
  11. 【SaaS】企业微信裂变系统引流变现系统产品介绍
  12. WINCC冗余、上位机冗余详细教程
  13. spring boot 2.1.4 hibernate 二级缓存 Caffeine实现
  14. 三维空间点到直线的距离C++实现
  15. php侧边客服,利用jquery实现网页侧边栏在线客服代码
  16. Java程序员面试宝典——重要习题整理
  17. 爬虫入门之查找JS入口篇
  18. 华为数通笔记-PPPoE
  19. 稳压二极管与TVS管
  20. win10右键 发送到 选项消失解决办法

热门文章

  1. 京东面试测试开发工程师
  2. 仿照网易新闻旧版本左拉的列表动画效果
  3. STC15系列单片机-PWM模块
  4. 断点-断点设置-断点作用-断点的类型
  5. 出入境检疫局办理健康证流程
  6. 代码中的符号表信息和stripp的用法
  7. 2008-07-11 11:54 K3 10.3版 登录时出现 定义的应用程序或对象错误 错误代码:1726(6BEH) 的解决方法
  8. 从键盘录入一个字符串,统计该串中有大写字母、小写字母、数字各有多少个。比如:Hello12345World大写:2个 小写:8个数字:5个。
  9. (java)IO流对象(六)集合Properties类、序列化流、反序列化流、打印流
  10. EasyVolley的使用