我想找出两个时间戳数组之间的偏移量。它们可以代表,比方说,两个音轨中的哔哔声。在
注意:两个音轨中都可能有多余的或缺失的onsets。在
我发现了一些关于互相关(例如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
是蜂鸣的时间戳,并且都捕捉到所有的蜂鸣音,那么就不需要构建波形并进行互相关。只需找出两个蜂鸣时间戳数组之间的平均延迟:根据引入的随机错误,这将产生大约
0.020
s,并且速度快得差不多。在编辑:如果需要处理额外的或丢失的时间戳,则可以按如下方式修改代码。本质上,如果时间戳随机性的误差是有界的,则对所有值之间的延迟执行统计“模式”函数。时间戳随机性范围内的任何东西都被聚集在一起并被识别,然后对原始识别的延迟进行平均。在
^{pr2}$显然,如果太多的哔哔声丢失或存在额外的哔哔声,那么代码在某个点开始失败,但一般来说,它应该工作得很好,并且比尝试生成一个完整的波形和执行关联要快得多。在
是的,确实有道理。这通常在matlab中完成。以下是指向类似应用程序的链接:
http://www.mathworks.com/help/signal/ug/cross-correlation-of-delayed-signal-in-noise.html
几点考虑
当相关信号有太多噪声时,通常使用互相关。如果你不用担心噪音,我会用另一种方法。在
相关问题 更多 >
编程相关推荐