对时间戳数组使用互相关有意义吗?

2024-05-11 03:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出两个时间戳数组之间的偏移量。它们可以代表,比方说,两个音轨中的哔哔声。在

注意:两个音轨中都可能有多余的或缺失的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()

这种方法不是特别快,但我能够得到相当一致的结果,即使在相当低的频率。然而。。。我不知道这是不是个好主意!有没有比互相关更好的方法来找到这种偏移呢?在

编辑:添加了关于缺失和额外设置的注释。在


Tags: infft信息npzerostrackwavearray
2条回答

如果track_1track_2是蜂鸣的时间戳,并且都捕捉到所有的蜂鸣音,那么就不需要构建波形并进行互相关。只需找出两个蜂鸣时间戳数组之间的平均延迟:

import numpy as np

frequency = 44100
num_samples = 10 * frequency
actual_time_delay = 0.020
timestamp_noise = 0.001

# Assumes track_1 and track_2 are timestamps of beeps, with a delay and noise added
track_1 = np.array([1,2,10000])
track_2 = np.array([1,2,10000]) + actual_time_delay*frequency + 
          frequency*np.random.uniform(-timestamp_noise,timestamp_noise,len(track_1))

calculated_time_delay = np.mean(track_2 - track_1) / frequency
print('Calculated time delay (s):',calculated_time_delay)

根据引入的随机错误,这将产生大约0.020s,并且速度快得差不多。在

编辑:如果需要处理额外的或丢失的时间戳,则可以按如下方式修改代码。本质上,如果时间戳随机性的误差是有界的,则对所有值之间的延迟执行统计“模式”函数。时间戳随机性范围内的任何东西都被聚集在一起并被识别,然后对原始识别的延迟进行平均。在

^{pr2}$

显然,如果太多的哔哔声丢失或存在额外的哔哔声,那么代码在某个点开始失败,但一般来说,它应该工作得很好,并且比尝试生成一个完整的波形和执行关联要快得多。在

是的,确实有道理。这通常在matlab中完成。以下是指向类似应用程序的链接:

http://www.mathworks.com/help/signal/ug/cross-correlation-of-delayed-signal-in-noise.html

几点考虑

当相关信号有太多噪声时,通常使用互相关。如果你不用担心噪音,我会用另一种方法。在

相关问题 更多 >