在另一个WAV中找到WAV样本的出现?

时间:2009-05-15 19:31:05

标签: wav fft

如果知道那个精确的样本存在于wav的某个地方(但可能与其他声音混合在一起),那么FFT是否有可能在较长的wav中找到小wav样本的出现?

修改

(在收到两个回复之后):如果我有一个包含所有已知声音的库,可以在更大的WAV中,并希望在该WAV中找到每个声音的出现,该怎么办?换句话说,我知道每个可能的声音可以混合到大wav中,并希望找到它们的出现?

4 个答案:

答案 0 :(得分:4)

这取决于你想要找到的确切内容以及你想要找到它的内容。

  • 如果您正在寻找与大型WAV文件的大块相同的样本,那么您可以直接搜索这些值。
  • 如果声音完全相同,但不是样本准确(例如,将MP3的剪辑与同一首歌曲的WAV匹配),您可以使用cross-correlation轻松找到它。通过使用FFT方法而不是明确地对样本进行乘法和求和的“天真”方法,可以显着加速互相关。
  • 如果您正在寻找与其他声音混合的短样本,可能仍然可以使用互相关,但这取决于其他声音是否会影响匹配。对于具有简单样本且没有效果的数码钢琴,直接进入数字录音机,这可能会有效。
  • 如果声音经过任何类型的滤波,极性反转或相移,这将无法很好地工作,因为波形将会改变。因此,如果钢琴是通过扬声器播放然后用麦克风录制的,那么这不是一个可行的解决方案。

在这种情况下可能效果更好的是使用spectrogram(STFT)创建short-time Fourier transform录音,以及您正在寻找的事物的频谱图,然后再做一次两个图像的逐次互相关。频谱图是声音频谱随时间变化的幅度的二维图像,然后您可以匹配。 (这可能是一种迂回的做法,有更专业的算法,但我不知道它会被称为什么。);)

你可以在某处上传一些声音片段吗?

答案 1 :(得分:3)

我认为你并不是指准确的样本值。如果它是样本值精确的,那么搜索样本值将是一件简单的事情,这是快速有效的。

如果您正在寻找有贡献的声音,最好的方法是使用称为“卷积”的数学过程。基本上,将您尝试在大样本中找到的样本放在大样本旁边,并将其关联起来。对每个样本位置执行此操作。您将从中获得一条曲线,该曲线将在样本所在的位置具有明显的尖峰。它计算量很大,但计算机速度非常快,所以它很可行。

但是 - 假设样本来自两个案例的相同记录。从两个不同的位置拍摄鼓声,即使是相同的鼓声,也不会产生非常好的相关性。

希望有所帮助。

答案 2 :(得分:0)

如果它与其他声音混合在一起,并不完全如你所定义的那样,这就是原因;考虑与其反向精确混合的波的影响;结果反应平平。波的混合可以具有单调函数,即,以第一种不可恢复的方式有效地掩蔽一波与另一波。

也就是说,很可能有一种方法可以表征波的“签名”,使其很可能存在于合成波形文件中,但该签名将取决于波形文件的长度和某些波形文件的长度。预计将在何种类型的组合上进行。

你的问题可能与确定一件作品的样品是否存在于另一件作品中有关,复合作品。通常,是的,FFT可用于确定给定波的“签名”,并能够从另一个波中提取“签名”;它们对于某些东西是好的(例如频移;它只是在FFT上显示为位移),但对于其他东西则不那么好(变化的频率调制,对于一个;高(或不均匀)的原始带宽压缩信号)。换句话说:FFT是检测样本“天真”使用的好方法,但确定的重采样器可以修改原始样本,如果他知道这是使用的检测技术,则难以通过FFT检测。

答案 3 :(得分:0)

如果您知道样本的确切性质(位长等),则很有可能。如果它以任何方式改变,那么你将首先要做很多工作。

由于WAV文件的编码方式(按轨道顺序排列 - 因此您获得第一个轨道的第一批位,然后是第二个轨道的第一批位,然后是第一个轨道的第二批位) )

这显然可以重复多个曲目。如果您知道您要查找的WAV文件是专门在其中一个轨道中编码的,那么您可以隔离每个轨道并对它们执行操作。

显然,如果您的样本因速度,速度,音高等而不同,那么它将具有不同的位签名,因此您必须对轨道进行标准化。