【发布时间】:2010-12-01 08:32:48
【问题描述】:
我有一个(大部分)工作程序来比较两个 wav 文件,看看较小的文件是否在较大的文件中。这是在 java 中完成的。
我首先确保两个 wav 文件都是规范波形格式。然后我使用 AudioInputStream 从它们中获取一个字节数组的数据。我以特定帧速率(例如现在:4096 字节)的块取出数据。我取较小输入的第一块,然后在较大输入中遍历相同大小的块。
我采用这些块并创建具有相同数据的双数组。我得到他们的 FFT 并使用相关函数在结果相关系数数组中找到一个峰值。然后我转到较小输入的下一部分,看看是否出现了类似的峰值。
这行得通,当文件相同时,峰值很明显,并且大多数时候结果都是正确的。我没有得到误报。然而,我确实得到了假阴性。
这是因为我不确定如何“对齐”数据。较小的文件可能来自较大文件中的任何点。大多数时候,这是通过我这样做的分块方法捕获的。但有时,就好像文件不同,没有找到峰值,尽管文件应该返回高相关性。
如果我取出一个误报(没有峰值)的文件,稍微调整一下,在它们的末尾或开头剪掉几千字节,然后再次运行程序,它会突然发现峰,这是一个非常明确的匹配。因此,它确实有效,只是以某种方式找不到相关性明显的峰值。我的相关函数翻译了 FFT 以使它们匹配,所以我认为这将涵盖所有内容,但显然我并没有涵盖所有数据。
我不确定如何将较小文件的块“对齐”到较大文件中的任何位置,以便相关函数能够确定相关发生的位置。一切正常,我只需要消除误报。有什么建议吗?
【问题讨论】: