【发布时间】:2017-02-14 02:53:25
【问题描述】:
我想找到两个时间戳数组之间的偏移量。比如说,它们可以代表两个音轨中哔哔声的开始。
注意:任一曲目中可能有额外或缺失的起始点。
我发现了一些看起来很有希望的互相关信息(例如https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar)。
我假设每个音轨的持续时间为 10 秒,并将蜂鸣声的开始表示为采样率为 44.1 kHz 的“方波”的峰值:
import numpy as np
rfft = np.fft.rfft
irfft = np.fft.irfft
track_1 = np.array([..., 5.2, 5.5, 7.0, ...])
# The onset in track_2 at 8.0 is "extra," it has no
# corresponding onset in track_1
track_2 = np.array([..., 7.2, 7.45, 8.0, 9.0, ...])
frequency = 44100
num_samples = 10 * frequency
wave_1 = np.zeros(num_samples)
wave_1[(track_1 * frequency).astype(int)] = 1
wave_2 = np.zeros(num_samples)
wave_2[(track_2 * frequency).astype(int)] = 1
xcor = irfft(rfft(wave_1) * np.conj(rfft(wave_2)))
offset = xcor.argmax()
这种方法不是特别快,但即使频率很低,我也能得到相当一致的结果。但是...我不知道这是否是个好主意!有没有比互相关更好的方法来找到这个偏移量?
编辑:添加了关于缺失和额外发作的注释。
【问题讨论】:
-
您将
track_1和track_2显示为不规则间距,然后在构建wave_1和wave_2时将它们乘以frequency。track_1和track_2应该是您要关联的时间戳,还是应该是没有添加哔哔声的音频波形?或者他们是“哔”的开始时间? -
track_1和track_2是每次哔哔声的开始时间。wave_1和wave_2是 Dirac delta 函数的总和,用于查找互相关。
标签: python fft waveform cross-correlation