我之前找到过类似的帖子,但没有真正回答这个问题。
在我的指纹识别中,我生成了一个包含 5 个整数的记录集。例如: 33,42,88,121,194
这些对应于特定音乐样本中具有最高幅度的频率。 例如:对于 30 毫秒的音频样本,我有以下频率的桶:
0-40
40-80
80-120
120-180
180-250
我正在尝试生成一个散列(一个宽容的散列),它可能会为 33,42,88,121,194 就像说的那样
33,43,88,122,195
如果频率存在细微差异,则会形成类似的散列。
第一次是LSH?正如我所读到的,这最适合音频指纹识别。
如果没有,任何人都可以提供一些伪代码或 C# 来实现我正在寻找的功能吗?我已经阅读了 LSH、matlab 和 perl 的实现,但我不理解它们,因此发布指向它们的链接对我帮助不大。
再次感谢!
最佳答案
这可能是这个的副本:Compare two spectogram to find the offset where they match algorithm ,看起来您正在尝试做的是为样本中峰值的粗略分布生成直方图。有几种方法可以做到这一点,另一个“例子”在这里:Compare two spectogram to find the offset where they match algorithm
执行此操作的一种方法是使用峰值数据及其分布(随时间变化)的快速傅立叶变换,以生成蒸馏形式的样本的粗略等效。为此,您需要执行大致类似于以下操作的操作:
- 将样本分成一些离散的部分(比如 1 秒)
- 为每个样本部分开发一个近似于样本的指纹(比如取 5-7 个高峰和低峰,对其进行归一化,然后对其进行哈希处理
- 您现在可以单独保留每个指纹(在一个集合中),或者根据您的需要对序列运行转换以生成单个指纹。大多数情况下,您只需将序列附加在一起即可获得 1 秒间隔内的线性指纹。
要比较指纹,您对第二个样本运行相同的过程,然后使用 Diff 算法比较两者,使用一些“模糊”来确定它们的接近程度。您需要比较二维指纹、离散指纹的顺序以及每个样本的整体差异。
这篇关于制作类似于 Shazaam 的粗略 Java 的文章发表于前一段时间:http://www.redcode.nl/blog/2010/06/creating-shazam-in-java/可能对您有所帮助。
关于c# AudioFingerprinting 和局部敏感散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9028623/