java - 使用 FFT 比较两个音频文件是唯一的方法吗?

标签 java audio mp3 fft wav

我是信号处理的新手,正在尝试使用 FFT 比较两个音频文件。 将文件读取为字节,然后转换为复数,然后将其发送到 fft。 然后计算复数的大小(fft 的输出)。试图比较大小但它们不匹配。

如果我遗漏了什么,请告诉我。

有没有其他方法可以比较两个音频文件?

最佳答案

一般来说,完整文件的 FFT 将不相等 - 考虑 40 秒。包含四个 10 秒的文件。分别为 20Hz、40Hz、60Hz 和 80Hz 的正弦波段。

整个文件的相应频谱将显示这四个频率的峰值,但任何 10 秒。摘录最多会有两个。因此,它们不匹配。

现在,您尝试做的事情听起来有点像 Shazam,幸运的是,他们已经发布了 a research paper关于它是如何工作的。也许这会解决您的问题。

对于另一种方法(尽管可能无法处理音调和速度变化),请考虑我上面示例的含义:您不应该尝试匹配超过 40 秒创建的频谱图。到仅代表 10 秒的时间。所以你必须找到第二个文件是从原始文件的哪个 10 秒片段中提取的。

要实现这一点,您可以使用一个简单的滑动窗口(从第 1 秒到第 10 秒的数据开始,然后是第 2 秒到第 11 秒,依此类推),或者您可以将第二个文件切成更小的 block ,然后合并初始文件使用来自 string searching 的技术的滑动窗口.

关于java - 使用 FFT 比较两个音频文件是唯一的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554212/

相关文章:

android - 如何配置 OpenSL 来录制语音通话

android - ExoPlayer AudioTrack 口吃

audio - 在每个片段的结尾立即加入mp3文件

java - 使用 Java 动态创建 MySQL 表列

javascript - webRTC如何判断是否有音频

java - Java中旋转指定列的4x4数组

java - 声音数据格式

python - 在 Windows(和 Linux)上播放各种音频的最佳 python 解决方案?

java - 如何读取文件到java列表?

java - 使用hibernate从表中获取数据